You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android API 35模拟器中Directory.listSync仅返回.thumbnails无法读取MP3文件

解决Android API35模拟器无法读取Music目录MP3文件的问题
  • 适配API33+的媒体权限
    API33及以上版本中,READ_EXTERNAL_STORAGE权限已被弃用,读取音频文件需要申请READ_MEDIA_AUDIO权限。你之前申请的READ_EXTERNAL_STORAGE和mediaLibrary权限无法覆盖API35下的音频读取需求,需要替换为明确申请READ_MEDIA_AUDIO。

  • 验证权限授予状态
    在代码中检查权限是否真的被授予,避免假阳性:

    val hasAudioPermission = ContextCompat.checkSelfPermission(
        context,
        Manifest.permission.READ_MEDIA_AUDIO
    ) == PackageManager.PERMISSION_GRANTED
    

    如果未授予,需要发起权限请求:

    ActivityResultContracts.RequestPermission().launch(Manifest.permission.READ_MEDIA_AUDIO)
    
  • 放弃直接目录遍历,改用MediaStore查询
    API30+启用的Scoped Storage限制了应用对外部存储目录的直接访问,即使有权限,直接调用Directory.listSync()也无法获取非应用创建的文件。正确的做法是通过MediaStore查询音频文件:

    val audioProjection = arrayOf(
        MediaStore.Audio.Media._ID,
        MediaStore.Audio.Media.DISPLAY_NAME,
        MediaStore.Audio.Media.DATA
    )
    
    // 筛选Music目录下的音频文件
    val selection = "${MediaStore.Audio.Media.RELATIVE_PATH} LIKE ?"
    val selectionArgs = arrayOf("Music/%")
    
    context.contentResolver.query(
        MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
        audioProjection,
        selection,
        selectionArgs,
        null
    )?.use { cursor ->
        val nameColumn = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME)
        while (cursor.moveToNext()) {
            val fileName = cursor.getString(nameColumn)
            // 处理每个MP3文件
        }
    }
    
  • 验证模拟器文件状态
    确认MP3文件确实已成功存入模拟器的Music目录:

    1. 使用模拟器自带的文件管理器查看文件是否存在
    2. 通过adb命令验证:adb shell ls /storage/emulated/0/Music,确保输出中包含你的MP3文件
    3. 若文件刚放入,重启模拟器触发媒体库索引更新,否则MediaStore可能无法立即查到文件

内容的提问来源于stack exchange,提问作者Arcus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 23:52:42