专辑封面未出现在我的 RecyclerView 中
Album art not appearing in my RecyclerView
我想显示我内部存储中的歌曲列表以及专辑封面。我正在使用此代码加载列表中的歌曲。
private void getSongsList() {
final Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
final String[] cursor_cols = { MediaStore.Audio.Media._ID,
MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.ALBUM,
MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.DATA,
MediaStore.Audio.Media.ALBUM_ID,
MediaStore.Audio.Media.DURATION };
final String where = MediaStore.Audio.Media.IS_MUSIC + "=1";
final Cursor cursor = getActivity().getContentResolver().query(uri,
cursor_cols, where, null, null);
if(cursor != null && cursor.moveToFirst()) {
do {
String artist = cursor.getString(cursor
.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
String album = cursor.getString(cursor
.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));
String songName = cursor.getString(cursor
.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
String data = cursor.getString(cursor
.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
long albumId = cursor.getLong(cursor
.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID));
int duration = cursor.getInt(cursor
.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));
Uri sArtworkUri = Uri
.parse("content://media/external/audio/albumart");
Uri albumArtUri = ContentUris.withAppendedId(sArtworkUri, albumId);
songsList.add(new SongData(songName, artist, data, album, albumArtUri, duration));
}while (cursor.moveToNext());
cursor.close();
Collections.sort(songsList, new Comparator<SongData>(){
public int compare(SongData a, SongData b){
return a.getSongName().compareTo(b.getSongName());
}
});
}
}
我正在使用 Glide 将图像加载到我的图像视图中
SongData sd = list.get(position);
Glide.with(context)
.load(sd.getAlbumArtUri())
.apply(new RequestOptions()
.placeholder(R.drawable.ic_music))
.into(holder.albumArt);
问题是我的所有歌曲都显示在我的 RecyclerView 中,但不是专辑封面而是我的占位符图像。没有一首歌有专辑封面。为了确保我的歌曲有与之关联的专辑封面,我使用了另一个音乐播放器应用程序,并且我的歌曲专辑封面正在显示我的代码有什么问题?
试试这个
Glide.with(context)
.load(new File(sd.getAlbumArtUri().getPath())) // path of the album art
.transform(new RequestOptions()
.placeholder(R.drawable.ic_music))
.into(holder.albumArt);
经过大量的试验和错误,我终于成功了。上面代码的错误如下
java.lang.SecurityException(External path: /storage/emulated/0/Android/data/com.android.providers.media/albumthumbs/1525023642395: Neither user 10108 nor current process has android.permission.WRITE_EXTERNAL_STORAGE.)
Uri 正在将 content://media/external/audio/albumart
解析到外部目录 /storage/emulated/0/Android/data/com.android.providers.media/albumthumbs/
目录,并将专辑封面从数据库写入或缓存到设备存储,但它没有任何写入权限。
所以只要授予写存储权限就可以了
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
同时请求 API >= 23 的权限。您也可以去验证缓存在内部存储目录中的专辑封面
Android/data/com.android.providers.media/albumthumbs/
我想显示我内部存储中的歌曲列表以及专辑封面。我正在使用此代码加载列表中的歌曲。
private void getSongsList() {
final Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
final String[] cursor_cols = { MediaStore.Audio.Media._ID,
MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.ALBUM,
MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.DATA,
MediaStore.Audio.Media.ALBUM_ID,
MediaStore.Audio.Media.DURATION };
final String where = MediaStore.Audio.Media.IS_MUSIC + "=1";
final Cursor cursor = getActivity().getContentResolver().query(uri,
cursor_cols, where, null, null);
if(cursor != null && cursor.moveToFirst()) {
do {
String artist = cursor.getString(cursor
.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
String album = cursor.getString(cursor
.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));
String songName = cursor.getString(cursor
.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
String data = cursor.getString(cursor
.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
long albumId = cursor.getLong(cursor
.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID));
int duration = cursor.getInt(cursor
.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));
Uri sArtworkUri = Uri
.parse("content://media/external/audio/albumart");
Uri albumArtUri = ContentUris.withAppendedId(sArtworkUri, albumId);
songsList.add(new SongData(songName, artist, data, album, albumArtUri, duration));
}while (cursor.moveToNext());
cursor.close();
Collections.sort(songsList, new Comparator<SongData>(){
public int compare(SongData a, SongData b){
return a.getSongName().compareTo(b.getSongName());
}
});
}
}
我正在使用 Glide 将图像加载到我的图像视图中
SongData sd = list.get(position);
Glide.with(context)
.load(sd.getAlbumArtUri())
.apply(new RequestOptions()
.placeholder(R.drawable.ic_music))
.into(holder.albumArt);
问题是我的所有歌曲都显示在我的 RecyclerView 中,但不是专辑封面而是我的占位符图像。没有一首歌有专辑封面。为了确保我的歌曲有与之关联的专辑封面,我使用了另一个音乐播放器应用程序,并且我的歌曲专辑封面正在显示我的代码有什么问题?
试试这个
Glide.with(context)
.load(new File(sd.getAlbumArtUri().getPath())) // path of the album art
.transform(new RequestOptions()
.placeholder(R.drawable.ic_music))
.into(holder.albumArt);
经过大量的试验和错误,我终于成功了。上面代码的错误如下
java.lang.SecurityException(External path: /storage/emulated/0/Android/data/com.android.providers.media/albumthumbs/1525023642395: Neither user 10108 nor current process has android.permission.WRITE_EXTERNAL_STORAGE.)
Uri 正在将 content://media/external/audio/albumart
解析到外部目录 /storage/emulated/0/Android/data/com.android.providers.media/albumthumbs/
目录,并将专辑封面从数据库写入或缓存到设备存储,但它没有任何写入权限。
所以只要授予写存储权限就可以了
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
同时请求 API >= 23 的权限。您也可以去验证缓存在内部存储目录中的专辑封面
Android/data/com.android.providers.media/albumthumbs/