Eacces permission denied ошибка android

I am getting

open failed: EACCES (Permission denied)

on the line OutputStream myOutput = new FileOutputStream(outFileName);

I checked the root, and I tried android.permission.WRITE_EXTERNAL_STORAGE.

How can I fix this problem?

try {
    InputStream myInput;

    myInput = getAssets().open("XXX.db");

    // Path to the just created empty db
    String outFileName = "/data/data/XX/databases/"
            + "XXX.db";

    // Open the empty db as the output stream
    OutputStream myOutput = new FileOutputStream(outFileName);

    // Transfer bytes from the inputfile to the outputfile
    byte[] buffer = new byte[1024];
    int length;
    while ((length = myInput.read(buffer)) > 0) {
        myOutput.write(buffer, 0, length);
    }

    // Close the streams
    myOutput.flush();
    myOutput.close();
    myInput.close();
    buffer = null;
    outFileName = null;
}
catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}

Randika Vishman's user avatar

asked Jan 13, 2012 at 17:03

Mert's user avatar

2

Google has a new feature on Android Q: filtered view for external storage. A quick fix for that is to add this code in the AndroidManifest.xml file:

<manifest ... >
    <!-- This attribute is "false" by default on apps targeting Android Q. -->
    <application android:requestLegacyExternalStorage="true" ... >
     ...
    </application>
</manifest>

You can read more about it here: https://developer.android.com/training/data-storage/use-cases

Edit: I am starting to get downvotes because this answer is out of date for Android 11. So whoever sees this answer please go to the link above and read the instructions.

answered Sep 5, 2019 at 11:38

Uriel Frankel's user avatar

Uriel FrankelUriel Frankel

14.2k8 gold badges47 silver badges68 bronze badges

20

For API 23+ you need to request the read/write permissions even if they are already in your manifest.

// Storage Permissions
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE
};

/**
 * Checks if the app has permission to write to device storage
 *
 * If the app does not has permission then the user will be prompted to grant permissions
 *
 * @param activity
 */
public static void verifyStoragePermissions(Activity activity) {
    // Check if we have write permission
    int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);

    if (permission != PackageManager.PERMISSION_GRANTED) {
        // We don't have permission so prompt the user
        ActivityCompat.requestPermissions(
                activity,
                PERMISSIONS_STORAGE,
                REQUEST_EXTERNAL_STORAGE
        );
    }
}

AndroidManifest.xml

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

For official documentation about requesting permissions for API 23+, check https://developer.android.com/training/permissions/requesting.html

Raphael Royer-Rivard's user avatar

answered Oct 22, 2015 at 23:52

Justin Fiedler's user avatar

Justin FiedlerJustin Fiedler

6,4183 gold badges20 silver badges25 bronze badges

9

I had the same problem… The <uses-permission was in the wrong place. This is right:

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

The uses-permission tag needs to be outside the application tag.

Community's user avatar

answered Mar 28, 2012 at 12:33

user462990's user avatar

user462990user462990

5,4523 gold badges33 silver badges35 bronze badges

10

Add android:requestLegacyExternalStorage=»true» to the Android Manifest
It’s worked with Android 10 (Q) at SDK 29+
or After migrating Android X.

 <application
    android:name=".MyApplication"
    android:allowBackup="true"
    android:hardwareAccelerated="true"
    android:icon=""
    android:label=""
    android:largeHeap="true"
    android:supportsRtl=""
    android:theme=""
    android:requestLegacyExternalStorage="true">

answered Dec 10, 2019 at 11:42

rhaldar's user avatar

rhaldarrhaldar

1,06510 silver badges6 bronze badges

3

I have observed this once when running the application inside the emulator. In the emulator settings, you need to specify the size of external storage («SD Card») properly. By default, the «external storage» field is empty, and that probably means there is no such device and EACCES is thrown even if permissions are granted in the manifest.

Peter Mortensen's user avatar

answered Jan 17, 2013 at 9:14

Audrius Meškauskas's user avatar

0

In addition to all the answers, make sure you’re not using your phone as a USB storage.

I was having the same problem on HTC Sensation on USB storage mode enabled. I can still debug/run the app, but I can’t save to external storage.

Peter Mortensen's user avatar

answered Nov 19, 2012 at 8:42

john's user avatar

johnjohn

1,2821 gold badge17 silver badges30 bronze badges

2

Be aware that the solution:

<application ...
    android:requestLegacyExternalStorage="true" ... >

Is temporary, sooner or later your app should be migrated to use Scoped Storage.

In Android 10, you can use the suggested solution to bypass the system restrictions, but in Android 11 (R) it is mandatory to use scoped storage, and your app might break if you kept using the old logic!

This video might be a good help.

answered Jun 23, 2020 at 13:13

omzer's user avatar

omzeromzer

1,08011 silver badges14 bronze badges

0

My issue was with «TargetApi(23)» which is needed if your minSdkVersion is bellow 23.

So, I have request permission with the following snippet

protected boolean shouldAskPermissions() {
    return (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1);
}

@TargetApi(23)
protected void askPermissions() {
    String[] permissions = {
            "android.permission.READ_EXTERNAL_STORAGE",
            "android.permission.WRITE_EXTERNAL_STORAGE"
    };
    int requestCode = 200;
    requestPermissions(permissions, requestCode);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
// ...
    if (shouldAskPermissions()) {
        askPermissions();
    }
}

answered Oct 27, 2016 at 6:09

Piroxiljin's user avatar

PiroxiljinPiroxiljin

6016 silver badges14 bronze badges

0

Android 10 (API 29) introduces Scoped Storage. Changing your manifest to request legacy storage is not a long-term solution.

I fixed the issue when I replaced my previous instances of Environment.getExternalStorageDirectory() (which is deprecated with API 29) with context.getExternalFilesDir(null).

Note that context.getExternalFilesDir(type) can return null if the storage location isn’t available, so be sure to check that whenever you’re checking if you have external permissions.

Read more here.

answered Oct 21, 2019 at 15:05

jacoballenwood's user avatar

jacoballenwoodjacoballenwood

2,7472 gold badges23 silver badges39 bronze badges

3

I’m experiencing the same. What I found is that if you go to Settings -> Application Manager -> Your App -> Permissions -> Enable Storage, it solves the issue.

answered Feb 8, 2018 at 6:26

Atul Kaushik's user avatar

Atul KaushikAtul Kaushik

5,1713 gold badges28 silver badges36 bronze badges

1

It turned out, it was a stupid mistake since I had my phone still connected to the desktop PC and didn’t realize this.

So I had to turn off the USB connection and everything worked fine.

Peter Mortensen's user avatar

answered Nov 26, 2012 at 16:49

Tobias Reich's user avatar

Tobias ReichTobias Reich

4,9023 gold badges45 silver badges90 bronze badges

3

I had the same problem on Samsung Galaxy Note 3, running CM 12.1. The issue for me was that i had

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

and had to use it to take and store user photos. When I tried to load those same photos in ImageLoader i got the (Permission denied) error. The solution was to explicitly add

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

since the above permission only limits the write permission up to API version 18, and with it the read permission.

answered Oct 14, 2015 at 13:42

ZooS's user avatar

ZooSZooS

6488 silver badges17 bronze badges

1

In addition to all answers, if the clients are using Android 6.0, Android added new permission model for (Marshmallow).

Trick: If you are targeting version 22 or below, your application will request all permissions at install time just as it would on any device running an OS below Marshmallow. If you are trying on the emulator then from android 6.0 onwards you need to explicitly go the settings->apps-> YOURAPP -> permissions and change the permission if you have given any.

change_is_necessity's user avatar

answered Apr 6, 2016 at 22:53

Nourdine Alouane's user avatar

1

Strangely after putting a slash «/» before my newFile my problem was solved. I changed this:

File myFile= new File(Environment.getExternalStorageDirectory() + "newFile");

to this:

File myFile= new File(Environment.getExternalStorageDirectory() + "/newFile");

UPDATE:
as mentioned in the comments, the right way to do this is:

File myFile= new File(Environment.getExternalStorageDirectory(), "newFile");

answered Dec 17, 2016 at 21:51

Darush's user avatar

DarushDarush

11.3k9 gold badges62 silver badges60 bronze badges

10

I had the same problem and none of suggestions helped. But I found an interesting reason for that, on a physical device, Galaxy Tab.

When USB storage is on, external storage read and write permissions don’t have any effect.
Just turn off USB storage, and with the correct permissions, you’ll have the problem solved.

Peter Mortensen's user avatar

answered Jul 19, 2014 at 16:52

Hamlet Kraskian's user avatar

1

To store a file in a directory which is foreign to the app’s directory is restricted above API 29+. So to generate a new file or to create a new file use your application directory like this :-

So the correct approach is :-

val file = File(appContext.applicationInfo.dataDir + File.separator + "anyRandomFileName/")

You can write any data into this generated file !

The above file is accessible and would not throw any exception because it resides in your own developed app’s directory.

The other option is android:requestLegacyExternalStorage="true" in manifest application tag as suggested by Uriel but its not a permanent solution !

answered Apr 1, 2020 at 12:38

Santanu Sur's user avatar

Santanu SurSantanu Sur

10.9k7 gold badges31 silver badges51 bronze badges

1

I would expect everything below /data to belong to «internal storage». You should, however, be able to write to /sdcard.

answered Jan 13, 2012 at 17:09

ovenror's user avatar

ovenrorovenror

5524 silver badges11 bronze badges

2

Change a permission property in your /system/etc/permission/platform.xml
and group need to mentioned as like below.

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">
    <group android:gid="sdcard_rw" />
    <group android:gid="media_rw" />    
</uses-permission>

AbdulMomen عبدالمؤمن's user avatar

answered Dec 4, 2013 at 15:47

Prabakaran's user avatar

PrabakaranPrabakaran

1281 silver badge9 bronze badges

2

I had the same error when was trying to write an image in DCIM/camera folder on Galaxy S5 (android 6.0.1) and I figured out that only this folder is restricted. I simply could write into DCIM/any folder but not in camera.
This should be brand based restriction/customization.

answered Aug 21, 2016 at 12:43

Mahdi Mehrizi's user avatar

Maybe the answer is this:

on the API >= 23 devices, if you install app (the app is not system app), you should check the storage permission in «Setting — applications», there is permission list for every app, you should check it on! try

answered Apr 28, 2017 at 2:25

Jason Zhu's user avatar

Jason ZhuJason Zhu

731 silver badge6 bronze badges

When your application belongs to the system application, it can’t access the SD card.

Peter Mortensen's user avatar

answered Nov 21, 2012 at 7:41

will's user avatar

0

keep in mind that even if you set all the correct permissions in the manifest:
The only place 3rd party apps are allowed to write on your external card are «their own directories»
(i.e. /sdcard/Android/data/)
trying to write to anywhere else: you will get exception:
EACCES (Permission denied)

answered Dec 25, 2018 at 20:31

Elad's user avatar

EladElad

1,52712 silver badges10 bronze badges

Environment.getExternalStoragePublicDirectory();

When using this deprecated method from Android 29 onwards you will receive the same error:

java.io.FileNotFoundException: open failed: EACCES (Permission denied)

Resolution here:

getExternalStoragePublicDirectory deprecated in Android Q

answered Jul 19, 2019 at 11:58

user2965003's user avatar

user2965003user2965003

3262 silver badges11 bronze badges

0

In my case I was using a file picker library which returned the path to external storage but it started from /root/. And even with the WRITE_EXTERNAL_STORAGE permission granted at runtime I still got error EACCES (Permission denied).
So use Environment.getExternalStorageDirectory() to get the correct path to external storage.

Example:
Cannot write: /root/storage/emulated/0/newfile.txt
Can write: /storage/emulated/0/newfile.txt

boolean externalStorageWritable = isExternalStorageWritable();
File file = new File(filePath);
boolean canWrite = file.canWrite();
boolean isFile = file.isFile();
long usableSpace = file.getUsableSpace();

Log.d(TAG, "externalStorageWritable: " + externalStorageWritable);
Log.d(TAG, "filePath: " + filePath);
Log.d(TAG, "canWrite: " + canWrite);
Log.d(TAG, "isFile: " + isFile);
Log.d(TAG, "usableSpace: " + usableSpace);

/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        return true;
    }
    return false;
}

Output 1:

externalStorageWritable: true
filePath: /root/storage/emulated/0/newfile.txt
isFile: false
usableSpace: 0

Output 2:

externalStorageWritable: true
filePath: /storage/emulated/0/newfile.txt
isFile: true
usableSpace: 1331007488

answered Aug 28, 2017 at 19:51

vovahost's user avatar

vovahostvovahost

33.5k16 gold badges111 silver badges111 bronze badges

1

I am creating a folder under /data/ in my init.rc (mucking around with the aosp on Nexus 7) and had exactly this problem.

It turned out that giving the folder rw (666) permission was not sufficient and it had to be rwx (777) then it all worked!

answered Jan 6, 2015 at 10:56

lane's user avatar

lanelane

62312 silver badges18 bronze badges

The post 6.0 enforcement of storage permissions can be bypassed if you have a rooted device via these adb commands:

root@msm8996:/ # getenforce
getenforce
Enforcing
root@msm8996:/ # setenforce 0
setenforce 0
root@msm8996:/ # getenforce
getenforce
Permissive

Sergey Vyacheslavovich Brunov's user avatar

answered Apr 7, 2016 at 1:22

Zakir's user avatar

ZakirZakir

2,20220 silver badges31 bronze badges

i faced the same error on xiaomi devices (android 10 ). The following code fixed my problem.
Libraries: Dexter(https://github.com/Karumi/Dexter) and Image picker(https://github.com/Dhaval2404/ImagePicker)

Add manifest ( android:requestLegacyExternalStorage=»true»)

    public void showPickImageSheet(AddImageModel model) {
    BottomSheetHelper.showPickImageSheet(this, new BottomSheetHelper.PickImageDialogListener() {
        @Override
        public void onChooseFromGalleryClicked(Dialog dialog) {
            selectedImagePickerPosition = model.getPosition();
            Dexter.withContext(OrderReviewActivity.this)                   .withPermissions(Manifest.permission.READ_EXTERNAL_STORAGE)
                    .withListener(new MultiplePermissionsListener() {
                        @Override
                        public void onPermissionsChecked(MultiplePermissionsReport report) {
                            if (report.areAllPermissionsGranted()) {
                                ImagePicker.with(OrderReviewActivity.this)
                                        .galleryOnly()
                                        .compress(512)
                                        .maxResultSize(852,480)
                               .start();
                            }
                        }

                        @Override
                        public void onPermissionRationaleShouldBeShown(List<PermissionRequest> list, PermissionToken permissionToken) {
                            permissionToken.continuePermissionRequest();
                        }

                    }).check();

            dialog.dismiss();
        }

        @Override
        public void onTakePhotoClicked(Dialog dialog) {
            selectedImagePickerPosition = model.getPosition();
            ImagePicker.with(OrderReviewActivity.this)
                    .cameraOnly()
                    .compress(512)
                    .maxResultSize(852,480)
                    .start();

            dialog.dismiss();
        }

        @Override
        public void onCancelButtonClicked(Dialog dialog) {
            dialog.dismiss();
        }
    });
}

answered Nov 29, 2021 at 7:47

Yasin Ege's user avatar

Yasin EgeYasin Ege

5873 silver badges13 bronze badges

In my case the error was appearing on the line

      target.createNewFile();

since I could not create a new file on the sd card,so I had to use the DocumentFile approach.

      documentFile.createFile(mime, target.getName());

For the above question the problem may be solved with this approach,

    fos=context.getContentResolver().openOutputStream(documentFile.getUri());

See this thread too,
How to use the new SD card access API presented for Android 5.0 (Lollipop)?

answered Apr 7, 2019 at 3:46

Sumit Garai's user avatar

Sumit GaraiSumit Garai

1,1658 silver badges6 bronze badges

I Use the below process to handle the case with android 11 and targetapi30

  1. As pre-created file dir as per scoped storage in my case in root dir files//<Image/Video… as per requirement>

  2. Copy picked file and copy the file in cache directory at the time of picking from my external storage

  3. Then at a time to upload ( on my send/upload button click) copy the file from cache dir to my scoped storage dir and then do my upload process

use this solution due to at time upload app in play store it generates warning for MANAGE_EXTERNAL_STORAGE permission and sometimes rejected from play store in my case.

Also as we used target API 30 so we can’t share or forward file from our internal storage to app

answered Sep 23, 2021 at 11:24

Arpan24x7's user avatar

Arpan24x7Arpan24x7

6485 silver badges23 bronze badges

2022 Kotlin way to ask permission:

private val writeStoragePermissionResult =
   registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->}

private fun askForStoragePermission(): Boolean =
   if (hasPermissions(
           requireContext(),
           Manifest.permission.READ_EXTERNAL_STORAGE,
           Manifest.permission.WRITE_EXTERNAL_STORAGE
       )
   ) {
       true
   } else {
       writeStoragePermissionResult.launch(
           arrayOf(
               Manifest.permission.READ_EXTERNAL_STORAGE,
               Manifest.permission.WRITE_EXTERNAL_STORAGE,
           )
       )
       false
   }

fun hasPermissions(context: Context, vararg permissions: String): Boolean = permissions.all {
    ActivityCompat.checkSelfPermission(context, it) == PackageManager.PERMISSION_GRANTED
}

answered Jun 3, 2022 at 12:17

Guopeng Li's user avatar

Guopeng LiGuopeng Li

811 silver badge9 bronze badges

I am getting

open failed: EACCES (Permission denied)

on the line OutputStream myOutput = new FileOutputStream(outFileName);

I checked the root, and I tried android.permission.WRITE_EXTERNAL_STORAGE.

How can I fix this problem?

try {
    InputStream myInput;

    myInput = getAssets().open("XXX.db");

    // Path to the just created empty db
    String outFileName = "/data/data/XX/databases/"
            + "XXX.db";

    // Open the empty db as the output stream
    OutputStream myOutput = new FileOutputStream(outFileName);

    // Transfer bytes from the inputfile to the outputfile
    byte[] buffer = new byte[1024];
    int length;
    while ((length = myInput.read(buffer)) > 0) {
        myOutput.write(buffer, 0, length);
    }

    // Close the streams
    myOutput.flush();
    myOutput.close();
    myInput.close();
    buffer = null;
    outFileName = null;
}
catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}

Randika Vishman's user avatar

asked Jan 13, 2012 at 17:03

Mert's user avatar

2

Google has a new feature on Android Q: filtered view for external storage. A quick fix for that is to add this code in the AndroidManifest.xml file:

<manifest ... >
    <!-- This attribute is "false" by default on apps targeting Android Q. -->
    <application android:requestLegacyExternalStorage="true" ... >
     ...
    </application>
</manifest>

You can read more about it here: https://developer.android.com/training/data-storage/use-cases

Edit: I am starting to get downvotes because this answer is out of date for Android 11. So whoever sees this answer please go to the link above and read the instructions.

answered Sep 5, 2019 at 11:38

Uriel Frankel's user avatar

Uriel FrankelUriel Frankel

14.2k8 gold badges47 silver badges68 bronze badges

20

For API 23+ you need to request the read/write permissions even if they are already in your manifest.

// Storage Permissions
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE
};

/**
 * Checks if the app has permission to write to device storage
 *
 * If the app does not has permission then the user will be prompted to grant permissions
 *
 * @param activity
 */
public static void verifyStoragePermissions(Activity activity) {
    // Check if we have write permission
    int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);

    if (permission != PackageManager.PERMISSION_GRANTED) {
        // We don't have permission so prompt the user
        ActivityCompat.requestPermissions(
                activity,
                PERMISSIONS_STORAGE,
                REQUEST_EXTERNAL_STORAGE
        );
    }
}

AndroidManifest.xml

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

For official documentation about requesting permissions for API 23+, check https://developer.android.com/training/permissions/requesting.html

Raphael Royer-Rivard's user avatar

answered Oct 22, 2015 at 23:52

Justin Fiedler's user avatar

Justin FiedlerJustin Fiedler

6,4183 gold badges20 silver badges25 bronze badges

9

I had the same problem… The <uses-permission was in the wrong place. This is right:

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

The uses-permission tag needs to be outside the application tag.

Community's user avatar

answered Mar 28, 2012 at 12:33

user462990's user avatar

user462990user462990

5,4523 gold badges33 silver badges35 bronze badges

10

Add android:requestLegacyExternalStorage=»true» to the Android Manifest
It’s worked with Android 10 (Q) at SDK 29+
or After migrating Android X.

 <application
    android:name=".MyApplication"
    android:allowBackup="true"
    android:hardwareAccelerated="true"
    android:icon=""
    android:label=""
    android:largeHeap="true"
    android:supportsRtl=""
    android:theme=""
    android:requestLegacyExternalStorage="true">

answered Dec 10, 2019 at 11:42

rhaldar's user avatar

rhaldarrhaldar

1,06510 silver badges6 bronze badges

3

I have observed this once when running the application inside the emulator. In the emulator settings, you need to specify the size of external storage («SD Card») properly. By default, the «external storage» field is empty, and that probably means there is no such device and EACCES is thrown even if permissions are granted in the manifest.

Peter Mortensen's user avatar

answered Jan 17, 2013 at 9:14

Audrius Meškauskas's user avatar

0

In addition to all the answers, make sure you’re not using your phone as a USB storage.

I was having the same problem on HTC Sensation on USB storage mode enabled. I can still debug/run the app, but I can’t save to external storage.

Peter Mortensen's user avatar

answered Nov 19, 2012 at 8:42

john's user avatar

johnjohn

1,2821 gold badge17 silver badges30 bronze badges

2

Be aware that the solution:

<application ...
    android:requestLegacyExternalStorage="true" ... >

Is temporary, sooner or later your app should be migrated to use Scoped Storage.

In Android 10, you can use the suggested solution to bypass the system restrictions, but in Android 11 (R) it is mandatory to use scoped storage, and your app might break if you kept using the old logic!

This video might be a good help.

answered Jun 23, 2020 at 13:13

omzer's user avatar

omzeromzer

1,08011 silver badges14 bronze badges

0

My issue was with «TargetApi(23)» which is needed if your minSdkVersion is bellow 23.

So, I have request permission with the following snippet

protected boolean shouldAskPermissions() {
    return (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1);
}

@TargetApi(23)
protected void askPermissions() {
    String[] permissions = {
            "android.permission.READ_EXTERNAL_STORAGE",
            "android.permission.WRITE_EXTERNAL_STORAGE"
    };
    int requestCode = 200;
    requestPermissions(permissions, requestCode);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
// ...
    if (shouldAskPermissions()) {
        askPermissions();
    }
}

answered Oct 27, 2016 at 6:09

Piroxiljin's user avatar

PiroxiljinPiroxiljin

6016 silver badges14 bronze badges

0

Android 10 (API 29) introduces Scoped Storage. Changing your manifest to request legacy storage is not a long-term solution.

I fixed the issue when I replaced my previous instances of Environment.getExternalStorageDirectory() (which is deprecated with API 29) with context.getExternalFilesDir(null).

Note that context.getExternalFilesDir(type) can return null if the storage location isn’t available, so be sure to check that whenever you’re checking if you have external permissions.

Read more here.

answered Oct 21, 2019 at 15:05

jacoballenwood's user avatar

jacoballenwoodjacoballenwood

2,7472 gold badges23 silver badges39 bronze badges

3

I’m experiencing the same. What I found is that if you go to Settings -> Application Manager -> Your App -> Permissions -> Enable Storage, it solves the issue.

answered Feb 8, 2018 at 6:26

Atul Kaushik's user avatar

Atul KaushikAtul Kaushik

5,1713 gold badges28 silver badges36 bronze badges

1

It turned out, it was a stupid mistake since I had my phone still connected to the desktop PC and didn’t realize this.

So I had to turn off the USB connection and everything worked fine.

Peter Mortensen's user avatar

answered Nov 26, 2012 at 16:49

Tobias Reich's user avatar

Tobias ReichTobias Reich

4,9023 gold badges45 silver badges90 bronze badges

3

I had the same problem on Samsung Galaxy Note 3, running CM 12.1. The issue for me was that i had

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

and had to use it to take and store user photos. When I tried to load those same photos in ImageLoader i got the (Permission denied) error. The solution was to explicitly add

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

since the above permission only limits the write permission up to API version 18, and with it the read permission.

answered Oct 14, 2015 at 13:42

ZooS's user avatar

ZooSZooS

6488 silver badges17 bronze badges

1

In addition to all answers, if the clients are using Android 6.0, Android added new permission model for (Marshmallow).

Trick: If you are targeting version 22 or below, your application will request all permissions at install time just as it would on any device running an OS below Marshmallow. If you are trying on the emulator then from android 6.0 onwards you need to explicitly go the settings->apps-> YOURAPP -> permissions and change the permission if you have given any.

change_is_necessity's user avatar

answered Apr 6, 2016 at 22:53

Nourdine Alouane's user avatar

1

Strangely after putting a slash «/» before my newFile my problem was solved. I changed this:

File myFile= new File(Environment.getExternalStorageDirectory() + "newFile");

to this:

File myFile= new File(Environment.getExternalStorageDirectory() + "/newFile");

UPDATE:
as mentioned in the comments, the right way to do this is:

File myFile= new File(Environment.getExternalStorageDirectory(), "newFile");

answered Dec 17, 2016 at 21:51

Darush's user avatar

DarushDarush

11.3k9 gold badges62 silver badges60 bronze badges

10

I had the same problem and none of suggestions helped. But I found an interesting reason for that, on a physical device, Galaxy Tab.

When USB storage is on, external storage read and write permissions don’t have any effect.
Just turn off USB storage, and with the correct permissions, you’ll have the problem solved.

Peter Mortensen's user avatar

answered Jul 19, 2014 at 16:52

Hamlet Kraskian's user avatar

1

To store a file in a directory which is foreign to the app’s directory is restricted above API 29+. So to generate a new file or to create a new file use your application directory like this :-

So the correct approach is :-

val file = File(appContext.applicationInfo.dataDir + File.separator + "anyRandomFileName/")

You can write any data into this generated file !

The above file is accessible and would not throw any exception because it resides in your own developed app’s directory.

The other option is android:requestLegacyExternalStorage="true" in manifest application tag as suggested by Uriel but its not a permanent solution !

answered Apr 1, 2020 at 12:38

Santanu Sur's user avatar

Santanu SurSantanu Sur

10.9k7 gold badges31 silver badges51 bronze badges

1

I would expect everything below /data to belong to «internal storage». You should, however, be able to write to /sdcard.

answered Jan 13, 2012 at 17:09

ovenror's user avatar

ovenrorovenror

5524 silver badges11 bronze badges

2

Change a permission property in your /system/etc/permission/platform.xml
and group need to mentioned as like below.

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">
    <group android:gid="sdcard_rw" />
    <group android:gid="media_rw" />    
</uses-permission>

AbdulMomen عبدالمؤمن's user avatar

answered Dec 4, 2013 at 15:47

Prabakaran's user avatar

PrabakaranPrabakaran

1281 silver badge9 bronze badges

2

I had the same error when was trying to write an image in DCIM/camera folder on Galaxy S5 (android 6.0.1) and I figured out that only this folder is restricted. I simply could write into DCIM/any folder but not in camera.
This should be brand based restriction/customization.

answered Aug 21, 2016 at 12:43

Mahdi Mehrizi's user avatar

Maybe the answer is this:

on the API >= 23 devices, if you install app (the app is not system app), you should check the storage permission in «Setting — applications», there is permission list for every app, you should check it on! try

answered Apr 28, 2017 at 2:25

Jason Zhu's user avatar

Jason ZhuJason Zhu

731 silver badge6 bronze badges

When your application belongs to the system application, it can’t access the SD card.

Peter Mortensen's user avatar

answered Nov 21, 2012 at 7:41

will's user avatar

0

keep in mind that even if you set all the correct permissions in the manifest:
The only place 3rd party apps are allowed to write on your external card are «their own directories»
(i.e. /sdcard/Android/data/)
trying to write to anywhere else: you will get exception:
EACCES (Permission denied)

answered Dec 25, 2018 at 20:31

Elad's user avatar

EladElad

1,52712 silver badges10 bronze badges

Environment.getExternalStoragePublicDirectory();

When using this deprecated method from Android 29 onwards you will receive the same error:

java.io.FileNotFoundException: open failed: EACCES (Permission denied)

Resolution here:

getExternalStoragePublicDirectory deprecated in Android Q

answered Jul 19, 2019 at 11:58

user2965003's user avatar

user2965003user2965003

3262 silver badges11 bronze badges

0

In my case I was using a file picker library which returned the path to external storage but it started from /root/. And even with the WRITE_EXTERNAL_STORAGE permission granted at runtime I still got error EACCES (Permission denied).
So use Environment.getExternalStorageDirectory() to get the correct path to external storage.

Example:
Cannot write: /root/storage/emulated/0/newfile.txt
Can write: /storage/emulated/0/newfile.txt

boolean externalStorageWritable = isExternalStorageWritable();
File file = new File(filePath);
boolean canWrite = file.canWrite();
boolean isFile = file.isFile();
long usableSpace = file.getUsableSpace();

Log.d(TAG, "externalStorageWritable: " + externalStorageWritable);
Log.d(TAG, "filePath: " + filePath);
Log.d(TAG, "canWrite: " + canWrite);
Log.d(TAG, "isFile: " + isFile);
Log.d(TAG, "usableSpace: " + usableSpace);

/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        return true;
    }
    return false;
}

Output 1:

externalStorageWritable: true
filePath: /root/storage/emulated/0/newfile.txt
isFile: false
usableSpace: 0

Output 2:

externalStorageWritable: true
filePath: /storage/emulated/0/newfile.txt
isFile: true
usableSpace: 1331007488

answered Aug 28, 2017 at 19:51

vovahost's user avatar

vovahostvovahost

33.5k16 gold badges111 silver badges111 bronze badges

1

I am creating a folder under /data/ in my init.rc (mucking around with the aosp on Nexus 7) and had exactly this problem.

It turned out that giving the folder rw (666) permission was not sufficient and it had to be rwx (777) then it all worked!

answered Jan 6, 2015 at 10:56

lane's user avatar

lanelane

62312 silver badges18 bronze badges

The post 6.0 enforcement of storage permissions can be bypassed if you have a rooted device via these adb commands:

root@msm8996:/ # getenforce
getenforce
Enforcing
root@msm8996:/ # setenforce 0
setenforce 0
root@msm8996:/ # getenforce
getenforce
Permissive

Sergey Vyacheslavovich Brunov's user avatar

answered Apr 7, 2016 at 1:22

Zakir's user avatar

ZakirZakir

2,20220 silver badges31 bronze badges

i faced the same error on xiaomi devices (android 10 ). The following code fixed my problem.
Libraries: Dexter(https://github.com/Karumi/Dexter) and Image picker(https://github.com/Dhaval2404/ImagePicker)

Add manifest ( android:requestLegacyExternalStorage=»true»)

    public void showPickImageSheet(AddImageModel model) {
    BottomSheetHelper.showPickImageSheet(this, new BottomSheetHelper.PickImageDialogListener() {
        @Override
        public void onChooseFromGalleryClicked(Dialog dialog) {
            selectedImagePickerPosition = model.getPosition();
            Dexter.withContext(OrderReviewActivity.this)                   .withPermissions(Manifest.permission.READ_EXTERNAL_STORAGE)
                    .withListener(new MultiplePermissionsListener() {
                        @Override
                        public void onPermissionsChecked(MultiplePermissionsReport report) {
                            if (report.areAllPermissionsGranted()) {
                                ImagePicker.with(OrderReviewActivity.this)
                                        .galleryOnly()
                                        .compress(512)
                                        .maxResultSize(852,480)
                               .start();
                            }
                        }

                        @Override
                        public void onPermissionRationaleShouldBeShown(List<PermissionRequest> list, PermissionToken permissionToken) {
                            permissionToken.continuePermissionRequest();
                        }

                    }).check();

            dialog.dismiss();
        }

        @Override
        public void onTakePhotoClicked(Dialog dialog) {
            selectedImagePickerPosition = model.getPosition();
            ImagePicker.with(OrderReviewActivity.this)
                    .cameraOnly()
                    .compress(512)
                    .maxResultSize(852,480)
                    .start();

            dialog.dismiss();
        }

        @Override
        public void onCancelButtonClicked(Dialog dialog) {
            dialog.dismiss();
        }
    });
}

answered Nov 29, 2021 at 7:47

Yasin Ege's user avatar

Yasin EgeYasin Ege

5873 silver badges13 bronze badges

In my case the error was appearing on the line

      target.createNewFile();

since I could not create a new file on the sd card,so I had to use the DocumentFile approach.

      documentFile.createFile(mime, target.getName());

For the above question the problem may be solved with this approach,

    fos=context.getContentResolver().openOutputStream(documentFile.getUri());

See this thread too,
How to use the new SD card access API presented for Android 5.0 (Lollipop)?

answered Apr 7, 2019 at 3:46

Sumit Garai's user avatar

Sumit GaraiSumit Garai

1,1658 silver badges6 bronze badges

I Use the below process to handle the case with android 11 and targetapi30

  1. As pre-created file dir as per scoped storage in my case in root dir files//<Image/Video… as per requirement>

  2. Copy picked file and copy the file in cache directory at the time of picking from my external storage

  3. Then at a time to upload ( on my send/upload button click) copy the file from cache dir to my scoped storage dir and then do my upload process

use this solution due to at time upload app in play store it generates warning for MANAGE_EXTERNAL_STORAGE permission and sometimes rejected from play store in my case.

Also as we used target API 30 so we can’t share or forward file from our internal storage to app

answered Sep 23, 2021 at 11:24

Arpan24x7's user avatar

Arpan24x7Arpan24x7

6485 silver badges23 bronze badges

2022 Kotlin way to ask permission:

private val writeStoragePermissionResult =
   registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->}

private fun askForStoragePermission(): Boolean =
   if (hasPermissions(
           requireContext(),
           Manifest.permission.READ_EXTERNAL_STORAGE,
           Manifest.permission.WRITE_EXTERNAL_STORAGE
       )
   ) {
       true
   } else {
       writeStoragePermissionResult.launch(
           arrayOf(
               Manifest.permission.READ_EXTERNAL_STORAGE,
               Manifest.permission.WRITE_EXTERNAL_STORAGE,
           )
       )
       false
   }

fun hasPermissions(context: Context, vararg permissions: String): Boolean = permissions.all {
    ActivityCompat.checkSelfPermission(context, it) == PackageManager.PERMISSION_GRANTED
}

answered Jun 3, 2022 at 12:17

Guopeng Li's user avatar

Guopeng LiGuopeng Li

811 silver badge9 bronze badges

Environment info

System:
    OS: Linux 4.15 Ubuntu 18.04.3 LTS (Bionic Beaver)
    CPU: (8) x64 Intel(R) Core(TM) i7-9700K CPU @ 3.60GHz
    Memory: 2.16 GB / 61.90 GB
    Shell: 5.4.2 - /bin/zsh
  Binaries:
    Node: 13.2.0 - ~/.nvm/versions/node/v13.2.0/bin/node
    Yarn: 1.19.1 - /usr/bin/yarn
    npm: 6.13.1 - ~/.nvm/versions/node/v13.2.0/bin/npm
  SDKs:
    Android SDK:
      API Levels: 23, 26, 28, 29
      Build Tools: 23.0.1, 25.0.0, 28.0.3, 29.0.0, 29.0.2
      System Images: android-28 | Google APIs Intel x86 Atom_64, android-29 | Intel x86 Atom, android-29 | Google APIs Intel x86 Atom, android-29 | Google APIs Intel x86 Atom_64
  npmPackages:
    react: 16.9.0 => 16.9.0 
    react-native: 0.61.4 => 0.61.4

Library version:
1.1.0

Steps To Reproduce

ImagePicker.launchImageLibrary(
  {
    title: "Select QR Code",
    storageOptions: {
      skipBackup: true,
      path: "images",
    },
    mediaType: "photo",
  },
  response => {
    console.log("Response = ", response)
    if (response.didCancel) {
      console.log("User cancelled image picker")
    } else if (response.error) {
      console.log("ImagePicker Error: ", response.error)
      Alert.alert("Error", response.error)
    } else {
      // process image here
    }
  },
)

The system permission dialogue is prompted and accepted. The proper permissions are without certain given. The app has the following in AndroidManifest:

  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.CAMERA" />
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  <uses-permission android:name="android.permission.VIBRATE" />
  <uses-permission android:name="android.permission.READ_CONTACTS" />

But despite this the library returns a permission denied error every time like this:

/storage/emulated/0/DCIM/Camera/IMG_20191125_203629.jpg: open failed: EACCES (Permission denied)

Note: everything works as expected in the simulator but the permission error happens on a real device.

The simulator is running Android 28 and device is running Android 29 — is this an issue in the latest Android API version?

Google has a new feature on Android Q: filtered view for external storage. A quick fix for that is to add this code in the AndroidManifest.xml file:

<manifest ... >
    <!-- This attribute is "false" by default on apps targeting Android Q. -->
    <application android:requestLegacyExternalStorage="true" ... >
     ...
    </application>
</manifest>

You can read more about it here: https://developer.android.com/training/data-storage/use-cases

Edit: I am starting to get downvotes because this answer is out of date for Android 11. So whoever sees this answer please go to the link above and read the instructions.


answered Sep 5, 2019 at 11:38

user avatar

Uriel FrankelUriel Frankel

13.5k8 gold badges44 silver badges65 bronze badges

19

For API 23+ you need to request the read/write permissions even if they are already in your manifest.

// Storage Permissions
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE
};

/**
 * Checks if the app has permission to write to device storage
 *
 * If the app does not has permission then the user will be prompted to grant permissions
 *
 * @param activity
 */
public static void verifyStoragePermissions(Activity activity) {
    // Check if we have write permission
    int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);

    if (permission != PackageManager.PERMISSION_GRANTED) {
        // We don't have permission so prompt the user
        ActivityCompat.requestPermissions(
                activity,
                PERMISSIONS_STORAGE,
                REQUEST_EXTERNAL_STORAGE
        );
    }
}

AndroidManifest.xml

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

For official documentation about requesting permissions for API 23+, check https://developer.android.com/training/permissions/requesting.html


answered Oct 22, 2015 at 23:52

user avatar

Justin FiedlerJustin Fiedler

6,2263 gold badges19 silver badges23 bronze badges

9

I had the same problem… The <uses-permission was in the wrong place. This is right:

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

The uses-permission tag needs to be outside the application tag.


answered Mar 28, 2012 at 12:33

user avatar

user462990user462990

5,3843 gold badges32 silver badges35 bronze badges

10

Add android:requestLegacyExternalStorage=”true” to the Android Manifest
It’s worked with Android 10 (Q) at SDK 29+

or After migrating Android X.

 <application
    android:name=".MyApplication"
    android:allowBackup="true"
    android:hardwareAccelerated="true"
    android:icon=""
    android:label=""
    android:largeHeap="true"
    android:supportsRtl=""
    android:theme=""
    android:requestLegacyExternalStorage="true">


answered Dec 10, 2019 at 11:42

user avatar

rhaldarrhaldar

1,05510 silver badges6 bronze badges

3

I have observed this once when running the application inside the emulator. In the emulator settings, you need to specify the size of external storage (“SD Card”) properly. By default, the “external storage” field is empty, and that probably means there is no such device and EACCES is thrown even if permissions are granted in the manifest.

user avatar

Peter Mortensen

30.4k21 gold badges102 silver badges124 bronze badges


answered Jan 17, 2013 at 9:14

user avatar

Audrius MeškauskasAudrius Meškauskas

20.2k11 gold badges71 silver badges85 bronze badges

In addition to all the answers, make sure you’re not using your phone as a USB storage.

I was having the same problem on HTC Sensation on USB storage mode enabled. I can still debug/run the app, but I can’t save to external storage.

user avatar

Peter Mortensen

30.4k21 gold badges102 silver badges124 bronze badges


answered Nov 19, 2012 at 8:42

user avatar

johnjohn

1,2821 gold badge17 silver badges30 bronze badges

2

Be aware that the solution:

<application ...
    android:requestLegacyExternalStorage="true" ... >

Is temporary, sooner or later your app should be migrated to use Scoped Storage.

In Android 10, you can use the suggested solution to bypass the system restrictions, but in Android 11 (R) it is mandatory to use scoped storage, and your app might break if you kept using the old logic!

This video might be a good help.


answered Jun 23, 2020 at 13:13

user avatar

omzeromzer

7047 silver badges12 bronze badges

My issue was with “TargetApi(23)” which is needed if your minSdkVersion is bellow 23.

So, I have request permission with the following snippet

protected boolean shouldAskPermissions() {
    return (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1);
}

@TargetApi(23)
protected void askPermissions() {
    String[] permissions = {
            "android.permission.READ_EXTERNAL_STORAGE",
            "android.permission.WRITE_EXTERNAL_STORAGE"
    };
    int requestCode = 200;
    requestPermissions(permissions, requestCode);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
// ...
    if (shouldAskPermissions()) {
        askPermissions();
    }
}


answered Oct 27, 2016 at 6:09

user avatar

PiroxiljinPiroxiljin

5715 silver badges14 bronze badges

Android 10 (API 29) introduces Scoped Storage. Changing your manifest to request legacy storage is not a long-term solution.

I fixed the issue when I replaced my previous instances of Environment.getExternalStorageDirectory() (which is deprecated with API 29) with context.getExternalFilesDir(null).

Note that context.getExternalFilesDir(type) can return null if the storage location isn’t available, so be sure to check that whenever you’re checking if you have external permissions.

Read more here.


answered Oct 21, 2019 at 15:05

user avatar

jacoballenwoodjacoballenwood

2,5152 gold badges20 silver badges37 bronze badges

3

I’m experiencing the same. What I found is that if you go to Settings -> Application Manager -> Your App -> Permissions -> Enable Storage, it solves the issue.


answered Feb 8, 2018 at 6:26

user avatar

Atul KaushikAtul Kaushik

5,1343 gold badges27 silver badges35 bronze badges

1

It turned out, it was a stupid mistake since I had my phone still connected to the desktop PC and didn’t realize this.

So I had to turn off the USB connection and everything worked fine.

user avatar

Peter Mortensen

30.4k21 gold badges102 silver badges124 bronze badges


answered Nov 26, 2012 at 16:49

user avatar

Tobias ReichTobias Reich

4,7543 gold badges45 silver badges85 bronze badges

3

I had the same problem on Samsung Galaxy Note 3, running CM 12.1. The issue for me was that i had

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

and had to use it to take and store user photos. When I tried to load those same photos in ImageLoader i got the (Permission denied) error. The solution was to explicitly add

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

since the above permission only limits the write permission up to API version 18, and with it the read permission.


answered Oct 14, 2015 at 13:42

user avatar

ZooSZooS

6288 silver badges15 bronze badges

1

In addition to all answers, if the clients are using Android 6.0, Android added new permission model for (Marshmallow).

Trick: If you are targeting version 22 or below, your application will request all permissions at install time just as it would on any device running an OS below Marshmallow. If you are trying on the emulator then from android 6.0 onwards you need to explicitly go the settings->apps-> YOURAPP -> permissions and change the permission if you have given any.


answered Apr 6, 2016 at 22:53

user avatar

1

Strangely after putting a slash “/” before my newFile my problem was solved. I changed this:

File myFile= new File(Environment.getExternalStorageDirectory() + "newFile");

to this:

File myFile= new File(Environment.getExternalStorageDirectory() + "/newFile");

UPDATE:
as mentioned in the comments, the right way to do this is:

File myFile= new File(Environment.getExternalStorageDirectory(), "newFile");


answered Dec 17, 2016 at 21:51

user avatar

DarushDarush

10.7k9 gold badges58 silver badges58 bronze badges

10

I had the same problem and none of suggestions helped. But I found an interesting reason for that, on a physical device, Galaxy Tab.

When USB storage is on, external storage read and write permissions don’t have any effect.
Just turn off USB storage, and with the correct permissions, you’ll have the problem solved.

user avatar

Peter Mortensen

30.4k21 gold badges102 silver badges124 bronze badges


answered Jul 19, 2014 at 16:52

user avatar

1

I would expect everything below /data to belong to “internal storage”. You should, however, be able to write to /sdcard.


answered Jan 13, 2012 at 17:09

user avatar

ovenrorovenror

5224 silver badges11 bronze badges

2

Change a permission property in your /system/etc/permission/platform.xml

and group need to mentioned as like below.

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">
    <group android:gid="sdcard_rw" />
    <group android:gid="media_rw" />    
</uses-permission>


answered Dec 4, 2013 at 15:47

user avatar

PrabakaranPrabakaran

1281 silver badge9 bronze badges

2

I had the same error when was trying to write an image in DCIM/camera folder on Galaxy S5 (android 6.0.1) and I figured out that only this folder is restricted. I simply could write into DCIM/any folder but not in camera.
This should be brand based restriction/customization.


answered Aug 21, 2016 at 12:43

user avatar

Maybe the answer is this:

on the API >= 23 devices, if you install app (the app is not system app), you should check the storage permission in “Setting – applications”, there is permission list for every app, you should check it on! try


answered Apr 28, 2017 at 2:25

user avatar

Jason ZhuJason Zhu

731 silver badge6 bronze badges

To store a file in a directory which is foreign to the app’s directory is restricted above API 29+. So to generate a new file or to create a new file use your application directory like this :-

So the correct approach is :-

val file = File(appContext.applicationInfo.dataDir + File.separator + "anyRandomFileName/")

You can write any data into this generated file !

The above file is accessible and would not throw any exception because it resides in your own developed app’s directory.

The other option is android:requestLegacyExternalStorage=”true” in manifest application tag as suggested by Uriel but its not a permanent solution !


answered Apr 1, 2020 at 12:38

user avatar

Santanu SurSantanu Sur

10.3k7 gold badges30 silver badges49 bronze badges

1

When your application belongs to the system application, it can’t access the SD card.

user avatar

Peter Mortensen

30.4k21 gold badges102 silver badges124 bronze badges


answered Nov 21, 2012 at 7:41

user avatar

willwill

411 bronze badge

keep in mind that even if you set all the correct permissions in the manifest:
The only place 3rd party apps are allowed to write on your external card are “their own directories”
(i.e. /sdcard/Android/data/)
trying to write to anywhere else: you will get exception:
EACCES (Permission denied)


answered Dec 25, 2018 at 20:31

user avatar

EladElad

1,42912 silver badges10 bronze badges

Environment.getExternalStoragePublicDirectory();

When using this deprecated method from Android 29 onwards you will receive the same error:

java.io.FileNotFoundException: open failed: EACCES (Permission denied)

Resolution here:

getExternalStoragePublicDirectory deprecated in Android Q


answered Jul 19, 2019 at 11:58

user avatar

user2965003user2965003

3262 silver badges11 bronze badges

In my case I was using a file picker library which returned the path to external storage but it started from /root/. And even with the WRITE_EXTERNAL_STORAGE permission granted at runtime I still got error EACCES (Permission denied).

So use Environment.getExternalStorageDirectory() to get the correct path to external storage.

Example:

Cannot write: /root/storage/emulated/0/newfile.txt

Can write: /storage/emulated/0/newfile.txt

boolean externalStorageWritable = isExternalStorageWritable();
File file = new File(filePath);
boolean canWrite = file.canWrite();
boolean isFile = file.isFile();
long usableSpace = file.getUsableSpace();

Log.d(TAG, "externalStorageWritable: " + externalStorageWritable);
Log.d(TAG, "filePath: " + filePath);
Log.d(TAG, "canWrite: " + canWrite);
Log.d(TAG, "isFile: " + isFile);
Log.d(TAG, "usableSpace: " + usableSpace);

/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        return true;
    }
    return false;
}

Output 1:

externalStorageWritable: true
filePath: /root/storage/emulated/0/newfile.txt
isFile: false
usableSpace: 0

Output 2:

externalStorageWritable: true
filePath: /storage/emulated/0/newfile.txt
isFile: true
usableSpace: 1331007488


answered Aug 28, 2017 at 19:51

user avatar

vovahostvovahost

31.1k15 gold badges108 silver badges107 bronze badges

1

I am creating a folder under /data/ in my init.rc (mucking around with the aosp on Nexus 7) and had exactly this problem.

It turned out that giving the folder rw (666) permission was not sufficient and it had to be rwx (777) then it all worked!


answered Jan 6, 2015 at 10:56

user avatar

lanelane

61315 silver badges18 bronze badges

The post 6.0 enforcement of storage permissions can be bypassed if you have a rooted device via these adb commands:

root@msm8996:/ # getenforce
getenforce
Enforcing
root@msm8996:/ # setenforce 0
setenforce 0
root@msm8996:/ # getenforce
getenforce
Permissive


answered Apr 7, 2016 at 1:22

user avatar

ZakirZakir

2,17219 silver badges30 bronze badges

In my case the error was appearing on the line

      target.createNewFile();

since I could not create a new file on the sd card,so I had to use the DocumentFile approach.

      documentFile.createFile(mime, target.getName());

For the above question the problem may be solved with this approach,

    fos=context.getContentResolver().openOutputStream(documentFile.getUri());

See this thread too,
How to use the new SD card access API presented for Android 5.0 (Lollipop)?


answered Apr 7, 2019 at 3:46

user avatar

TarasantanTarasantan

9757 silver badges6 bronze badges

I Use the below process to handle the case with android 11 and targetapi30

  1. As pre-created file dir as per scoped storage in my case in root dir files//<Image/Video… as per requirement>

  2. Copy picked file and copy the file in cache directory at the time of picking from my external storage

  3. Then at a time to upload ( on my send/upload button click) copy the file from cache dir to my scoped storage dir and then do my upload process

use this solution due to at time upload app in play store it generates warning for MANAGE_EXTERNAL_STORAGE permission and sometimes rejected from play store in my case.

Also as we used target API 30 so we can’t share or forward file from our internal storage to app


answered Sep 23, 2021 at 11:24

user avatar

Arpan24x7Arpan24x7

6485 silver badges23 bronze badges

i faced the same error on xiaomi devices (android 10 ). The following code fixed my problem.
Libraries: Dexter(https://github.com/Karumi/Dexter) and Image picker(https://github.com/Dhaval2404/ImagePicker)

Add manifest ( android:requestLegacyExternalStorage=”true”)

    public void showPickImageSheet(AddImageModel model) {
    BottomSheetHelper.showPickImageSheet(this, new BottomSheetHelper.PickImageDialogListener() {
        @Override
        public void onChooseFromGalleryClicked(Dialog dialog) {
            selectedImagePickerPosition = model.getPosition();
            Dexter.withContext(OrderReviewActivity.this)                   .withPermissions(Manifest.permission.READ_EXTERNAL_STORAGE)
                    .withListener(new MultiplePermissionsListener() {
                        @Override
                        public void onPermissionsChecked(MultiplePermissionsReport report) {
                            if (report.areAllPermissionsGranted()) {
                                ImagePicker.with(OrderReviewActivity.this)
                                        .galleryOnly()
                                        .compress(512)
                                        .maxResultSize(852,480)
                               .start();
                            }
                        }

                        @Override
                        public void onPermissionRationaleShouldBeShown(List<PermissionRequest> list, PermissionToken permissionToken) {
                            permissionToken.continuePermissionRequest();
                        }

                    }).check();

            dialog.dismiss();
        }

        @Override
        public void onTakePhotoClicked(Dialog dialog) {
            selectedImagePickerPosition = model.getPosition();
            ImagePicker.with(OrderReviewActivity.this)
                    .cameraOnly()
                    .compress(512)
                    .maxResultSize(852,480)
                    .start();

            dialog.dismiss();
        }

        @Override
        public void onCancelButtonClicked(Dialog dialog) {
            dialog.dismiss();
        }
    });
}


answered Nov 29, 2021 at 7:47

user avatar

Yasin EgeYasin Ege

3601 silver badge9 bronze badges

Add Permission in manifest.

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


answered Oct 21, 2016 at 9:53

user avatar

1


Not the answer you’re looking for? Browse other questions tagged android android-5.0-lollipop android-permissions android-storage or ask your own question.

Exception open failed: EACCES (Permission denied) on Android

Google has a new feature on Android Q: filtered view for external storage. A quick fix for that is to add this code in the AndroidManifest.xml file:

<manifest ... >
    <!-- This attribute is false by default on apps targeting Android Q. -->
    <application android_requestLegacyExternalStorage=true ... >
     ...
    </application>
</manifest>

You can read more about it here: https://developer.android.com/training/data-storage/use-cases

Edit: I am starting to get downvotes because this answer is out of date for Android 11. So whoever sees this answer please go to the link above and read the instructions.

For API 23+ you need to request the read/write permissions even if they are already in your manifest.

// Storage Permissions
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE
};

/**
 * Checks if the app has permission to write to device storage
 *
 * If the app does not has permission then the user will be prompted to grant permissions
 *
 * @param activity
 */
public static void verifyStoragePermissions(Activity activity) {
    // Check if we have write permission
    int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);

    if (permission != PackageManager.PERMISSION_GRANTED) {
        // We dont have permission so prompt the user
        ActivityCompat.requestPermissions(
                activity,
                PERMISSIONS_STORAGE,
                REQUEST_EXTERNAL_STORAGE
        );
    }
}

AndroidManifest.xml

<uses-permission android_name=android.permission.READ_EXTERNAL_STORAGE />
<uses-permission android_name=android.permission.WRITE_EXTERNAL_STORAGE />

For official documentation about requesting permissions for API 23+, check https://developer.android.com/training/permissions/requesting.html

Exception open failed: EACCES (Permission denied) on Android

I had the same problem… The <uses-permission was in the wrong place. This is right:

 <manifest>
        <uses-permission android_name=android.permission.WRITE_EXTERNAL_STORAGE/>
        ...
        <application>
            ...
            <activity> 
                ...
            </activity>
        </application>
    </manifest> 

The uses-permission tag needs to be outside the application tag.

Related posts on Android :

  • android – Programmatically Restart a React Native App
  • android – What does adb forward tcp:8080 tcp:8080 command do?
  • android – File.createTempFile() VS new File()
  • Kotlin-allopen for android
  • How to import Action Bar Sherlock? android studio
  • animation – Android – how to get android.R.anim.slide_in_right
  • android – Set notifyDataSetChanged() on Recyclerview adapter
  • adb – Android: adbd cannot run as root in production builds

Понравилась статья? Поделить с друзьями:

Не пропустите эти материалы по теме:

  • Яндекс еда ошибка привязки карты
  • Eac ошибка 30004
  • Eac код ошибки 30007
  • Eac client integrity violation rust ошибка
  • Eab ошибка мерседес актрос что это значит

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии