Lahiru Chandima Lahiru Chandima - 1 month ago 17
Android Question

Do I need runtime permission check to write into getExternalFilesDir() path in marshmallow?

In my android app, I save some files to

Environment.getExternalStorageDirectory() + "\MyApp"
directory. This worked fine until android 6 marshmallow update. After marshmallow update, I cannot write to this directory.

As described in this answer, in marshmallow, apps need to ask for the permission from user at runtime before writing to external storage.

But, when I use
context.getExternalFilesDir(null)
instead of
Environment.getExternalStorageDirectory()
, I don't need to ask for any permission at runtime and it just works (path returned from
context.getExternalFilesDir(null)
is also inside the external storage directory).

Is this some kind of a coincidence or can I continue to write to
context.getExternalFilesDir(null)
without asking permission at runtime?

Answer

The documentation states:

Starting in KITKAT, no permissions are required to read or write to the returned path; it's always accessible to the calling app. This only applies to paths generated for package name of the calling application. To access paths belonging to other packages, WRITE_EXTERNAL_STORAGE and/or READ_EXTERNAL_STORAGE are required.

You will have read/write access to getExternalFilesDir() on Android 4.4+ without requiring any permissions.

I would recommend using a FileProvider if you need to support lower API levels.