Что я пытаюсь сделать?
Я работаю над приложением для обмена файлами, где есть экран со списком видео, и я просто хочу показать миниатюру видео. Я использую компоновку Jetpack и использую библиотеку катушек.
Этот список видео содержит URI контента ( content:// ), а не URI файла или что-то еще.
Что я уже пробовал?
Я пытаюсь использовать версию библиотеки катушек Coil - Video специально для URI видео, и это работает, но загрузка видео в список занимает много времени, что неэффективно.
Затем я пытаюсь получить BitMap из URI контента, используя MediaMetadataRetriever . Но иногда это работает и не работает. Это занимает много времени, а также приводит к сбою приложения, и я не хочу его использовать.
Я пытаюсь использовать метод loadThumbnail в contentResolver, который иногда работает, а иногда нет, а также занимает много времени.
MediaStore.Video.Thumbnails.getThumbnail(), но он устарел и не работает все.
Что я пытаюсь сделать? Я работаю над приложением для обмена файлами, где есть экран со списком видео, и я просто хочу показать миниатюру видео. Я использую компоновку Jetpack и использую библиотеку катушек.
Этот список видео содержит URI контента ( content:// ), а не URI файла или что-то еще.
Что я уже пробовал? [list] [*]Я пытаюсь использовать версию библиотеки катушек Coil - Video специально для URI видео, и это работает, но загрузка видео в список занимает много времени, что неэффективно.
[*]Затем я пытаюсь получить BitMap из URI контента, используя [b]MediaMetadataRetriever[/b] . Но иногда это работает и не работает. Это занимает много времени, а также приводит к сбою приложения, и я не хочу его использовать.
[*]Я пытаюсь использовать метод loadThumbnail в contentResolver, который иногда работает, а иногда нет, а также занимает много времени.
[*][b]MediaStore.Video.Thumbnails.getThumbnail()[/b], но он устарел и не работает все.
[/list] Пример кода, который я сказал выше: [code]private val semaphore = Semaphore(2) // It needed else app crash because i used async load of thumbnail.
// Here content:// type uri come not file:// or else. suspend fun getImageVideoThumbnail( context: Context, uri: Uri, size: Size = Size(200, 200) ): Bitmap? = withContext(Dispatchers.IO) { var bitmap: Bitmap? = null val cr = context.contentResolver try { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { bitmap = cr.loadThumbnail(uri, size, null) } else { cr.query(uri, null, null, null, null)?.use { cursor -> val idCol = cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID) while (cursor.moveToNext()) { val id = cursor.getLong(idCol) bitmap = MediaStore.Video.Thumbnails.getThumbnail( cr, id, MediaStore.Video.Thumbnails.MINI_KIND, null ) break } } } bitmap } catch (e: Exception) { // e.printStackTrace() getFrame(context , uri , size) } }
suspend fun getFrame(context: Context, uri: Uri , size : Size): Bitmap? = withContext(Dispatchers.IO) { semaphore.withPermit { val retriever = MediaMetadataRetriever() try { retriever.setDataSource(context, uri) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { retriever.getScaledFrameAtTime( 0, MediaMetadataRetriever.OPTION_CLOSEST_SYNC, size.width, size.height ) } else { retriever.frameAtTime?.let { src -> src.scale(size.width, size.height).also { src.recycle() } } } } catch (e: Exception) { null } finally { retriever.release() } } } [/code] Вопрос Каков правильный способ загрузки или создания миниатюры из URI контента?