Ed *_*ner 7 android file android-external-storage android-11
由于某种原因,我真的很挣扎,希望有人能帮助我指明正确的方向。
我的目标是 Android 11 / API 30,这似乎是所有问题的根源。降低目标可能对我有用——但谷歌似乎最终会迫使我走上这条路,所以我不妨弄清楚这一点。
我的应用程序通常会按照标准写入文件
getExternalFilesDir(null)
Run Code Online (Sandbox Code Playgroud)
这给了我设备上的一条路径
/storage/emulated/0/Android/data/com.domain.testapp/files
Run Code Online (Sandbox Code Playgroud)
我还尝试了其他类型,例如:
getExternalFilesDir(Environment.DIRECTORY_PICTURES)
Run Code Online (Sandbox Code Playgroud)
结果是
/storage/emulated/0/Android/data/com.domain.testapp/files/Documents
Run Code Online (Sandbox Code Playgroud)
我的应用程序实际上将文件写入此位置没有任何问题。在 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");
}
Run Code Online (Sandbox Code Playgroud)
是的 - 我知道不需要 File 和 .toString() - 但我每一步都将它们注销,因为我认为我疯了。
我知道这个应用程序指向的文件夹中有十几个左右的文件。该应用程序创建了文件。不是应该能看到文件夹里的文件吗???
Manifest 具有以下权限 - 我认为它不需要全部:
<uses-permission android:name = "android.permission.MANAGE_EXTERNAL_STORAGE"/>
<uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE"/>
Run Code Online (Sandbox Code Playgroud)
没有权限显示为应用程序被拒绝
我想过使用外部存储 - 但似乎这在 Android 11 中更难?或者这真的是一条更容易走的路吗?
我确实尝试过使用它,但它似乎已被弃用并且很快就会消失?
File downloadFilePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
Run Code Online (Sandbox Code Playgroud)
我的设备上的这个文件夹是哪个
/storage/emulated/0/Download
Run Code Online (Sandbox Code Playgroud)
我绝对可以使用任何文件浏览器看到其中的文件。
关于如何访问此应用程序创建的文件有什么想法吗?
我可能错过了一些非常明显的东西。
欢迎任何建议!!
Ed *_*ner 10
我想我有答案了?
我读得越多,Android 10 似乎单向发展,然后 Android 11 稍微回溯并重新启用一些直接文件路径访问。
希望我在这一点上是对的,并且以后不必再回来重新做事情
所以答案是在清单中使用 requestLegacyExternalStorage - 即使它有各种警告
然后我用这个在文档中创建了一个文件夹
File filePath = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS)+File.separator+"MyAppFolder");
filePath.mkdirs();
Run Code Online (Sandbox Code Playgroud)
现在我可以写入并从中读取。
无论如何,这似乎对我在 Android 9、10 和 11 上有效。所以希望这种趋势能够继续下去。