Android 13下READ MEDIA AUDIO授权后音乐playlist无法显示求助
针对Android 13音乐应用无法读取音频文件的排查方案
1. 确认权限申请逻辑是否完整
- 除了在Manifest中声明
READ_MEDIA_AUDIO,需确保代码中正确申请权限,且授权成功后重新触发音频扫描逻辑,不要仅在启动时扫描一次。 - 示例Java代码:
// 检查权限状态 if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_MEDIA_AUDIO) != PackageManager.PERMISSION_GRANTED) { ActivityResultLauncher<String> requestPermissionLauncher = registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> { if (isGranted) { // 授权成功后立即执行音频扫描 loadMusicFiles(); } }); requestPermissionLauncher.launch(Manifest.permission.READ_MEDIA_AUDIO); } else { // 已授权,直接启动扫描 loadMusicFiles(); }
2. 适配Android 13的媒体查询逻辑
Android 13对媒体查询的Uri和投影字段有严格要求,避免使用废弃字段:
- 正确使用查询Uri:
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI - 必须指定所需投影字段,禁止传入
null,示例:
String[] projection = { MediaStore.Audio.Media._ID, MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.DURATION }; Cursor cursor = getContentResolver().query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, projection, MediaStore.Audio.Media.IS_MUSIC + " != 0", null, MediaStore.Audio.Media.TITLE + " ASC" );
- 注意:Android 10及以上版本中
MediaStore.Audio.Media.DATA字段已隐藏,如需访问文件内容,改用ContentResolver.openFileDescriptor(),不要直接读取路径。
3. 触发系统媒体库索引
若系统未及时索引音频文件,可手动触发扫描:
// 替换为实际音频文件路径 sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File("/sdcard/Music/test.mp3"))));
也可引导用户通过系统文件管理应用打开音频文件,触发自动索引。
4. 检查目标SDK版本
确保build.gradle中targetSdkVersion设置为33(Android 13),低版本目标SDK可能导致权限逻辑兼容问题。
5. 测试多存储位置的音频文件
分别测试内部存储和外部SD卡中的音频文件,部分设备对SD卡访问有额外限制,需确认SD卡挂载正常且应用具备访问权限。
内容的提问来源于stack exchange,提问作者user27502590
相关产品推荐
相关产品推荐

