0

I'm trying to read/write to /Android/data and /Android/obb folders in my app on Android 11. I already know it is impossible when targeting Android 11, so I wrote the following in build.gradle:

 compileSdkVersion 29
    buildToolsVersion "29.0.3"
    defaultConfig {
        applicationId "bla.bla.bla"
        minSdkVersion 21
        //noinspection OldTargetApi
        targetSdkVersion 29

        . . .
}

And also in AndroidManifist.xml:

<application
        . . .

        android:requestLegacyExternalStorage="true">

        . . .
<application/>

And I called Environment.isExternalStorageLegacy() to see if it really works, and at the same time I tried printing a list of files in the /Android/data folder.

On some activity:

 if(Build.VERSION.SDK_INT > 28)  {
        Log.d("Storage", Environment.isExternalStorageLegacy() ? "Legacy true" : "Legacy false");
        File file = new File(Environment.getExternalStorageDirectory().getPath() + "/Android/data/");
        for(String s : file.list()) Log.d("files", s);
}

For now, Environment.isExternalStorageLegacy() returned true.

2021-05-10 23:20:32.737 31921-31921/com.fqxd.gftools D/Storage: Legacy true

But unfortunately, I get java.lang.NullPointerException when getting a list of file/Android/data:

2021-05-10 23:20:32.739 31921-31921/com.fqxd.gftools D/AndroidRuntime: Shutting down VM
2021-05-10 23:20:32.740 31921-31921/com.fqxd.gftools E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.fqxd.gftools, PID: 31921
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.fqxd.gftools/com.fqxd.gftools.MainActivity}: java.lang.NullPointerException: Attempt to get length of null array
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3431)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3595)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7660)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
     Caused by: java.lang.NullPointerException: Attempt to get length of null array
        at com.fqxd.gftools.MainActivity.onCreate(MainActivity.java:53)
        at android.app.Activity.performCreate(Activity.java:8000)
        at android.app.Activity.performCreate(Activity.java:7984)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3404)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3595) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:223) 
        at android.app.ActivityThread.main(ActivityThread.java:7660) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 
2021-05-10 23:20:33.268 31921-31937/com.fqxd.gftools W/System: A resource failed to call close. 

This seems to block access to the /Android/data folder on Android itself.

Please let me know how to solve this problem.

  • On an Android 10 device you have full access to /storage/emulated/0/Android/data if you requested legacy external storage in manifest file. – blackapps May 10 '21 at 14:51
  • According to https://developer.android.com/about/versions/11/privacy/storage : "On Android 11, apps can no longer access files in _any_ other app's dedicated, app-specific directory within external storage." Presumably this applies no matter what version of Android the app targets. – Peter O. May 10 '21 at 14:53
  • Sorry. It's my mistake. It's not `Environment.getExternalStorageDirectory()`. It's `Environment.isExternalStorageLegacy()`. – Choiman1559 May 10 '21 at 14:57

0 Answers0