Lors de l'écriture de fichier dans une carte SD externe, je reçois une erreur EACCESS Autorisation refusée. J'ai défini la permission
String path="mnt/extsd/Test";
try{
File myFile = new File(path, "Hello.txt"); //device.txt
myFile.createNewFile();
FileOutputStream fOut = new FileOutputStream(myFile);
OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut);
myOutWriter.append(txtData.getText());
myOutWriter.close();
fOut.close();
Toast.makeText(getBaseContext(),"Done writing SD "+myFile.getPath(),Toast.LENGTH_SHORT).show();
} catch (Exception e) {
Toast.makeText(getBaseContext(), e.getMessage(),Toast.LENGTH_SHORT).show();
System.out.println("Hello"+e.getMessage());
}
}
4 Réponses :
Comme je me souviens d'Android, a eu un support multi-stockage partiel depuis la nid d'abeille et le stockage principal (celui que vous obtenez de l'environnement.getexternalstoragedireectoire, généralement une partie de la carte EMMC interne) est toujours protégé par la permission Si tel est le cas, il semble impossible pour une application normale d'écrire quelque chose sur la vraie carte SD sans signature de la plate-forme ... P> write_external_storage < / code>, mais les stockages secondaires (comme la vraie carte SD amovible) sont protégés par une nouvelle autorisation
android.permission.write_media_storage code> et le niveau de protection est SignatureTorSystem, voir aussi la discussion dans Cet article . P>
Avez-vous un accès root à votre tablette? Si, dans ce cas, vous pouvez faire un test comme celui-ci: 1) Laissez votre application utiliser la permission Write_Media_Storage, puis la reconstruire; 2) désinstaller votre application si elle est déjà installée, puis exécutez "racine ADB", "adb remnant", "adb push youapp.apk /ysystem/app/youapp.apk" Cela permettra à votre application une application système; 3) Démarrez votre application et vérifiez si le code de test fonctionne ou non. Si oui, il ne semble pas d'autre manière, sauf la signature de l'application par le certificat de plate-forme ou en faisant une application système. Ou vous pouvez attendre de voir si quelqu'un d'autre a une meilleure idée.
Merci pour l'info. Ça a vraiment aidé :)
Cette autorisation est appliquée à partir du niveau d'API 19. Avant le niveau d'API 19, cette autorisation n'est pas appliquée et que toutes les applications ont toujours accès à la lecture d'un stockage externe. Vous pouvez tester votre application avec la permission appliquée en activant la protection USB STOCK STOCK Sous Options de développeur dans l'application Paramètres sur un périphérique exécutant Android 4.1 ou supérieur. - développeur.android.com/reference/andrroid/... - - On dirait que c'est déjà appliqué derrière la scène?
android.permission.write_media_storage Cette permission est uniquement accordée aux applications système
Dans mon cas sur Lenovo A7-20 sur Android 4.4.2, ES File Explorer n'a aucun problème dans la lecture / écriture des fichiers que mon application a publié une écriture sur la carte mémoire, je me demande comment!
du niveau d'API 19, Google a ajouté API .
context.getexternalfilesDirs () code> li>
-
context.getexternalcachedirs () code> li>
-
context.getobbDirs () code> li>
ul> Les applications ne doivent pas être autorisées à écrire sur des périphériques de stockage externes secondaires, sauf dans leurs répertoires spécifiques à un colis comme autorisé par des autorisations synthétisées. La restriction des écrivies de cette manière garantit que le système puisse nettoyer les fichiers lorsque les applications sont désinstallées. P>
suivi est une approche pour obtenir un répertoire spécifique à l'application sur une carte SD externe avec des chemins absolus. P>
context.getExternalFilesDirs() : /storage/extSdCard/Android/data/com.example.remote.services/files/Download
external device is mounted.
external device download : /storage/extSdCard/Android/data/com.example.remote.services/files/Download
external device app path: /storage/extSdCard/Android/data/com.example.remote.services/files/
J'ai résolu ce problème en supprimant le au lieu de: p> Android: maxsdkversion = "18" code> dans
utilise-permission code>
dans le fichier manifeste.
C'est à dire. Utilisez ceci:
Vérifiez si l'utilisateur dispose d'une autorisation de stockage externe ou non. Sinon, utilisez le cache DIR pour enregistrer le fichier.
final boolean extStoragePermission = ContextCompat.checkSelfPermission( context, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED; if (extStoragePermission && Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) { parentFile = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES); } else{ parentFile = new File(context.getCacheDir(), Environment.DIRECTORY_PICTURES); }