Android 11 - 访问我的应用 Android/Data 文件夹中的文件

Android 11 - Accessing Files in my app Android/Data folder

出于某种原因,我真的很苦恼,希望有人能帮助我指明正确的方向。

我的目标是 Android 11 / API 30,这似乎是问题的根源。降低目标可能对我有用 - 但似乎 Google 最终会迫使我走这条路,所以我还是想办法解决这个问题。

我的应用程序通常将文件写入标准

getExternalFilesDir(null)

这给了我设备上的路径

/storage/emulated/0/Android/data/com.domain.testapp/files

我也试过其他类型,比如:

getExternalFilesDir(Environment.DIRECTORY_PICTURES)

结果

/storage/emulated/0/Android/data/com.domain.testapp/files/Documents

我的应用程序实际上没有问题将文件写入此位置。在 Android 11 中,我必须通过本地文件资源管理器跳过一些步骤才能看到这些文件 - 但它们确实存在于设备上。

我现在正试图为用户提供一些查看文件和共享文件的能力,这就是我遇到的问题!

下面的代码导致找不到文件

File filePath = this.getExternalFilesDir(null);
String filePathString = filePath.toString();

ArrayList<String> myData = new ArrayList<>();
File fileDir = new File(filePathString);

String[] files = fileDir.list();

if(files.length == 0){
    Log.w(APPID, "NO FILES IN FOLDER");
}

是的——我知道 File 和 .toString() 是不需要的——但我每一步都把它们注销了,因为我觉得我疯了。

我知道一个事实,这个应用程序指向的文件夹中有十几个文件。这个应用程序创建了文件。不是应该能看到文件夹里的文件吗???

Manifest 具有以下权限 - 我认为它不需要所有权限:

<uses-permission android:name = "android.permission.MANAGE_EXTERNAL_STORAGE"/>
<uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE"/>

没有权限显示为拒绝应用程序

我考虑过使用外部存储 - 但在 Android 11 中似乎更难?或者这真的是一条更容易走的路吗?

我确实尝试过玩这个,但它似乎已被弃用并且很快就会消失?

File downloadFilePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);

这是我设备上的这个文件夹

/storage/emulated/0/Download

而且我绝对可以使用任何文件浏览器查看其中的文件。

关于如何访问此应用程序创建的文件的任何想法?

我可能遗漏了一些非常明显的东西。

欢迎提出任何建议!!

您的清单中是否有以下权限? 你说你有写入和管理权限,但我认为你实际上需要读取权限才能读取外部存储。

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

请正确描述您的问题

如果你想从外部存储中获取文件,那么也可以在清单中申请 requestlegegyexternalstorage=true

看看这些快照 - http://prntscr.com/114kqxp

或者如果您想将文件存储在设备中,则必须使用 android

中的文件提供程序

以文件提供者为例

请访问link -

Add below line in your Android manifest file in application tag.

android:requestLegacyExternalStorage="true"

我想我有答案了?

我读得越多 - 似乎 Android 10 走了一条路,然后 Android 11 回溯了一点并重新启用了一些直接文件路径访问。

希望我在这件事上是对的,以后不用再回来重新做事了

所以答案是在 Manifest 中使用 requestLegacyExternalStorage - 即使它有各种警告

然后我用这个在文档中创建了一个文件夹

File filePath = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS)+File.separator+"MyAppFolder");
filePath.mkdirs();

现在我可以写入和读取它了。

无论如何 - 这似乎对我有用 Android 9、10 和 11。所以希望趋势继续下去。

Google Play Store 要求您使用 SCOPED STORAGE 而不是 SHARED STORAGE,因此您应该避免使用“requestLegacyStorage”。

这意味着如果用户不直接选择它们,您将无法访问 SD 卡上的文件。要 select 来自外部存储的文件,您需要用户交互 (:

还有另一种解决方案 Android >= 10,它是权限“MANAGE_EXTERNAL_STORAGE”,让您选择可以访问外部存储的应用程序。但是用户必须执行所有操作,所以这不是一个很好的解决方案:/

如果您的问题是关于您在外部存储中通过用户交互拍摄的文件,您可以使用 fileProvider 启用对文件 uri 的访问(例如,当您拍照时)。

祝你有愉快的一天和愉快的编码 (: