Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 11-访问我的应用程序Android/Data文件夹中的文件_Android_File_Android External Storage_Android 11 - Fatal编程技术网

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

Android 11-访问我的应用程序Android/Data文件夹中的文件,android,file,android-external-storage,android-11,Android,File,Android External Storage,Android 11,出于某种原因,我真的很挣扎,我希望有人能帮我指明正确的方向 我的目标是安卓11/API30,这似乎是所有问题的根源。瞄准更低的目标可能对我有用——但谷歌似乎最终会迫使我走上这条路,所以我还是想办法解决这个问题 我的应用程序通常按照标准写入文件 getExternalFilesDir(null) 这为我提供了设备上的路径,该路径是 /storage/emulated/0/Android/data/com.domain.testapp/files 我还尝试了其他类型,如: getExternal

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

我的目标是安卓11/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
我的应用程序在将文件写入此位置时没有问题。在安卓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");
}
这是我设备上的哪个文件夹

/storage/emulated/0/Download
我可以用任何文件浏览器看到里面的文件

关于如何访问此应用程序创建的文件有什么想法吗

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


欢迎任何建议

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

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

请正确描述您的问题

如果您想从外部存储中提取文件,那么也可以在清单中应用 requestlegegyexternalstorage=true

在这些快照中看到-

或者,如果你想在设备中存储文件,那么你必须使用android中的文件提供程序

对于文件提供程序示例

请浏览连结-

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


我想我有答案了

我读到的越多——Android 10似乎走了一条路,然后Android 11稍微回溯了一下,重新启用了一些直接文件路径访问

希望我在这一点上是对的,我不必再回来,在这条路上再做一些事情

因此,答案是在清单中使用requestLegacyExternalStorage,即使它有各种警告

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

File filePath = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS)+File.separator+"MyAppFolder");
filePath.mkdirs();
现在我可以写下来读了


无论如何,这似乎对我在安卓9、10和11上的工作有效。因此,希望这一趋势继续下去。

在安卓11中,我必须使用本地文件资源管理器跳过一些障碍才能查看这些文件-
在安卓11设备上,使用本地文件资源管理器,您将看不到应用程序特定的文件。你为什么要说这样一句令人困惑的话?
结果是/storage/simulated/0/Android/data/com.domain.testapp/files/Documents
否。不是文档而是图片。请不要混淆我们。对于getExternalFilesDir,您不需要任何权限,要列出您的文件,您的代码(尽管很混乱)应该可以。如果您的应用程序可以在公共下载文件夹中创建文件,那么您的应用程序应该能够列出这些文件。不清楚你还想要什么。文件的所有者在Android11中很重要。对于getExternalFilesDir,只有您的应用程序具有访问权限,如果它在那里创建了文件,则可以列出它们。您甚至不知道.list()是返回null还是返回空列表。它已弃用为yes。但他们还是像以前一样工作。所以你可以使用它们。这对于Android 11是不正确的-根据谷歌的说法:警告:当你将你的应用程序更新为目标Android 11(API级别30)后,当你的应用程序在Android 11设备上运行时,系统会忽略requestLegacyExternalStorage属性,因此,您的应用程序必须准备好支持作用域存储,并为这些设备上的用户迁移应用程序数据。事实证明你是正确的-但这不是我的全部解决方案,因为我仍然无法正确阅读此文件夹的内容。我也阅读了…这并不能解决现在的问题。它确实解决了。android studio会告诉你它已经被弃用了,但它可以工作。您也需要在清单中使用此选项:android:requestLegacyExternalStorage=“true”
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
android:requestLegacyExternalStorage="true"
File filePath = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS)+File.separator+"MyAppFolder");
filePath.mkdirs();