<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
并在运行时请求它。还包括android:requestLegacyExternalStorage="true"
(仅适用于Android 10,Android 11会忽略它)。private fun init() {
val path = File(Environment.getExternalStorageDirectory(), "Download")
val files = path.listFiles()
Timber.d("Android API ${Build.VERSION.SDK_INT}, dirFiles \n${files?.joinToString(separator = "\n") { it.name }}")
}
安卓 11 (30 SDK):
2021-10-06 23:40:52.182 9022-9022/com.example.tests D/MainActivity: Android API 30, dirFiles
Elephants Dream.srt
Elephants Dream.mkv
安卓10(29 SDK):
2021-10-06 23:45:51.835 8293-8293/com.example.tests D/MainActivity: Android API 29, dirFiles
Elephants Dream.srt
Elephants Dream.ssa
Elephants Dream.vtt
Elephants Dream.ass
Elephants Dream.mkv
正如您所看到的,Android 11不使用File.listFiles()
方法返回所有文件。
它通过某些媒体过滤器在系统级别上过滤文件。附注:MediaStore
游标查询返回相同的有限结果。
它识别srt
格式的字幕文件是媒体类型,但ssa
、vtt
或ass
字幕文件不是媒体!
相当奇怪的逻辑。ssa
、vtt
、ass
也是字幕!
对于Android 10,在设置中,读取或写入存储权限如下:
对于Android 11,读取或写入存储看起来像这样:
我有一个视频播放器应用程序,必须支持许多字幕格式,但在 Android 11 上只能获取 srt 文件。如何获取所有需要的文件?更新:似乎 Android 11 的唯一方法是请求所有文件访问权限 https://developer.android.com/training/data-storage/manage-all-files#all-files-access,但获得 Google 批准可能会很具有挑战性。我们可以使用 SAF(存储访问框架),但它在 Android 11 上有许多限制https://developer.android.com/training/data-storage/shared/documents-files#document-tree-access-restrictions。
MANAGE_EXTERNAL_STORAGE
。 - user924