Exception: 'open failed: EACCES (Permission refusée)' sur Android

je suis

échec de l'ouverture: EACCES (Permission denied)

sur la ligne OutputStream myOutput = new FileOutputStream(outFileName);

j'ai vérifié la racine, et j'ai essayé android.permission.WRITE_EXTERNAL_STORAGE .

Comment puis-je corriger ce problème?

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();
}
209
demandé sur Peter Mortensen 2012-01-13 21:03:52

24 réponses

j'ai eu le même problème... Le <uses-permission était au mauvais endroit. C'est juste:

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

l'étiquette uses-permission doit se trouver à l'extérieur de l'étiquette application .

217
répondu user462990 2016-10-03 20:36:24

pour API 23+ vous devez demander les permissions de lecture / écriture même si elles sont déjà dans votre manifeste.

// 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" />

pour la documentation officielle sur la demande de permissions pour API 23+, cochez https://developer.android.com/training/permissions/requesting.html

294
répondu Justin Fiedler 2016-10-24 04:09:31

j'ai observé une fois lors de l'exécution de l'application à l'intérieur de l'émulateur. Dans les paramètres de l'émulateur, vous devez spécifier la taille de stockage externe (Carte SD"") correctement. Par défaut, le champ" Stockage externe " est vide, ce qui signifie probablement qu'il n'y a pas de tel dispositif et que les EACCES sont lancées même si les permissions sont accordées dans le manifeste.

56
répondu h22 2014-11-30 21:06:49

en plus de toutes les réponses, assurez-vous que vous n'utilisez pas votre téléphone comme un stockage USB.

j'avais le même problème sur la Sensation HTC sur le mode de stockage USB activé. Je peux toujours déboguer/exécuter l'application, mais je ne peux pas sauver au stockage externe.

48
répondu john 2014-11-30 21:04:30

mon problème était avec" TargetApi(23) " qui est nécessaire si votre minSdkVersion est inférieur à 23.

donc, j'ai demandé la permission avec l'extrait suivant

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();
    }
}
25
répondu Piroxiljin 2016-10-27 06:09:59

il s'est avéré, c'était une erreur stupide puisque j'avais mon téléphone toujours connecté à L'ordinateur de bureau et je ne m'en suis pas rendu compte.

donc j'ai dû éteindre la connexion USB et tout a bien fonctionné.

13
répondu Tobias Reich 2014-11-30 21:05:59

J'ai eu le même problème sur Samsung Galaxy Note 3, Avec CM 12.1. Le problème pour moi était que j'avais

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

, et à l'utiliser pour prendre et stocker des photos. Quand J'ai essayé de charger ces mêmes photos dans ImageLoader j'ai eu l'erreur (Permission denied) . La solution était d'ajouter explicitement

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

puisque la permission ci-dessus ne limite la permission d'écriture que jusqu'à la version 18 de L'API, et avec elle la permission de lecture.

13
répondu ZooS 2015-10-14 13:42:15

je vis la même chose. Ce que j'ai trouvé est que si vous allez à Paramètres -> Gestionnaire D'Application -> votre application -> Permissions -> activer le stockage , il résout le problème.

9
répondu Atul Kaushik 2018-02-08 06:26:46

en plus de toutes les réponses, si les clients utilisent Android 6.0, Android a ajouté le nouveau modèle de permission pour (Marshmallow).

Trick: si vous ciblez la version 22 ou moins, votre application demandera toutes les permissions au moment de l'installation tout comme il le ferait sur n'importe quel appareil exécutant un OS sous Marshmallow. Si vous essayez de l'émulateur, puis à partir de android 6.0, vous devez explicitement aller le Paramètres - > apps - > YOURRAPP - > permissions et modifier la permission si vous en avez donné.

7
répondu Nourdine Alouane 2016-09-08 12:24:35

Je m'attendrais à ce que tout ce qui est en dessous de /data appartienne au"stockage interne". Cependant, vous devez être en mesure d'écrire à /sdcard .

5
répondu ovenror 2012-01-13 17:09:24

j'ai eu le même problème et aucune des suggestions n'a aidé. Mais j'ai trouvé une raison intéressante pour cela, sur un appareil physique, Galaxy Tab .

lorsque le stockage USB est activé, les permissions externes de lecture et d'écriture de stockage n'ont aucun effet. Il suffit de désactiver le stockage USB, et avec les bonnes permissions, vous aurez le problème résolu.

5
répondu Hamlet Kraskian 2014-11-30 21:16:36

modifier une propriété de permission dans votre /system/etc/permission/platform.xml

et groupe mentionné comme indiqué ci-dessous.

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">
    <group android:gid="sdcard_rw" />
    <group android:gid="media_rw" />    
</uses-permission>
5
répondu Prabakaran 2016-02-11 09:18:08

lorsque votre application appartient à l'application système, elle ne peut pas accéder à la carte SD.

4
répondu will 2014-11-30 21:05:07

j'ai eu la même erreur quand j'ai essayé d'écrire une image dans le dossier DCIM/camera sur Galaxy S5 (android 6.0.1) et j'ai compris que seul ce dossier est restreint. Je pourrais tout simplement écrire dans DCIM/n'importe quel dossier mais pas à la caméra. Il doit s'agir d'une restriction ou d'une personnalisation fondée sur la marque.

4
répondu RayaFeed 2016-08-21 12:43:36

étrangement après avoir mis une barre oblique "/" avant mon nouveau mon problème a été résolu. J'ai changé ceci:

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

à ceci:

File myFile= new File(Environment.getExternalStorageDirectory() + "/newFile");
4
répondu Darush 2016-12-17 21:51:40

peut-être que la réponse est la suivante:

sur L'API > = 23 périphériques, si vous installez app (l'application n'est pas l'application système), vous devriez vérifier la permission de stockage dans "Paramètres-applications", Il y a une liste de permission pour chaque application, vous devriez La vérifier! essayez

3
répondu Jason Zhu 2017-04-28 02:25:21

dans mon cas, j'utilisais une " file picker library qui renvoyait le chemin au stockage externe mais qui commençait par /root/ . Et même avec la WRITE_EXTERNAL_STORAGE permission accordée à l'exécution j'ai toujours eu l'erreur EACCES (Permission denied) .

Ainsi, utilisez Environment.getExternalStorageDirectory() pour obtenir le chemin correct vers le stockage externe.

exemple:

ne peut pas écrire: /root/storage/emulated/0/newfile.txt

peut écrire: /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;
}

sortie 1:

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

sortie 2:

externalStorageWritable: true
filePath: /storage/emulated/0/newfile.txt
isFile: true
usableSpace: 1331007488
3
répondu vovahost 2017-08-28 20:31:35

je crée un dossier sous /data/ dans mon init.rc (curage autour avec le psba sur la Nexus 7) et eu exactement ce problème.

il s'est avéré que donner la permission du dossier rw (666) n'était pas suffisant et il devait être rwx (777) puis tout a fonctionné!

2
répondu lane 2015-01-06 10:56:20

l'application post 6.0 des permissions de stockage peut être contournée si vous avez un périphérique enraciné via ces commandes adb:

root@msm8996:/ # getenforce
getenforce
Enforcing
root@msm8996:/ # setenforce 0
setenforce 0
root@msm8996:/ # getenforce
getenforce
Permissive
2
répondu Zakir 2016-09-02 21:53:14

ajouter Permission dans le manifeste.

<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"/>
1
répondu Harman Khera 2016-10-21 09:53:03

j'ai eu le même problème (API >= 23).

la solution https://stackoverflow.com/a/13569364/1729501 a fonctionné pour moi, mais il n'était pas pratique de déconnecter l'application pour le débogage.

ma solution a été d'installer le pilote de périphérique adb approprié sur Windows. Le pilote USB de google n'a pas fonctionné pour mon appareil.

étape 1: Téléchargez des pilotes adb pour votre marque de périphérique.

étape 2: Aller à gestionnaire de périphérique - > autres périphériques -> rechercher les entrées avec le mot "adb" - > sélectionner le pilote de mise à jour - > indiquer l'emplacement à l'étape 1

0
répondu user13107 2017-05-23 12:26:24

après avoir ajouté la permission résolu mon problème

<uses-permission android:name="android.permission.INTERNET"/>
0
répondu saigopi 2018-03-02 11:59:29

ajouter Grad dependencies

implementation 'com.karumi:dexter:4.2.0'

Ajouter le code ci-dessous dans votre activité principale.

import com.karumi.dexter.Dexter;
import com.karumi.dexter.MultiplePermissionsReport;
import com.karumi.dexter.PermissionToken;
import com.karumi.dexter.listener.PermissionRequest;
import com.karumi.dexter.listener.multi.MultiplePermissionsListener;
    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);

    new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {


                checkMermission();
            }
        }, 4000);
    }

    private void checkMermission(){
        Dexter.withActivity(this)
                .withPermissions(
                        android.Manifest.permission.READ_EXTERNAL_STORAGE,
                        android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
                        android.Manifest.permission.ACCESS_NETWORK_STATE,
                        Manifest.permission.INTERNET
                ).withListener(new MultiplePermissionsListener() {
            @Override
            public void onPermissionsChecked(MultiplePermissionsReport report) {
                if (report.isAnyPermissionPermanentlyDenied()){
                    checkMermission();
                } else if (report.areAllPermissionsGranted()){
                    // copy some things
                } else {
                    checkMermission();
                }

            }
            @Override
            public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions, PermissionToken token) {
                token.continuePermissionRequest();
            }
        }).check();
    }
0
répondu ethemsulan 2018-04-08 17:06:44

suite à la réponse de user462990

pour être averti lorsque l'utilisateur répond à la boîte de dialogue de demande de permission, utilisez ceci: (code en kotlin)

override fun onRequestPermissionsResult(requestCode: Int,
                           permissions: Array<String>, grantResults: IntArray) {
when (requestCode) {
    MY_PERMISSIONS_REQUEST_READ_CONTACTS -> {
        // If request is cancelled, the result arrays are empty.
        if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) {

            // permission was granted, yay! Do the
            // contacts-related task you need to do.

        } else {

            // permission denied, boo! Disable the
            // functionality that depends on this permission.

        }
        return
    }

    // Add other 'when' lines to check for other
    // permissions this app might request.

    else -> {
        // Ignore all other requests.
    }
}

}

0
répondu user3561494 2018-04-11 15:53:31