Open failed eacces permission denied как исправить

I am having a very weird problem with storage accessing on some devices. The app works on my testing devices (Nexus 4 & 7, Samsung GS5). All my devices running Android 4.4.2. But I received many emails from users saying that the app can not write to the storage (neither the internal storage nor the sd card). From the log file received from user feedback, I can see the problem is the following code:

try {
    if (fStream == null) {
    fStream = new FileOutputStream(filename, true);
}
    fStream.write(data, 0, bytes);
    return;
} catch (IOException ex) {
    ex.printStackTrace();
}

It throws exception at the line fStream = new FileOutputStream(filename, true); when creating FileOutputStream.

The stack log is:

W/System.err( 8147): Caused by: java.io.FileNotFoundException: /storage/emulated/0/my_folder/test_file_name.png: open failed: EACCES (Permission denied)
w/System.err( 8147):    at libcore.io.IoBridge.open(IoBridge.java:409)
W/System.err( 8147):    at java.io.FileOutputStream.<init>(FileOutputStream.java:88)
W/System.err( 8147):    at java.io.FileOutputStream.<init>(FileOutputStream.java:128)
W/System.err( 8147):    at myapp.save(SourceFile:515)
W/System.err( 8147):    ... 8 more
W/System.err( 8147): Caused by: libcore.io.ErrnoException: open failed: EACCES (Permission denied)
W/System.err( 8147):    at libcore.io.Posix.open(Native Method)
W/System.err( 8147):    at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
W/System.err( 8147):    at libcore.io.IoBridge.open(IoBridge.java:393)
W/System.err( 8147):    ... 11 more

In the AndroidManifest.xml I have the following permissions declared:

 <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19"/>
    <uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

I’ve confirmed that the users are using the correct app’s private on the SD card. And what’s more weird is that it fails to write to internal storage as well. How can this happen if I have both read & write permissions? The users say they are not connecting their devices to the PC at that time.

Update

It turns out I am calling open and close FileOutputStream too frequently, which throws the FileNotFoundException at some point. Sounds more like a threading issue.

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 badges46 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,4423 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

5915 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,7492 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,1733 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.2k9 gold badges61 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.4k16 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

5893 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?

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

open failed: EISDIR (Is a directory)

When doing the breakpoint resume function of apk, I encountered an open failed problem, which is a relatively simple EISDIR (Is a directory).

Exception description:

java.io.FileNotFoundException: /storage/emulated/0/Android/data/com.xxx.xxx/files/Download: open failed: EISDIR (Is a directory)
        at libcore.io.IoBridge.open(IoBridge.java:487)
        at java.io.RandomAccessFile.<init>(RandomAccessFile.java:117)

The code in question:
randomAccessFile = new RandomAccessFile(file, "rwd");

Looking at the code, I found that when I created the xxx.apk file under xxx/xxx/Download, the path was written to the folder path of the apk file (xxx/xxx/Download), and there was no apk name. Is there, will create an error, plus the apk name just fine (xxx/xxx/Download/xxx.apk).

Another situation that can cause this error is that when creating a file, be sure to note whether there is a duplicate file or folder when the folder where the file is stored (yes, xxx/xxx/Download/xxx.apk) It could also be a folder), and if it is, it cannot be created successfully.

open failed: EACCES (Permission denied)

Checking this question online, I have no intention of slipping to another similar issue (EACCES), this is a permission issue, and record it together.

Option 1. Request permission

Online is generally a solution to add request permissions in the code:

In API23+, you not only need to add permissions in AndroidManifest.xml

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

Also request permission in the JAVA code:

     // 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);
          }
      }

But if there is no context in the class, there is only one context, then you can’t add permissions in this way. You can try the second option.

Option II. New file

Create a new file in the download directory, then go to the directory to write the file.

        File outputFile = new File(getDownloadPath(mContext, fileName));
        outputFile.getAbsolutePath();

        public static String getDownloadPath(Context context, String fileName) {
            return getDownloadPath(context) + File.separator + fileName;
        }

        public static String getDownloadPath(Context context) {
            return context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath();
        }

Answer to the EACCES question in stackoverflow

There are also answers to the EACCES question in stackoverflow.
stackoverflow: open failed: EACCES (Permission denied)

Among them, the high-vote answer is still plus permission, and the first one is its standard translation version :), skipping the table.

The second high ticket answer is the way of the second new file:

I ran into a similar issue a while back.

Your problem could be in two different areas. It’s either how you’re creating the file to write to, or your method of writing could be flawed in that it is phone dependent.

If you’re writing the file to a specific location on the SD card, try using Environment variables. They should always point to a valid location. Here’s an example to write to the downloads folder:

java.io.File xmlFile = new java.io.File(Environment
   .getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
    + "/Filename.xml");

If you’re writing the file to the application’s internal storage. Try this example:

java.io.File xmlFile = new java.io.File((getActivity()
   .getApplicationContext().getFileStreamPath("FileName.xml")
   .getPath()));

Personally I rely on external libraries to handle the streaming to file. This one hasn’t failed me yet.
org.apache.commons.io.FileUtils.copyInputStreamToFile(is, file);
I’ve lost data one too many times on a failed write command, so I rely on well-known and tested libraries for my IO heavy lifting.

One more note, if the files are large, you may also want to look into running the IO in the background, or use callbacks.

The problem of open failed is first recorded here, followed by new discoveries.

Понравилась статья? Поделить с друзьями:
  • Нашел телефон как прошить
  • Как найти водителя на манипулятор
  • Как найти нужную директорию
  • F04 ошибка webasto как исправить ошибку
  • Как исправить тугое тесто на медовик