无法在 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
dzc361 回答:无法在 Android 10 上获取播放列表中的曲目

您可以尝试为 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));

我的错误。对不起。

本文链接:https://www.f2er.com/63132.html

大家都在问