获取mp3文件的单个图像太慢



我正试图在手机上获取mp3文件的图像。我已经挣扎了几天,现在我知道了;

  • 首先,我使用了一个带有此代码的内容提供商

    `       Uri allSongsUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0";
    String[] projection = {
    MediaStore.Audio.Media.TITLE,
    MediaStore.Audio.Media.ARTIST,
    MediaStore.Audio.Media.DATA,
    MediaStore.Audio.Media.DISPLAY_NAME,
    MediaStore.Audio.Media.DURATION,
    MediaStore.Audio.Media.ALBUM,
    MediaStore.Audio.Media.ALBUM_ID,
    MediaStore.Audio.Media.ALBUM_KEY,
    MediaStore.Audio.Media.DATE_MODIFIED
    };
    String sortOrder = MediaStore.Video.Media.DATE_MODIFIED + " DESC";
    

    我这样创建我的光标;

    Cursor cursor = ctx.getContentResolver().query(allSongsUri, projection, null, null, sortOrder);

里面有我所有的mp3文件。没关系。现在我想看看他们的封面图片。

  • 如果我像这样使用MediaMetadataRetriver的getEmbeddedPicture方法

    mediaMetadataRetriever.setDataSource(localeMusic.getPath()); 
    localeMusic.setImage(mediaMetadataRetriever.getEmbeddedPicture());
    

    大约花了6-7秒,文件将近40-50个。因为getEmbeddedPicture()太慢!。

  • 我还试图获取album_id,并将另一个光标查询到MediaStore.Audio.Albums,我发现所有的相册id都是相同的,因为它们都是同一个文件夹。我不想显示他们的相册图像。我想展示文件的封面图片。我在这里试过了,但在那里,我们得到了文件相册的图像。我不是这么问的。

在哪里可以找到文件的图像路径?MetadataRetriever类在哪里可以使用getEmbeddedPicture获得它?嵌入的图片在哪里?

谢谢。向致以最良好的问候

mediaMetadataRetriever.getEmbeddedPicture()是一个本机方法,每个本机方法调用都有代价,因为JNI调用需要时间。因此,如果您重复这样的调用,您可能会损失很多时间。您可以尝试根据需要异步调用此方法并缓存结果。尝试与滑翔组合这将同时解决您的两个问题,glide调用自然是asnyc,所以您不需要实现AsyncTask类,它也会缓存您的图像。

这是基本的滑翔用法:

Glide.with(context).load(mediaMetadataRetriever.getEmbeddedPicture());

我鼓励你阅读滑翔文档。它还有很多其他功能。

希望这能有所帮助。

您可以获得这里提到的相册艺术

https://stackoverflow.com/a/17574629/3825975

基本上,

Cursor cursor = getContentResolver().query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, 
new String[] {MediaStore.Audio.Albums._ID, MediaStore.Audio.Albums.ALBUM_ART}, 
MediaStore.Audio.Albums._ID+ "=?", 
new String[] {String.valueOf(albumId)}, 
null);
if (cursor.moveToFirst()) {
String path = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART));
// do whatever you need to do
}

但为了获得个人歌曲艺术,我记得就是这样做的。希望它能有所帮助。

float ht_px = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 50, getResources().getDisplayMetrics());
float wt_px = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 50, getResources().getDisplayMetrics());
Bitmap artwork, bitmap2 = null;
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
byte[] rawArt;
BitmapFactory.Options bfo = new BitmapFactory.Options();
try {
mmr.setDataSource(songUri);  //songUri is the uri of the song. You need to extract this from the song id
rawArt = mmr.getEmbeddedPicture();
if (rawArt != null)
bitmap2 = BitmapFactory.decodeByteArray(rawArt, 0, rawArt.length, bfo);
if (bitmap2 == null)
bitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.def_icon);
artwork = Bitmap.createScaledBitmap(bitmap2, (int) ht_px, (int) wt_px, true);   //This is the bitmap you need
} catch (Exception e) {
//Exception handling
}
}

最新更新