Android Q:file.mkdirs()返回false

时间:2019-06-29 21:53:57

标签: android android-9.0-pie

我们有一个使用外部存储来存储一些临时文件的应用程序:图像,二进制数据。直到最近,用于该代码的代码已经运行了几年,没有太大的变化。在Android Q上不起作用:

File f = new File(Environment.getExternalStorageDirectory().toString() + File.separator + MainActivity.APP_DIR)
f.mkdirs();
// do sth with f

mkdirs现在仅返回false

清单中提供了必需的权限:

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

该代码在早期版本的Android上正常运行。这种访问类型在系统级别上有变化吗?如果是这样,什么解决方法?

3 个答案:

答案 0 :(得分:2)

在新的 Android 更新 API 30 中,您只能写入您的 app-specific files

 File directory = new File(context.getFilesDir(), "YOUR_DIR");
 directory.mkdirs();

或在您的应用Android/data

的外部存储中
File directory = new File(myContext.getExternalFilesDir("FolderName"),"YOUR_DIR");

更新

这个答案提供了另一种解决方案https://stackoverflow.com/a/65744517/8195076

更新

另一种方法是在 manifest

中授予此权限
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

喜欢这个答案https://stackoverflow.com/a/66968986/8195076

答案 1 :(得分:1)

通过引入Scoped Storage,Android Q发生了巨大的隐私更改。

从Q beta 4开始,可以通过以下方式opt-out使用该功能:

  • 定位API 28(或更低版本)
  • 使用requestLegacyExternalStorage清单属性:

<manifest ... >
  <!-- This attribute is "false" by default on apps targeting Android Q. -->
  <application android:requestLegacyExternalStorage="true" ... >
    ...
  </application>
</manifest>

*请注意,我没有测试它,只是引用了文档

答案 2 :(得分:0)

在API级别29中,不建议直接访问共享/外部存储设备。当应用定位到Build.VERSION_CODES.Q时,从getExternalStorageDirectory()方法返回的路径将不再可直接用于应用。 通过迁移到Context#getExternalFilesDir(String)MediaStoreIntent#ACTION_OPEN_DOCUMENT之类的替代方案,应用程序可以继续访问共享/外部存储中存储的内容。

除非您的应用需要访问不在应用特定目录中的文件,否则最好使用范围存储。

面对在Android-Q中管理文件的问题的读者可以通读this文章以进一步了解。