androidstorageandroid-sdcardmkdirs

Android mkdirs() return false on Android 11 with Environment.getExternalStorageDirectory()


Mkdirs() function is not working on Android 11. every thing is working fine on Android 10 and lower.

Code:

***String path =Environment.getExternalStorageDirectory().getAbsolutePath() + "/My_directory/";
    File temp_file = new File(path);
    if (!temp_file.exists()){
        Boolean can_create= temp_file.mkdir();
    }***

the above code returns true in case of Android 10 or lower. but returns false in case of Android 11. Manifest permissions:

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

Noting that runtime permission is considered for same (READ_EXTERNAL_STORAGE and WRITE_EXTERNAL_STORAGE).

Manifest application:

    <application
    android:requestLegacyExternalStorage="true"

The only way I am able to write in external storage is using getExternalFilesDir() but this is not the root directory.

according to this developer website, we can't create folders any more in the root directory!

Questions so far after checking this:

1- Is it confirmed that in Android 11 we can't create any folder on the root directory? any work around?

2-If yes, what is the way forward to save data in external storage, excluding getExternalFilesDir() ?

3- Why android:requestLegacyExternalStorage="true" is not working?


Solution

  • Why android:requestLegacyExternalStorage="true" is not working?

    android:requestLegacyExternalStorage is no longer works on Android 11+. It is just a helper on Android 10 to give developers more time before migrating to scoped storage. On scoped storage, you need to use URI for creating, renaming, moving files, etc. Thus java.io.File is almost useless now.

    Is it confirmed that in Android 11 we can't create any folder on the root directory? any workaround?

    No workaround.

    BTW, to reduce scoped storage complexity, I've created a library named Simple Storage. It works across API levels.