8
votes

La permission EACES refusé à Android

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 code> Mais lorsque je lis le fichier, je suis en mesure de la lire avec succès mais de ne pas écrire le fichier. Le code que j'utilise pour écrire le fichier dans la carte SD est le suivant:

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


0 commentaires

4 Réponses :


17
votes

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 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 et le niveau de protection est SignatureTorSystem, voir aussi la discussion dans Cet article .

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 ...


5 commentaires

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!



7
votes

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/
    


0 commentaires

0
votes

J'ai résolu ce problème en supprimant le Android: maxsdkversion = "18" dans utilise-permission dans le fichier manifeste. C'est à dire. Utilisez ceci: xxx

au lieu de: xxx


0 commentaires

0
votes

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


0 commentaires