Android: mkdirs()/mkdir() on external storage returns false

I'm driven crazy with this:

Log.d("STATE", Environment.getExternalStorageState());
File f = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), "work_data");
Log.d("PATH", f.getAbsolutePath());
if (!f.exists()) {
    Log.d("MAKE DIR", f.mkdirs() + "");
}

The output log looks like this:

STATE     mounted
PATH      /mnt/sdcard/DCIM/work_data
MAKE DIR  false

I made sure to add the correct permission:

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

But I don't know why it could not create the folder. I also used mkdir() step by step but the result is the same. Please help me. I have googled so much and spent at least 2 days on this stupid thing. Thanks for your help!!

EDITING:

Sorry everyone! I had added <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> in <application> tag. this was my mistake! But thank you all for reply.

Answers


I have had the same problem and I have searched everything for a week trying to find the answer. I think I found it and I think it's ridiculously easy, you have to put the uses-permission statement in the right place...

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.company.name" 
    android:versionCode="1"
    android:versionName="0.2">

    <uses-sdk android:minSdkVersion="8" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

When I had it inside the <application></application> section it did not work.


I got the same problem,and I am sure I had put the permission tag in the right place,but mkdirs didn't work yet, my system is Android 6.0, I resolve it now , you can check as below:

  1. make sure your put the permission tag in .
  2. open "setting/application" in your phone,check your application's permission(I found the permission in my manifest statement is not here),open the switch of the permission like this.(I found it is closed in default which make "mkdirs" failed)


I know this is an old post but perhaps my answer can help somebody.

After several days dealing with this problem I have realized that while the phone is connected to the PC, which it turns to be always during development, the SD card is not available. Thus making to fail any attempt to create a directory or file over it. To make it "easier" it seemed to behave differently depending of the telephone under test.

I know it can sound quite a silly problem, but it cost a lot of time that maybe some other can save.


add this line of code in OnCreate()

ActivityCompat.requestPermissions(this,
            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);

mkdirs() only returns true if the directory was created. If it is in place already, it should return false. So I would bet this directory already exists.


put this

Log.d("MAKE DIR", f.mkdir() + "");

instead of

Log.d("MAKE DIR", f.mkdirs() + "");

or try this

String s=Environment.getExternalStorageDirectory().toString()+"/";
File f = new File(s+"DCIM/work_data");

Your code is working fine for me.There is no any thing wrong in your code. Just if you are making one directory use f.mkdir() instead of f.mkdirs() You can see your folder in mnt => Sd card => DCIM => work_data


I had the same issue, and I just wanted to share my fix. as per android Beginning with Android 4.4, reading or writing files in your app's private directories does not require the READ_EXTERNAL_STORAGE or WRITE_EXTERNAL_STORAGE permissions.

So you can declare the permission should be requested only on the lower versions of Android by adding the maxSdkVersion attribute:

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

but maxSdkVersion is the issue, I just removed it and now it works.


If you have android 6.0 and more, make sure your target sdk in gradle file less than 22:

targetSdkVersion 22

or you need to implement run time permissions.


This might help someone in the future.

the problem might also be that you write the address "/File/Address/" instead you should write

File.separator + "File" + File.separator + "Address" + File.separator

This is such a small and stupid thing but this worked for me after wasting hours of my time.


I tried to make a set of subfolders in external storage 'Test/Test1/Test2' when mkdirs() kept returning false. Turns out that 'Test' is either a reserved word for a folder in the external storage root. This was on a Motorola G (XT1541) and may apply to other devices as well.


Need Your Help

Setting the default Java character encoding?

java utf-8 character-encoding

How do I properly set the default character encoding used by the JVM (1.5.x) programmatically?

What is the best practice for adding constants in laravel? (Long List)

php laravel laravel-5 constants laravel-5.3

I am rather new to laravel. I have a basic question, What is the best way to add constants in laravel.