为啥在 API 级别 30 上使用范围存储无法访问某些音频文件?

Posted

技术标签:

【中文标题】为啥在 API 级别 30 上使用范围存储无法访问某些音频文件?【英文标题】:Why some audio files are not accessible on API level 30 with scoped storage?为什么在 API 级别 30 上使用范围存储无法访问某些音频文件? 【发布时间】:2021-02-23 08:35:05 【问题描述】:

我有以下代码来获取所有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 及之前的版本中,我可以通过在 file 上循环 listFiles 来访问清单中使用 android:requestLegacyExternalStorage="true"uri 以下的所有文件,

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

【问题讨论】:

请告诉那些whatsapp目录的完整路径。 developer.android.com/about/versions/11/privacy/… Is there any restriction/permission I am missing to access the files inside WhatsApp Voice Notes? 你到底是什么意思?它们是否由您的代码列出但您无法访问它们?还是根本没有列出? 完整路径将改为/storage/emulated/0/WhatsApp/Media/WhatsApp Voice Notes 您是否添加了此标签 android:requestLegacyExternalStorage="true" 以及您的目标 SDK 是什么? 【参考方案1】:

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

【讨论】:

以上是关于为啥在 API 级别 30 上使用范围存储无法访问某些音频文件?的主要内容,如果未能解决你的问题,请参考以下文章

Android Q:范围存储中的 SQLite 数据库

应用程序如何在没有 root 的情况下访问 Android 6.0(API 级别 23)中 USB OTG 存储上的文件?

为啥控件由于其保护级别而无法访问?

无法从 BLOB 存储打开备份设备 - 访问被拒绝

无法打开相机意图。 queryIntentActivities 在 api 级别 30 返回一个空列表,但在级别 29 中找到结果。发生了啥变化?

为啥我收到“由于保护级别而无法访问”错误?