TL;DR:在 Android 30+ 中,如何授予应用程序读取其自身文件和外部存储中的外部文件的权限?
我正在努力更新现有的 Android 应用程序,该应用程序提供以下功能:
file://storage/emulated/0/Documents/MyApp问题:
在 API 30+ 中,不再可能访问“外部”文件(由用户上传,而不是由应用程序创建)。他们根本就不再包含在dir.listFiles()其中。该应用程序现在只能看到它自己创建的文件。
如何解决这个问题?
这不是权限问题。在 API 30-32 中,需要请求READ_ + WRITE_EXTERNAL_STORAGE让应用程序创建自定义文件并读取它们。即使授予了这些权限,也无法访问外部文件。
在 API 33 中,不再需要请求权限。然而,访问外部文件仍然是不可能的。
我尝试请求其他权限:READ_MEDIA_*不给我任何更多的访问权限。此外,请求这些权限还会询问用户应用程序是否应该访问图像、音乐和视频。这是误导,因为我不想访问这些文件,而只想访问自定义文档文件。
即使尝试授予也MANAGE_EXTERNAL_STORAGE没有解决问题。此外,如果 Google 需要此权限,它不太可能接受我的应用程序。
接下来,我尝试使用 SAF 让用户选择一个文件以使应用程序能够访问它:
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
Uri pickerInitialUri = Uri.fromFile(getAppExternalStorageDir()); // file://storage/emulated/0/Documents/MyApp
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, pickerInitialUri);
startActivityForResult(intent, PICK_BACKUP_FILE);
Run Code Online (Sandbox Code Playgroud)
虽然这显示了系统文件/文件夹选择器,但该选择器仅显示由应用程序本身创建的那些文件。用户上传的文件仍然不可见...
我的最后一次尝试是intent-filter向应用程序添加一个以注册它以打开我的.custom文件:
<intent-filter> …Run Code Online (Sandbox Code Playgroud) 我在 Google Play 商店上有一个应用程序,我更新了代码以支持 Android 11 操作系统,我通过此权限使用移动设备的存储
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
Run Code Online (Sandbox Code Playgroud)
当我尝试在 Google 商店上传 APK 时,出现此问题
您的 APK 或 Android App Bundle 请求“android.permission.MANAGE_EXTERNAL_STORAGE”权限,但 Google Play 尚不支持。
我该如何解决?