首页 > 解决方案 > 为什么在 API 级别 30 上使用范围存储无法访问某些音频文件?

问题描述

我有以下代码来获取所有OPUS音频文件,它适用于除一个目录以外的所有文件,即WhatsApp Voice Notes. 虽然下的音频文件WhatsApp Audio被成功提取。我是否缺少访问内部文件的任何限制/权限WhatsApp Voice Notes

private  fun readAllOpusFiles() {
    val resolver = this.contentResolver
    val uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
    val projection = arrayOf(MediaStore.Audio.Media._ID,
            MediaStore.Audio.Media.RELATIVE_PATH,
            MediaStore.Audio.Media.DISPLAY_NAME,
            MediaStore.Audio.Media.SIZE,
            MediaStore.Audio.Media.MIME_TYPE,
            MediaStore.Audio.Media.DATE_MODIFIED)
    val cursor = resolver.query(uri, projection, null, null, null, null)
    if (cursor != null && cursor.moveToFirst()) {
        do {
            val id = cursor.getColumnIndex(MediaStore.Audio.Media._ID)
            val name = cursor.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME)
            var path = cursor.getColumnIndex(MediaStore.Audio.Media.RELATIVE_PATH)
            Log.d("File ID: ", cursor.getString(id))
            Log.d("File Name: ", cursor.getString(name))
            if (cursor.getString(path) != null) {
                Log.d("File Path: ", cursor.getString(path))
            }
        } while (cursor.moveToNext())
    }
}

PS:在 Android 10 及之前的版本中,我可以通过循环访问android:requestLegacyExternalStorage="true"清单及以下使用的所有文件,urilistFilesfile

val uri = URI.create("file:///storage/emulated/0/WhatsApp/Media/WhatsApp%20Voice%20Notes")
val file = File(uri)

标签: androidkotlinandroid-external-storageandroid-internal-storagescoped-storage

解决方案


.nomedia该限制与目录 /WhatsApp Voice Notes/ 中存在文件有关


推荐阅读