首页 > 解决方案 > 无法在 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, 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, null, 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, msg, ex);
        Log.e(TAG, msg, 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

标签: androidaudiomediaplaylist

解决方案


答案是我正在使用:

            id = playListCursor.getColumnIndex(MediaStore.Audio.Playlists._ID));

而不是:

            id = playListCursor.getLong(playListCursor.getColumnIndex(MediaStore.Audio.Playlists._ID));

我的错。对不起。


推荐阅读