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

46,664

Solution 1

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.

Solution 2

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)

enter image description here

Solution 3

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.

Solution 4

add this line of code in OnCreate()

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

Solution 5

Applicable only if your targetSdkVersion is 29 or above

Environment.getExternalStorageDirectory() is deprecated in API level 29.

To get the same functionality use this line

File mediaStorageDir = context.getExternalFilesDir(null);

If you have checked all the possible errors then try this fix.

Already answered here - https://stackoverflow.com/a/61480077/7764015

Share:
46,664
MHM
Author by

MHM

Updated on July 09, 2022

Comments

  • MHM
    MHM almost 2 years

    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.

  • MHM
    MHM almost 13 years
    No. it doesn't. I check it in line if (!f.exists()) {
  • MHM
    MHM almost 13 years
    I checked f.mkdir() too but there is no difference. I also check in files System and there is not such folder!!!
  • Dharmendra
    Dharmendra almost 13 years
    I had just copy and paste your code in my activity and it is working it is creating folder.I don't know why you are getting problem.
  • Hamidreza Sadegh
    Hamidreza Sadegh almost 8 years
    maybe in some device, not all of them
  • Chris
    Chris almost 8 years
    In Android 6.0, you request certain permissions when you use them. You can make the request using the function ActivityCompat.requestPermissions. See here for more information.
  • Pham Hung
    Pham Hung about 7 years
    Correct answer in my situation. Vote it up
  • jiwopene
    jiwopene almost 6 years
    Hidden directory name always starts with . (dot).
  • Sam
    Sam over 5 years
    I have the correct permission in Manifest file, and it works fine on android 7.1, but tried on android 9.0 not working, requestPermission did the trick, thx!!
  • alex_z
    alex_z over 5 years
    This sorted my issue with API 26+
  • claudevandort
    claudevandort over 5 years
    In my case I was asking for permissions in the manifest, but somehow it was disabled in App permissions. You saved my life, I love youu! ❤❤❤
  • Randy
    Randy almost 5 years
    For some reason, I just had to toggle this permission off then on again and it worked.
  • KisnardOnline
    KisnardOnline almost 4 years
    Bless your heart! Not sure how I missed this or why Android Studio didn't forcibly warn me that was deprecated. Seems like a big deal to remove that.
  • Fisher
    Fisher almost 4 years
    For targetSdkVersion 29, there may be some differences. getExternalFilesDir(null) is the directory of the app which is created in .../Android/data/ with app-package-name. If someone's old app created some directory in other place, such like in root. This answer cannot cover the issue because they are two different directories. A temporary solution should be this: developer.android.com/training/data-storage/… <application android:requestLegacyExternalStorage="true" ... >
  • BDL
    BDL over 3 years
    Although this code might solve the problem, a good answer should also explain what the code does and how it helps.
  • Kalyan Pradhan
    Kalyan Pradhan over 3 years
    This one fixed my issue too,, I am using targetSdkVersion greater than 29
  • Khay Leng
    Khay Leng about 3 years
    then how to test mkdir() with my phone connected??
  • Johann
    Johann over 2 years
    Nope. Didn't work for me.
  • Johann
    Johann over 2 years
    getExternalFilesDir will only return access to the app's own private data on the external storage. These files/folders are not accessible to other apps.
  • Johann
    Johann over 2 years
    Didn't work for me.