Android Q: file.mkdirs() returns false

我们两清 提交于 2020-04-05 04:03:23

问题


We have an app that uses external storage to store some temporary files: images, binary data. The code for that has been working for a few years without big changes until recently. On Android Q it doesn't work:

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

The mkdirs now returns just false.

Required permission is provided in the manifest:

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

The code works fine on previous versions of Android. Is there some system level change to this type of access? If so, what is the workaround?


回答1:


There was huge privacy change in android Q by introducing Scoped Storage.

Since Q beta 4 it's possible to opt-out of that feature by:

  • targeting api 28 (or lower)
  • using requestLegacyExternalStorage manifest attribute:

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

*note I haven't tested it, just quoting docs




回答2:


In API level 29 direct access to shared/external storage devices is deprecated. When an app targets Build.VERSION_CODES.Q, the path returned from getExternalStorageDirectory() method is no longer directly accessible to apps. Apps can continue to access content stored on shared/external storage by migrating to alternatives such as Context#getExternalFilesDir(String), MediaStore, or Intent#ACTION_OPEN_DOCUMENT.

It's a best practice to use scoped storage unless your app needs access to a file that doesn't reside in the app-specific directory.

Those who face the issue with managing files in Android-Q may read through this article to know further.



来源:https://stackoverflow.com/questions/56821095/android-q-file-mkdirs-returns-false

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!