查询相册艺术总是返回No entry forcontent://media/external/audio/albumar



所以我已经尝试了一段时间。要获取mp3文件的相册艺术并将其显示在其各自的ImageView上,我正在使用uri("content://media/external/audio/albumart")

这是我获得相册艺术的方法

    public Bitmap getAlbumArt(long idAlbum){
    Bitmap bitmap = null;
    try{
        final Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart");
        Uri uri = ContentUris.withAppendedId(sArtworkUri, idAlbum);
        ParcelFileDescriptor parcelFileDescriptor = getContext().getContentResolver().openFileDescriptor(uri,"r");
        if (parcelFileDescriptor != null){
            FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
            bitmap = BitmapFactory.decodeFileDescriptor(fileDescriptor);
        }
    }catch (Exception e){
        e.printStackTrace();
    }
    return bitmap;
    } 

并且该方法总是返回

java.io.FileNotFoundException: No entry for content://media/external/audio/albumart/31726

其中31726是相册id。

由于我发现了这个异常,如果它返回null,我会将其设置为默认相册艺术,因此每个mp3都将其ImageView设置为默认专辑艺术。我正在使用我的三星Galaxy s3运行应用程序,我的设备运行android 4.2.2 JellyBean。请有人帮我把这件事做好。

这就是我请求相册id 的方式

    Uri musicUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    String[] columns = {
            MediaStore.Audio.Media.TITLE,
            MediaStore.Audio.Media.ARTIST,
            MediaStore.Audio.Albums._ID,
            MediaStore.Audio.Media.DATA
    };
    String where = MediaStore.Audio.Media.IS_MUSIC + "=1";
    Cursor musicCursor = usicResolver.query(musicUri,columns,where,null,    null);

然后在条件的if循环中

    if(musicCursor.moveToFirst()){
    int albumId = musicCursor.getColumnIndex
                (MediaStore.Audio.Albums._ID);
    do{
          long idAlbum = musicCursor.getLong(albumId);
          //Then i send it to my above method getAlbumArt
          Bitmap songAlbumArt = getAlbumArt(idAlbum);
      }while(musicCursor.moveToNext());
     }

这就是我从相册id:查询封面艺术路径的方式

private static String getCoverArtPath(long albumId, Context context) {
    Cursor albumCursor = context.getContentResolver().query(
            MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,
            new String[]{MediaStore.Audio.Albums.ALBUM_ART},
            MediaStore.Audio.Albums._ID + " = ?",
            new String[]{Long.toString(albumId)},
            null
    );
    boolean queryResult = albumCursor.moveToFirst();
    String result = null;
    if (queryResult) {
        result = albumCursor.getString(0);
    }
    albumCursor.close();
    return result;
}

您可以使用从上述方法返回的路径从BitmapFactory获取位图:

BitmapFactory.decodeFile(coverArtPath);
ImageLoader.getInstance().
    displayImage( ContentUris.withAppendedId(Uri.parse("content://media/external/audio/albumart"), song_tag.albumId).toString(),
            image,
            new DisplayImageOptions.Builder().cacheInMemory(true).showImageOnFail(R.drawable.stock6).resetViewBeforeLoading(true).build());

image是ImageView 的对象

song_tag.albumid是您必须发送才能获得图像的相册id

stock6是默认图像

编辑:

API 29中似乎不赞成使用ALBUM_ART:https://developer.android.com/reference/android/provider/MediaStore.Audio.AlbumColumns#ALBUM_ART

相反,他们建议使用ContentResolver#loadThumbnail:https://developer.android.com/reference/android/content/ContentResolver#loadThumbnail(android.net.Uri,%20android.util.Size,%20android.os.CancellationSignal)

--

原件:

从查询相册艺术字段content://media/external/audio/albums不久前我会为我做这件事,但我注意到,由于某种原因,它从几个安卓版本前就停止了工作。

现在我查询相册表得到一个空的相册艺术字段:

adb shell content query --uri content://media/external/audio/albums
Row: 0 numsongs=1, artist=My Artist, numsongs_by_artist=1, _id=8821305607184940112, album=My Album, album_art=NULL, album_key=4c3a3434044e5052303a4604342a3e32044248194e, artist_id=7053871990187004266, artist_key=484c465046503832464c2a04422a402a563a32444e3a4e, maxyear=NULL, minyear=NULL, album_id=8821305607184940112

直接查询相册艺术路线,也没有结果。。。

adb shell content query --uri content://media/external/audio/albumart
No result found.

似乎平台侧的MediaStore。。。停止尝试从音乐文件中解析专辑艺术,并将其添加到数据库中?

最新更新