【问题标题】:Android loadThumbnail Album Artwork (API 29)Android loadThumbnail 专辑插图 (API 29)
【发布时间】:2021-06-21 16:05:40
【问题描述】:

一段时间以来,我一直在尝试解决专辑封面问题,但目前还没有成功。

自 API 29 起,专辑插图 MediaStore 字段已被弃用 (docs)。

根据文档页面上的建议,我现在应该使用 loadThumbnail 方法,我一直在尝试这样做。不幸的是,我无法使用 loadThumbnail 函数来加载专辑插图,我只看到它适用于来自 “MediaStore.Images.Media.EXTERNAL_CONTENT_URI”,它似乎不包含所有专辑,也没有使用 ID 映射到它们的方法。

这是我目前的尝试,似乎还没有奏效。有没有人使用新的 loadThumbnail 方法成功加载专辑封面?我正在使用 Google Pixel 3a 进行测试。

获取光标:

    return mContext.getContentResolver().query(
            MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
            {
                MediaStore.Audio.Media._ID, MediaStore.Audio.Media.TRACK,
                MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.ALBUM,
                MediaStore.Audio.Media.DURATION, MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.YEAR,
                MediaStore.Audio.Media.COMPOSER, MediaStore.Audio.Albums.ALBUM_ID
            },
            MediaStore.Audio.Media._ID + "=?",
            new String[]{String.valueOf(id)},
            null);

提取专辑ID:

cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ALBUM_ID)),

构建 uri 以加载缩略图:

        Uri contentUri = ContentUris.withAppendedId(
                MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,
//                MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                albumId
        );

        return resolver.loadThumbnail(contentUri, new Size(640, 480), null);

提供的错误:

java.io.FileNotFoundException: No media for album content://media/external/audio/albums/1145137507

【问题讨论】:

标签: android


【解决方案1】:

看来我找到了可行的解决方案:

光标:

Cursor images = resolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                    new String[]{MediaStore.Audio.Media.ALBUM_ID},
                    null, null, null);

列:

long id = images.getLong(images.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID));

获取位图:

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private Bitmap getAlbumArtwork(ContentResolver resolver, long albumId) throws IOException {
    Uri contentUri = ContentUris.withAppendedId(
            MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,
            albumId
    );

    return resolver.loadThumbnail(contentUri, new Size(640, 480), null);
}

【讨论】:

  • 据我了解,正确的列索引是“_ID”,因为几年前“ALBUM_ID”已被弃用。就我而言,我必须提供“MediaStore.Audio.Albums._ID”。
  • 我在 Android 11 上测试过,效果很好。谢谢
【解决方案2】:

获取 Andriod Studio 最新 4.2.x 和 targetSdkVersion 到 30

Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    String[] projection = {MediaStore.Audio.AudioColumns.DATA,
            MediaStore.Audio.AudioColumns.TITLE ,
            MediaStore.Audio.AudioColumns.ALBUM,
            MediaStore.Audio.ArtistColumns.ARTIST,
            MediaStore.Audio.AudioColumns.ALBUM_ID};
    Cursor c = getContentResolver().query(uri, projection, null, null, null);

    if (c != null) {
        while (c.moveToNext()) {
            SongTrack songTracks = new SongTrack();
            MediaItem mediaItem = new MediaItem();
            String path = c.getString(0);   // Retrieve path.
            String name = c.getString(1);   // Retrieve name.
            String album = c.getString(2);  // Retrieve album name.
            String artist = c.getString(3); // Retrieve artist name.
            Long albumID=c.getLong(4);

            songTracks.setSongTitle(name);
            songTracks.setSongFilePath(path);
            songTracks.setAlbumartPath("content://media/external/audio/albumart/"+albumID.toString());
            songTracks.setArtist(artist);
            songTracks.setAlbumName(album); 
  Glide.with(getContext()).load(imgFilePath).placeholder(R.drawable.missed).into(tracksAlbumArt);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多