web-dev-qa-db-fra.com

Android APIV29 FileNotFoundException EACCE (autorisation refusée)

Je ne suis pas capable d'accéder au stockage lors de la construction de Targetsdkversion V29.

Voici ma configuration des grades:

    compileSdkVersion 29
    buildToolsVersion "29.0.2"
    ...
        minSdkVersion 15
        targetSdkVersion 29

Notez que WRITE_EXTERNAL_STORAGE La permission est accordée et la même configuration fonctionne bien lors de la construction de targetSdkVersion 28.

Voici ma mise en œuvre:

        val outputFolder = File(baseFolder + File.separator + "Output Folder")
        if (!outputFolder.exists()) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                Files.createDirectory(outputFolder.toPath()) //This allways returns false with targetSdkVersion 29
            } else {
                if (!outputFolder.mkdirs()) {
                    Log.e("SaveRaw", "Unable to create folder for audio recording")
                }
            }
        }

        outputFile = File("$baseFolder/Output Folder/$filename")
        try {
            fileOutputStream = FileOutputStream(outputFile)
        } catch (e: FileNotFoundException) {
            e.printStackTrace() // allways throwing exception here, even if Output Folder exists 
        }

et voici l'exception:

W/System.err: Java.io.FileNotFoundException: /storage/emulated/0/Chirp Auto Tester/2019_10_17 10:44:43.raw: open failed: EACCES (Permission denied)
W/System.err:     at libcore.io.IoBridge.open(IoBridge.Java:496)
        at Java.io.FileOutputStream.<init>(FileOutputStream.Java:235)
        at Java.io.FileOutputStream.<init>(FileOutputStream.Java:186)

J'espère que quiconque a une réponse, que manque-t-il ici?

Mettre à jour:

Voici où baseFolder vient de. Notez que getExternalStorageDirectory est une méthode obsolète.

        val baseFolder: String = if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            Environment.getExternalStorageDirectory().absolutePath
        } else {
            context.filesDir.absolutePath
        }

Merci

17
Dinu

Avec Android version 10 (niveau 29 de l'API 29) Le concept de stockage caché est introduit. Selon DOCS- "pour donner aux utilisateurs plus contrôler sur leurs fichiers et limiter l'encombrement du fichier, des applications ciblant Android 10 (niveau d'API 29) et plus élevé sont donnés à un accès caché dans un stockage externe ou de stockage scopé, par défaut. Ces applications ont accès uniquement au répertoire spécifique à l'application sur le stockage externe, ainsi que spécifiques. types de médias que l'application a créé. "

pour Android Version 10, vous avez la possibilité de désactiver le stockage Scoped en ajoutant Android: DemandeGacyExternalStorage = "true" dans AndroidManifest.xml dans les balises d'application

Ceci est une solution temporaire et ne fonctionnera que pour Android version 10 et non au-dessus de cela. Assurez-vous également de demander la permission d'exécution pour un stockage externe en lecture/écriture.

0
mohit arora