Android 11(30 API)File.listFiles()不返回所有文件。

3
我测试了29和30个Android API设备。两个设备都有一个包含5个文件的下载文件夹。应用程序在清单中包含<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格式的字幕文件是媒体类型,但ssavttass字幕文件不是媒体!

相当奇怪的逻辑。ssavttass也是字幕!

对于Android 10,在设置中,读取或写入存储权限如下:

enter image description here

对于Android 11,读取或写入存储看起来像这样:

enter image description here

我有一个视频播放器应用程序,必须支持许多字幕格式,但在 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

enter image description here


2
请请求所有文件访问权限,或使用SAF让用户选择一个目录并使用ACTION_OPEN_DOCUMENT_TREE打开。之后您将可以访问该目录中的所有文件。 - blackapps
@blackapps 我认为 SAF 对用户来说并不友好,他们必须选择正确的目录(根目录),而视频播放器只需要能够访问存储中的所有视频和字幕,因此我将实现 MANAGE_EXTERNAL_STORAGE - user924
@blackapps 这是否意味着我只能使用 SAF 从外部根存储中选择特定子文件夹,而不能选择该外部根存储的所有文件和子文件夹? - user924
@blackapps我认为无法访问视频播放器应用程序的所有文件。Google不会接受此类应用程序的权限,仅适用于文件资源管理器/管理器、杀毒软件等应用程序。有趣的是,VLC播放器将如何解决这个问题。他们仍在使用29 SDK https://github.com/videolan/vlc-android/blob/libvlc-3.4.3/build.gradle#L41 - user924
3
Android的新文件权限是一堆垃圾!他们搞砸了他们的操作系统,我不再打算使用它了。 - AriesConnolly
显示剩余7条评论
1个回答

0

VLC媒体播放器现在使用android.permission.MANAGE_EXTERNAL_STORAGE(所有文件访问)权限https://github.com/videolan/vlc-android/blob/89c2deb5fd4983dd64e0e55bc5ab8e559612c9d9/application/vlc-android/AndroidManifest.xml#L12

这是访问所有字幕和视频类型/格式的唯一方法,但唯一的问题是Google是否允许并批准您的应用程序使用此权限。

通常情况下,在文件浏览器、杀毒软件等应用程序中使用此权限不会出现任何问题,但官方文档没有提到媒体播放器。

有新的媒体权限(用于视频、音频、图像),但它们没有用处,视频媒体权限无法查看所有可用的视频格式,只能查看常规格式,而且没有字幕权限,因此该应用程序可以访问SRT、ASS、VTT和其他字幕格式。

所以VLC应用程序更新并获得了谷歌的所有文件访问权限批准,但正如我之前在评论中所说,我的视频播放器应用程序被拒绝了。VLC和我的应用程序都使用libVLC播放不同格式的视频和字幕,但权限不能被同一类别的每个应用程序使用...

https://developer.android.com/training/data-storage/manage-all-files

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接