我们有一个使用外部存储来存储一些临时文件的应用程序:图像,二进制数据。直到最近,用于该代码的代码已经运行了几年,没有太大的变化。在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上正常运行。这种访问类型在系统级别上有变化吗?如果是这样,什么解决方法?
答案 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" />
答案 1 :(得分:1)
通过引入Scoped Storage,Android Q发生了巨大的隐私更改。
从Q beta 4开始,可以通过以下方式opt-out使用该功能:
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),MediaStore或Intent#ACTION_OPEN_DOCUMENT之类的替代方案,应用程序可以继续访问共享/外部存储中存储的内容。
除非您的应用需要访问不在应用特定目录中的文件,否则最好使用范围存储。
面对在Android-Q中管理文件的问题的读者可以通读this文章以进一步了解。