Как получить миниатюру видео из URI контента? [закрыто]Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как получить миниатюру видео из URI контента? [закрыто]

Сообщение Anonymous »

Что я пытаюсь сделать?
Я работаю над приложением для обмена файлами, где есть экран со списком видео, и я просто хочу показать миниатюру видео. Я использую компоновку Jetpack и использую библиотеку катушек.

Этот список видео содержит URI контента ( content:// ), а не URI файла или что-то еще.

Что я уже пробовал?
  • Я пытаюсь использовать версию библиотеки катушек Coil - Video специально для URI видео, и это работает, но загрузка видео в список занимает много времени, что неэффективно.
  • Затем я пытаюсь получить BitMap из URI контента, используя MediaMetadataRetriever . Но иногда это работает и не работает. Это занимает много времени, а также приводит к сбою приложения, и я не хочу его использовать.
  • Я пытаюсь использовать метод loadThumbnail в contentResolver, который иногда работает, а иногда нет, а также занимает много времени.
  • MediaStore.Video.Thumbnails.getThumbnail(), но он устарел и не работает все.
Пример кода, который я сказал выше:

Код: Выделить всё

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()
}
}
}
Вопрос
Каков правильный способ загрузки или создания миниатюры из URI контента?

Подробнее здесь: https://stackoverflow.com/questions/798 ... ontent-uri
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»