I was trying to figure out why an app I use can't download a file (via Download Manager). Via a coding example I narrowed it down to the app not being able to create/access its own external files dir on a device where I have flashed a custom ROM, while the same works fine on another device running its stock ROM.

This line of code

File outfile = new File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).toString() + "/" + "Sample" + ".png");

produces this output on the culprit device:

Failed to ensure /storage/emulated/0/Android/data/com.gadgetsaint.downloadmanagerexample/files/Download java.lang.IllegalStateException: Failed to prepare /storage/emulated/0/Android/data/com.gadgetsaint.downloadmanagerexample/files/Download at android.os.Parcel.createExceptionOrNull(Parcel.java:3363) at android.os.Parcel.createException(Parcel.java:3339) at android.os.Parcel.readException(Parcel.java:3322) at android.os.Parcel.readException(Parcel.java:3264) at android.os.storage.IStorageManager$Stub$Proxy.mkdirs(IStorageManager.java:1415) at android.os.storage.StorageManager.mkdirs(StorageManager.java:1421) at android.app.ContextImpl.ensureExternalDirsExistOrFilter(ContextImpl.java:3767) at android.app.ContextImpl.getExternalFilesDirs(ContextImpl.java:894) at android.app.ContextImpl.getExternalFilesDir(ContextImpl.java:883) at android.content.ContextWrapper.getExternalFilesDir(ContextWrapper.java:308) at com.gadgetsaint.downloadmanagerexample.MainActivity$2.onClick(MainActivity.java:121) at android.view.View.performClick(View.java:8228) at android.view.View.performClickInternal(View.java:8205) at android.view.View.-$$Nest$mperformClickInternal(Unknown Source:0) at android.view.View$PerformClick.run(View.java:31785) at android.os.Handler.handleCallback(Handler.java:1041) at android.os.Handler.dispatchMessage(Handler.java:103) at android.os.Looper.dispatchMessage(Looper.java:315) at android.os.Looper.loopOnce(Looper.java:251) at android.os.Looper.loop(Looper.java:349) at android.app.ActivityThread.main(ActivityThread.java:9041) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:593) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:929) Caused by: android.os.RemoteException: Remote stack trace: at com.android.server.StorageManagerService.mkdirs(StorageManagerService.java:3867) at android.os.storage.IStorageManager$Stub.onTransact(IStorageManager.java:690) at android.os.Binder.execTransactInternal(Binder.java:1441) at android.os.Binder.execTransact(Binder.java:1385)

The weird thing is that with Android Studio's device explorer I found that other apps have external files (or cache) dirs. Why can't my example app--or the app I was originally debugging--access external storage on this device vs. another? Both devices are running Android 16.

EDIT: If I try to create the external download directory manually, I get a

java.nio.file.AccessDeniedException

pegnose's user avatar

4

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.