0

我正在尝试在手机上获取 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());
    

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

  • 还尝试获取album_id 并将另一个光标查询到MediaStore.Audio.Albums,我看到所有专辑ID 都是相同的,因为它们都是同一个文件夹。我不想显示他们的专辑图片。我想显示文件的封面图片。我在这里尝试过但是在那里,我们正在获取文件的专辑图像。那不是我问的。

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

谢谢。此致

4

2 回答 2

1

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

这是基本的滑行用法:

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

我鼓励您阅读 glide文档。它还有很多其他功能。

希望这可以帮助。

于 2018-10-13T19:03:01.767 回答
0

您可以获得此处提到的专辑封面

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
        }
    }
于 2018-10-13T19:11:10.300 回答