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.
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? [list] [*]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 [b]MediaMetadataRetriever[/b] 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..
[*][b]MediaStore.Video.Thumbnails.getThumbnail()[/b], aber es ist veraltet und funktioniert überhaupt nicht.
[/list] Codebeispiel, was ich oben gesagt habe: [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] Was ich will? Ich möchte nur eine effiziente, absturzfreie und optimale Lösung zum Abrufen von Miniaturansichten aus Video-URI.
In meiner App soll der Benutzer eine Audiodatei auswählen, die die App dann übernimmt. Das Problem ist, dass ich damit, dass die App das tut, was ich mit den Audiodateien zu tun habe, das URI im...
Wenn ich ContentResolver.query() unter Android verwende, um den Anzeigenamen eines Inhalts-URI herauszufinden, muss ich unterschiedliche Projektionen verwenden, je nachdem, ob es sich bei dem URI um...
Wenn ich ContentResolver.query() unter Android verwende, um den Anzeigenamen eines Inhalts-URI herauszufinden, muss ich unterschiedliche Projektionen verwenden, je nachdem, ob es sich bei dem URI um...
Wenn ich ContentResolver.query() unter Android verwende, um den Anzeigenamen eines Inhalts-URI herauszufinden, muss ich unterschiedliche Projektionen verwenden, je nachdem, ob es sich bei dem URI um...
Wenn ich ContentResolver.query() unter Android verwende, um den Anzeigenamen eines Inhalts-URI herauszufinden, muss ich unterschiedliche Projektionen verwenden, je nachdem, ob es sich bei dem URI um...