Binoy Babu
Binoy Babu

Reputation: 17119

Cannot create file in external storage

I'm trying to create a file in the external storage directory of the Nougat emulator. using the following code:

    File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/test987689");
    if(!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){
        Toast.makeText(this, "External SD card not mounted", Toast.LENGTH_LONG).show();
    }try {
        if (file.getParentFile().exists() || file.getParentFile().mkdirs()) {
            file.createNewFile();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

Permissons:

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

And I'm getting the following error:

W/System.err: java.io.IOException: Permission denied
W/System.err:     at java.io.UnixFileSystem.createFileExclusively0(Native Method)
W/System.err:     at java.io.UnixFileSystem.createFileExclusively(UnixFileSystem.java:280)
W/System.err:     at java.io.File.createNewFile(File.java:958)
W/System.err:     at com.vibhinna.sreni.SplashActivity.onCreate(SplashActivity.java:41)
W/System.err:     at android.app.Activity.performCreate(Activity.java:6658)
W/System.err:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
W/System.err:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2584)
W/System.err:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2692)
W/System.err:     at android.app.ActivityThread.-wrap12(ActivityThread.java)
W/System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1445)
W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:102)
W/System.err:     at android.os.Looper.loop(Looper.java:154)
W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6044)
W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

What am I doing wrong?

Upvotes: 1

Views: 6830

Answers (2)

chuan
chuan

Reputation: 39

to get File path you can use Context.getExternalFilesDir()/Context.getExternalCacheDir()

for example

String path=Context.getExternalCacheDir()+"file.text"; File file=new File(path)

it doesnt need permission if the filepath is "Android/data/app package/file name"

Upvotes: 2

Achraf Amil
Achraf Amil

Reputation: 1375

If your targetSdk is 23 or higher, you should request permissions dynamically.

to know more : Requesting Permissions at Run Time

Upvotes: 4

Related Questions