如何解决无法在 Android 10 上获取播放列表中的曲目
我正在尝试获取播放列表的列表以及在安装了 Android 10 的设备上每个播放列表中有多少个大头钉。我正在使用 compileSdkVersion = targetSdkVersion = 30。我正在请求 READ_EXTERNAL_STORAGE,这似乎是必要的。
我以前从未尝试过,但这似乎很简单:获取播放列表的光标并使用该播放列表的 _id,然后将光标置于曲目上。
就获取名称和数据(位置)而言,它按预期工作,但它始终为 _id 返回 1,并且找不到任何轨道(即 cursor.getCount() 为零)。文件不为空。我可能有一个愚蠢的错误,但我没有看到。
2021 年 7 月 22 日添加:只有 5 个列名返回 *:date_modified、_id、name、_data、date_ added。除了 _id 之外的所有值都是正确的(或至少是合理的)。 _id (MediaStore.Audio.Playlists._ID) 始终为 1。
这是代码:
private void showPlaylists() {
StringBuilder sb = new StringBuilder();
sb.append("\nPlaylists\n");
Uri collection;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
collection = MediaStore.Audio.Playlists.getContentUri(MediaStore.VOLUME_EXTERNAL);
} else {
collection = MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI;
}
String name,data;
long id;
// External
try (Cursor playListCursor =
this.getContentResolver().query(
collection,null,null)) {
if (playListCursor == null) {
sb.append("Cannot access external playlists\n");
return;
}
for (int i = 0; i < playListCursor.getCount(); i++) {
playListCursor.movetoPosition(i);
name = playListCursor.getString(
playListCursor.getColumnIndex("name"));
sb.append(i).append(" ").append(name).append("\n");
// This is apparently the path
data = playListCursor.getString(
playListCursor.getColumnIndex(MediaStore.Audio.Media.DATA));
sb.append(" ").append(data).append("\n");
id = playListCursor.getColumnIndex(MediaStore.Audio.Playlists._ID);
sb.append(" id=").append(id).append("\n");
// Get the playlist from the id
String[] projection = null; // All columns
try (Cursor cursor =
this.getContentResolver().query(MediaStore
.Audio.Playlists.Members.getContentUri
("external",id),projection,null)) {
if (cursor == null) {
sb.append(" Cannot get contents\n");
} else {
sb.append(" Tracks: ").append(cursor.getCount())
.append("\n");
}
} catch (Exception ex) {
String msg = " Error getting playlist " + i;
Log.e(TAG,msg,ex);
}
}
} catch (Exception ex) {
String msg = "Error getting external playlists";
Utils.excMsg(this,ex);
Log.e(TAG,ex);
}
Log.e(TAG,sb.toString());
}
这是Logcat中的输出:
0 Carmen Cavallero
/storage/3535-6434/Playlists/Carmen Cavallero.m3u
id=1
Tracks: 0
1 Chris Botti
/storage/3535-6434/Playlists/Chris Botti.m3u
id=1
Tracks: 0
2 Diana Krall
/storage/3535-6434/Playlists/Diana Krall.m3u
id=1
Tracks: 0
3 Dinner Party
/storage/3535-6434/Playlists/Dinner Party.m3u
id=1
Tracks: 0
4 Meditation 1
/storage/3535-6434/Playlists/Meditation 1.m3u
id=1
Tracks: 0
5 Romance
/storage/3535-6434/Playlists/Romance.m3u
id=1
Tracks: 0
6 Tablet
/storage/3535-6434/Playlists/Tablet.m3u
id=1
Tracks: 0
7 Jean Sidwell
/storage/3535-6434/Playlists/Jean Sidwell.m3u
id=1
Tracks: 0
8 Bill Evans MM2
/storage/3535-6434/Playlists/Bill Evans MM2.m3u
id=1
Tracks: 0
9 Selena
/storage/3535-6434/Playlists/Selena.m3u
id=1
Tracks: 0
解决方法
您可以尝试为 android 10 申请 MANAGE_EXTERNAL_STORAGE
权限。
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
有关详细信息,请查看Docs。
,这是我的方法
public Uri get_audio_playlist_members_uri(Long playlist_id){
if(playlist_id==null){
playlist_id= 0L;
}
Uri uri_to_use = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
uri_to_use = MediaStore.Audio.Playlists.getContentUri(MediaStore.VOLUME_EXTERNAL)
.buildUpon()
.appendEncodedPath(Long.toString(playlist_id))
.appendEncodedPath("members")
.build();
} else {
uri_to_use = MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI
.buildUpon()
.appendEncodedPath(Long.toString(playlist_id))
.appendEncodedPath("members")
.build();
}
return uri_to_use;
}
public Cursor getPlaylistTracks(Context context,Long playlist_id) {
if (context != null) {
Uri newuri = uris.get_audio_playlist_members_uri(playlist_id);
ContentResolver resolver = context.getContentResolver();
String _id = MediaStore.Audio.Playlists.Members._ID;
String audio_id = MediaStore.Audio.Playlists.Members.AUDIO_ID;
String artist = MediaStore.Audio.Playlists.Members.ARTIST;
String album = MediaStore.Audio.Playlists.Members.ALBUM;
String album_id = MediaStore.Audio.Playlists.Members.ALBUM_ID;
String title = MediaStore.Audio.Playlists.Members.TITLE;
String duration = MediaStore.Audio.Playlists.Members.DURATION;
String location = MediaStore.Audio.Playlists.Members.DATA;
String composer = MediaStore.Audio.Playlists.Members.COMPOSER;
String playorder = MediaStore.Audio.Playlists.Members.PLAY_ORDER;
String date_modified = MediaStore.Audio.Playlists.Members.DATE_MODIFIED;
String[] columns = {_id,audio_id,artist,album_id,album,title,duration,location,date_modified,playorder,composer};
try {
return resolver.query(newuri,columns,null,null);
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
,
答案是我正在使用:
id = playListCursor.getColumnIndex(MediaStore.Audio.Playlists._ID));
而不是:
id = playListCursor.getLong(playListCursor.getColumnIndex(MediaStore.Audio.Playlists._ID));
我的错误。对不起。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。