当前位置: 首页 > 知识库问答 >
问题:

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

洪鹏海
2023-03-14

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

我的目标是Android11/API30,这似乎是所有问题的根源。针对较低的目标可能对我有用——但谷歌似乎最终会迫使我走上这条路,所以我还是想办法解决这个问题。

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

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

我的应用程序没有任何问题实际上写文件到这个位置。在Android11中,我必须用本地文件浏览器跳过一些障碍才能看到这些文件——但它们确实存在于设备上。

我现在正试图给用户一些查看文件和共享文件的能力,这就是我被难倒的地方!

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

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");
}

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

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

Manifest拥有以下权限——我认为它不需要所有这些权限:

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

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

我想过使用外部存储——但在Android11中似乎更难?或者这真的是一条更容易走的路?

我确实试着玩这个,但它似乎过时了,很快就会消失?

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

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

/storage/emulated/0/Download

我可以用任何文件浏览器看到里面的文件。

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

我可能错过了一些非常明显的东西。

欢迎任何建议!!

共有3个答案

袁良弼
2023-03-14

添加下面的行在你的Android清单文件中的应用程序标记。

android:requestLegacyExternalStorage="true"
羊浩广
2023-03-14

Google Play Store要求您使用作用域存储,而不是共享存储,因此您应该避免使用“requestLegacyStorage”。

这意味着如果用户不直接选择sd卡上的文件,则无法访问这些文件。要从外部存储中选择文件,您需要用户交互(:

Android还有另一个解决方案

如果您的问题与外部存储中的用户交互文件有关,则可以使用文件提供程序(例如,在拍照时)启用对文件uri的访问。

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

曾元忠
2023-03-14

我想我有答案了?

我读得越多——Android10似乎走的是一条路,然后Android11回来跟踪了一下,并重新启用了一些直接的文件路径访问。

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

所以答案是在清单中使用requestLegacyExternalStorage——尽管它有各种各样的警告

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

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

现在我可以写信给它并从中阅读。

不管怎样,这似乎对我在Android9、10和11上都有效。因此,希望未来的趋势继续下去。

 类似资料:
  • 通过使用android 11(SDK API 30)设备下面的一些方法 但在Android11中运行良好。无法使用如下所示的方法使其im 函数调用 uri是我从拾取器的响应中获得的视频路径。 copyFile的函数调用 错误:new ;path:/storage/emulated/0/download/stop/mp4_20210128225711.mp4 system.err:java.io.f

  • 日安! 我是Docker新手,真的需要帮助。 系统:Windows 10,Docker Desktop 应用程序:Java Spring-Boot应用程序,按照一定的逻辑在系统的不同文件夹中传输文件。包装在Docker容器中 问题:Java Spring-Boot应用程序在Windows 10中看不到文件夹(例如“我的文档”、“C:\Program Files”等等。应用程序应该从“C:\User

  • 问题内容: 这个问题可能被问过很多次,但是我没有找到直接的答案。 实际上,我正在使用WebSphere来运行Java Web应用程序,我想将上传的文件/资源​​保存/存储到服务器目录之外的文件夹中,D:/resources/但是我担心的是,我们是否有可能这样做?因为这可能是某种安全漏洞。 如果可能的话,那么如何在Java Web应用程序中做到这一点。 问题答案: 下面是在struts 1.x中上传

  • 问题内容: 有没有办法从iCloud Drive中选择文件? 问题答案: 您可以通过以下方式显示控制器: 在您的委托中实现方法: 请注意,您无需设置要使用的iCloud权利。Apple 在此处提供了示例代码来演示如何使用此控制器

  • 我正在从主类访问资源文件夹中的文件 我收到了这个错误: 我甚至打开了jar文件,remoteUnitsIdsInOldServer.txt文件就在那里,在类内部

  • 如何从watchOS扩展文件夹访问iOS文件夹中的数据类。如果我想通过调用我的DataService来正常访问类,则会出现以下错误: 我要访问的文件: