android - 无法在 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
解决方案
答案是我正在使用:
id = playListCursor.getColumnIndex(MediaStore.Audio.Playlists._ID));
而不是:
id = playListCursor.getLong(playListCursor.getColumnIndex(MediaStore.Audio.Playlists._ID));
我的错。对不起。
推荐阅读
- rust - 如何使用 Cargo 用路径修补 crates-io?
- node.js - 来自 Postman 和 Node 的 HTTP 请求,但不是 React
- scala - Spark (Scala) 修改数据集列的内容
- python - OverflowError: (34, 'Numerical result out of range') 使用 PyTorch 学习率调度程序
- opencart - 在 Opencart V 3.0.3.0 中提交注册表时显示所有错误
- mysql - 计算日期之间
- android - 即使在取消订阅 IAP google 后也续订订阅
- php - 功能AFTER authentication and BEFORE view (laravel)
- python-3.x - 如何获得类 Meta 的正确属性?
- r - 使用 R 中的变量名提取列表中的项目