相关疑难解决方法(0)

Android SDK 30 及更高版本 - 如何从外部存储打开任何文件?

TL;DR:在 Android 30+ 中,如何授予应用程序读取其自身文件和外部存储中的外部文件的权限?


细节:

我正在努力更新现有的 Android 应用程序,该应用程序提供以下功能:

  • 文件写入外部存储file://storage/emulated/0/Documents/MyApp
  • 读取这些应用程序创建的文件
  • 读取用户放置在此文件夹中的内容

问题:

在 API 30+ 中,不再可能访问“外部”文件(由用户上传,而不是由应用程序创建)。他们根本就不再包含在dir.listFiles()其中。该应用程序现在只能看到它自己创建的文件。

如何解决这个问题?

EXTERNAL_STORAGE 权限:

这不是权限问题。在 API 30-32 中,需要请求READ_ + WRITE_EXTERNAL_STORAGE让应用程序创建自定义文件并读取它们。即使授予了这些权限,也无法访问外部文件。

在 API 33 中,不再需要请求权限。然而,访问外部文件仍然是不可能的。

READ_MEDIA 权限:

我尝试请求其他权限:READ_MEDIA_*不给我任何更多的访问权限。此外,请求这些权限还会询问用户应用程序是否应该访问图像、音乐和视频。这是误导,因为我不想访问这些文件,而只想访问自定义文档文件。

管理外部存储

即使尝试授予也MANAGE_EXTERNAL_STORAGE没有解决问题。此外,如果 Google 需要此权限,它不太可能接受我的应用程序。

SAF(存储访问框架)

接下来,我尝试使用 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)

android

8
推荐指数
1
解决办法
1208
查看次数

添加管理外部存储权限后,我无法将APK上传到谷歌商店

我在 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 尚不支持。

我该如何解决?

android apk

3
推荐指数
1
解决办法
3574
查看次数

标签 统计

android ×2

apk ×1