Wie erhalte ich ein Video-Miniaturbild von der Inhalts-URI?Android

Forum für diejenigen, die für Android programmieren
Anonymous
 Wie erhalte ich ein Video-Miniaturbild von der Inhalts-URI?

Post by Anonymous »

Was versuche ich zu tun?
Ich arbeite an einer Dateifreigabe-App, auf der ein Bildschirm mit einer Liste der Videos angezeigt wird und ich nur die Miniaturansicht des Videos anzeigen möchte. Ich verwende Jetpack Compose und verwende die Coil-Bibliothek.

Diese Videoliste enthält Inhalts-URI (content://), keine Datei-URI oder anderes.

Was ich bereits versucht habe?
  • Ich versuche, die Coil-Video-Version der Coil-Bibliothek speziell für Video-URI zu verwenden, und es funktioniert, aber das Laden des Videos in die Liste dauert zu lange ineffizient.
  • Dann versuche ich, BitMap aus der Inhalts-URI abzurufen, indem ich MediaMetadataRetriever verwende. Aber es funktioniert manchmal und nicht. Nehmen Sie sich zu viel Zeit und stürzen Sie auch die App ab, und was ich nicht verwenden möchte.
  • Ich versuche, die Methode „loadThumbnail“ von contentResolver zu verwenden, die manchmal funktioniert und manchmal nicht und auch zu viel Zeit in Anspruch nimmt..
  • MediaStore.Video.Thumbnails.getThumbnail(), aber es ist veraltet und funktioniert überhaupt nicht.
Codebeispiel, was ich oben gesagt habe:

Code: Select all

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()
}
}
}
Was ich will?
Ich möchte nur eine effiziente, absturzfreie und optimale Lösung zum Abrufen von Miniaturansichten aus Video-URI.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post