Je reçois
échec d'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 résoudre 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();
}
Réponses:
J'ai eu le même problème ...
<uses-permission
C'était au mauvais endroit. C'est juste:La
uses-permission
balise doit être en dehors de laapplication
balise.la source
<uses-permission>
balise apparaît après la<application>
balise"android:maxSdkVersion="18"
. Il générait cette exceptionPour l'API 23+, vous devez demander les autorisations de lecture / écriture même si elles se trouvent déjà dans votre manifeste.
AndroidManifest.xml
Pour obtenir de la documentation officielle sur la demande d'autorisations pour l'API 23+, consultez https://developer.android.com/training/permissions/requesting.html
la source
Google a une nouvelle fonctionnalité sur Android Q : vue filtrée pour le stockage externe. Une solution rapide pour cela consiste à ajouter ce code dans le fichier AndroidManifest.xml:
Vous pouvez en savoir plus à ce sujet ici: https://developer.android.com/training/data-storage/compatibility
la source
android:requestLegacyExternalStorage="true"
ce ne cassera pas les versions inférieures ryt? @UrielFrankelJ'ai observé cela 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 correctement la taille du stockage externe ("carte SD"). Par défaut, le champ "stockage externe" est vide, ce qui signifie probablement qu'il n'y a pas de périphérique de ce type et que EACCES est levé même si des autorisations sont accordées dans le manifeste.
la source
En plus de toutes les réponses, assurez-vous que vous n'utilisez pas votre téléphone comme stockage USB.
J'avais le même problème sur HTC Sensation sur le mode de stockage USB activé. Je peux toujours déboguer / exécuter l'application, mais je ne peux pas enregistrer sur un stockage externe.
la source
Ajouter android: requestLegacyExternalStorage = "true" à l'Android Manifest Il a travaillé avec Android 10 (Q) au SDK 29+
ou après la migration Android X .
la source
Mon problème était avec "TargetApi (23)" qui est nécessaire si votre version minSdk est inférieure à 23.
J'ai donc demandé la permission avec l'extrait de code suivant
la source
Solution pour Android Q :
la source
Je vis la même chose. Ce que j'ai trouvé, c'est que si vous allez dans Paramètres -> Gestionnaire d'applications -> Votre application -> Autorisations -> Activer le stockage , cela résout le problème.
la source
Il s'est avéré que c'était une erreur stupide car mon téléphone était toujours connecté au PC de bureau et je ne m'en étais pas rendu compte.
J'ai donc dû désactiver la connexion USB et tout a bien fonctionné.
la source
J'ai eu le même problème sur Samsung Galaxy Note 3, exécutant CM 12.1. Le problème pour moi était que j'avais
et a dû l'utiliser pour prendre et stocker des photos d'utilisateurs. Lorsque j'ai essayé de charger ces mêmes photos dans ImageLoader, j'ai eu l'
(Permission denied)
erreur. La solution consistait à ajouter explicitementcar l'autorisation ci-dessus limite uniquement l'autorisation d'écriture jusqu'à la version 18 de l'API, et avec elle l'autorisation de lecture.
la source
En plus de toutes les réponses, si les clients utilisent Android 6.0, Android a ajouté un nouveau modèle d'autorisation pour (Marshmallow).
Astuce: si vous ciblez la version 22 ou inférieure, votre application demandera toutes les autorisations au moment de l'installation, comme sur n'importe quel appareil exécutant un système d'exploitation sous Marshmallow. Si vous essayez l'émulateur, à partir d'Android 6.0, vous devez explicitement accéder aux paramètres -> applications -> YOURAPP -> autorisations et modifier l'autorisation si vous en avez donné.
la source
Étrangement, après avoir mis une barre oblique "/" avant mon nouveau fichier, mon problème a été résolu. J'ai changé ça:
pour ça:
la source
J'ai eu le même problème et aucune des suggestions n'a aidé. Mais j'ai trouvé une raison intéressante à cela, sur un appareil physique, Galaxy Tab .
Lorsque le stockage USB est activé, les autorisations de lecture et d'écriture sur le stockage externe n'ont aucun effet. Désactivez simplement le stockage USB et avec les autorisations appropriées, le problème sera résolu.
la source
Je m'attendrais à ce que tout ce qui suit fasse
/data
partie du "stockage interne". Vous devriez cependant pouvoir écrire/sdcard
.la source
Modifiez une propriété d'autorisation dans votre
/system/etc/permission/platform.xml
et besoin de groupe comme mentionné ci-dessous.
la source
J'ai eu la même erreur lorsque j'essayais d'écrire une image dans le dossier DCIM / camera sur Galaxy S5 (android 6.0.1) et j'ai compris que seul ce dossier était restreint. Je pourrais simplement écrire dans DCIM / n'importe quel dossier mais pas à huis clos. Cela devrait être une restriction / personnalisation basée sur la marque.
la source
Lorsque votre application appartient à l'application système, elle ne peut pas accéder à la carte SD.
la source
gardez à l'esprit que même si vous définissez toutes les autorisations correctes dans le manifeste: le seul endroit où les applications tierces sont autorisées à écrire sur votre carte externe sont "leurs propres répertoires" (c'est-à-dire / sdcard / Android / data /) essayant d'écrire dans n'importe où ailleurs: vous obtiendrez une exception: EACCES (Autorisation refusée)
la source
Peut-être que la réponse est la suivante:
sur l'API> = 23 appareils, si vous installez l'application (l'application n'est pas une application système), vous devez vérifier l'autorisation de stockage dans "Paramètres - applications", il existe une liste d'autorisations pour chaque application, vous devez la vérifier! essayer
la source
Dans mon cas, j'utilisais une bibliothèque de sélecteur de fichiers qui renvoyait le chemin vers le stockage externe, mais cela a commencé à partir de
/root/
. Et même avec l' autorisation WRITE_EXTERNAL_STORAGE accordée au moment de l'exécution, j'ai quand même eu l'erreur EACCES (autorisation refusée) .Alors utilisez
Environment.getExternalStorageDirectory()
pour obtenir le chemin d'accès correct au stockage externe.Exemple:
impossible d'écrire:
/root/storage/emulated/0/newfile.txt
peut écrire:
/storage/emulated/0/newfile.txt
Sortie 1:
Sortie 2:
la source
root
pièce du chemin a résolu mon problème.Lorsque vous utilisez cette méthode obsolète à partir d'Android 29, vous recevrez la même erreur:
java.io.FileNotFoundException: open failed: EACCES (Permission denied)
Résolution ici:
getExternalStoragePublicDirectory déconseillé dans Android Q
la source
Pour toute personne venant des résultats de recherche et ciblant Android 10: Android 10 (API 29) modifie certaines autorisations liées au stockage.
J'ai résolu le problème en remplaçant mes instances précédentes de
Environment.getExternalStorageDirectory()
(qui est obsolète avec l'API 29) parcontext.getExternalFilesDir(null)
.Notez que
context.getExternalFilesDir(type)
peut retourner null si l'emplacement de stockage n'est pas disponible, assurez-vous donc de vérifier que chaque fois que vous vérifiez si vous avez des autorisations externes.Lisez plus ici .
la source
Je crée un dossier sous / data / dans mon init.rc (déblayage avec l'aosp sur Nexus 7) et j'ai eu exactement ce problème.
Il s'est avéré que donner l'autorisation au dossier rw (666) n'était pas suffisant et il fallait que ce soit rwx (777) alors tout a fonctionné!
la source
L'application des autorisations de stockage après 6.0 peut être contournée si vous avez un périphérique enraciné via ces commandes adb:
la source
Ajoutez l'autorisation dans le manifeste.
la source
android.permission.READ_INTERNAL_STORAGE
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 était d'installer le pilote de périphérique adb approprié sur Windows. Le pilote USB Google ne fonctionnait pas pour mon appareil.
ÉTAPE 1: Téléchargez les pilotes adb pour la marque de votre appareil.
ÉTAPE 2: Accédez au gestionnaire de périphériques -> autres périphériques -> recherchez les entrées avec le mot "adb" -> sélectionnez Mettre à jour le pilote -> indiquez l'emplacement à l'étape 1
la source
après avoir ajouté l'autorisation a résolu mon problème
la source
Ajouter des dépendances Gradle
Ajoutez le code ci-dessous dans votre activité principale.
la source
Dans mon cas, l'erreur apparaissait sur la ligne
car je ne pouvais pas créer un nouveau fichier sur la carte SD, j'ai donc dû utiliser l'approche DocumentFile.
Pour la question ci-dessus, le problème peut être résolu avec cette approche,
Voir aussi ce fil, Comment utiliser la nouvelle API d'accès à la carte SD présentée pour Android 5.0 (Lollipop)?
la source