Android ContentResolver 不加载 Song-Titles
Android ContentResolver doesn't load the Song-Titles
我的应用程序应该从存储在设备存储中的歌曲中加载 Media-Tags,但显示的名称是 File-Names 而不是 Title-Tags!
我的代码:
List<Song> SongList = new ArrayList<>();
ContentResolver musicResolver = mContext.getContentResolver();
Uri musicUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Cursor cSong = musicResolver.query(musicUri, null, null, null, null);
int iIDCol = cSong.getColumnIndex(MediaStore.Audio.Media._ID);
int iTitleCol = cSong.getColumnIndex(MediaStore.Audio.Media.TITLE);
int iArtistCol = cSong.getColumnIndex(MediaStore.Audio.Media.ARTIST);
int iAlbumCol = cSong.getColumnIndex(MediaStore.Audio.Media.ALBUM);
int iDurationCol = cSong.getColumnIndex(MediaStore.Audio.Media.DURATION);
int iAlbumIDCol = cSong.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID);
int iDataCol = cSong.getColumnIndex(MediaStore.Audio.Media.DATA);
if (cSong != null && cSong.moveToFirst()) {
do {
String sArtist = cSong.getString(iArtistCol);
String sAlbum = cSong.getString(iAlbumCol);
if (sArtist.equals(MediaStore.UNKNOWN_STRING)) {
sArtist = mContext.getResources().getString(R.string.UnknownArtist);
}
if (sAlbum.equals(MediaStore.UNKNOWN_STRING)) {
sAlbum = mContext.getResources().getString(R.string.UnknownAlbum);
}
SongList.add(new Song(cSong.getLong(iIDCol), cSong.getLong(iAlbumIDCol), cSong.getString(iTitleCol), sArtist, sAlbum, cSong.getInt(iDurationCol), cSong.getString(iDataCol)));
}
while (cSong.moveToNext());
}
cSong.close();
#Selfie 显示正确,因为文件名等于 Song-Title,但其他显示不正确!
编辑:
我检查过只有非 MP3 文件才会导致问题!我该如何解决这个问题?
希望你能帮帮我!
谢谢!
您可以使用MediaMetadataRetriever
获取标题等:
String data = cursor.getString(iDataCol)
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(data);
String title = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);
您也可以获得艺术家和专辑
我认为问题是您没有为 getContentResolver.query() 方法设置投影参数
试试这个
ContentResolver musicResolver = getContentResolver();
Uri musicUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Cursor cSong = musicResolver.query(musicUri,new String[]{MediaStore.Audio.Media.TITLE,MediaStore.Audio.Media.DATA},null,null,null);
我的应用程序应该从存储在设备存储中的歌曲中加载 Media-Tags,但显示的名称是 File-Names 而不是 Title-Tags!
我的代码:
List<Song> SongList = new ArrayList<>();
ContentResolver musicResolver = mContext.getContentResolver();
Uri musicUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Cursor cSong = musicResolver.query(musicUri, null, null, null, null);
int iIDCol = cSong.getColumnIndex(MediaStore.Audio.Media._ID);
int iTitleCol = cSong.getColumnIndex(MediaStore.Audio.Media.TITLE);
int iArtistCol = cSong.getColumnIndex(MediaStore.Audio.Media.ARTIST);
int iAlbumCol = cSong.getColumnIndex(MediaStore.Audio.Media.ALBUM);
int iDurationCol = cSong.getColumnIndex(MediaStore.Audio.Media.DURATION);
int iAlbumIDCol = cSong.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID);
int iDataCol = cSong.getColumnIndex(MediaStore.Audio.Media.DATA);
if (cSong != null && cSong.moveToFirst()) {
do {
String sArtist = cSong.getString(iArtistCol);
String sAlbum = cSong.getString(iAlbumCol);
if (sArtist.equals(MediaStore.UNKNOWN_STRING)) {
sArtist = mContext.getResources().getString(R.string.UnknownArtist);
}
if (sAlbum.equals(MediaStore.UNKNOWN_STRING)) {
sAlbum = mContext.getResources().getString(R.string.UnknownAlbum);
}
SongList.add(new Song(cSong.getLong(iIDCol), cSong.getLong(iAlbumIDCol), cSong.getString(iTitleCol), sArtist, sAlbum, cSong.getInt(iDurationCol), cSong.getString(iDataCol)));
}
while (cSong.moveToNext());
}
cSong.close();
#Selfie 显示正确,因为文件名等于 Song-Title,但其他显示不正确!
编辑:
我检查过只有非 MP3 文件才会导致问题!我该如何解决这个问题?
希望你能帮帮我!
谢谢!
您可以使用MediaMetadataRetriever
获取标题等:
String data = cursor.getString(iDataCol)
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(data);
String title = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);
您也可以获得艺术家和专辑
我认为问题是您没有为 getContentResolver.query() 方法设置投影参数
试试这个
ContentResolver musicResolver = getContentResolver();
Uri musicUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Cursor cSong = musicResolver.query(musicUri,new String[]{MediaStore.Audio.Media.TITLE,MediaStore.Audio.Media.DATA},null,null,null);