web-dev-qa-db-fra.com

java.io.FileNotFoundException: / storage / emulated / 0 / New file.txt: échec de l'ouverture: EACCES (autorisation refusée)

J'ai essayé de chiffrer des fichiers et de les réécrire au même endroit. Mais j'ai eu le message d'erreur disant "Java.io.FileNotFoundException: /storage/emulated/0/New file.txt: open failed: EACCES (Permission denied)".

Mon fichier Manifest est-ce

<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="com.example.tdk.mytestapplication2">

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


<application
    Android:allowBackup="true"

Je pense que j'ai fourni la permission correcte là-bas. Et le code que j'utilise pour chiffrer les fichiers est le suivant.

public static void encrypt(SecretKey secretKey, String filePath){
    try {
        // Here you read the cleartext.
        FileInputStream fis = new FileInputStream(filePath);
        // This stream write the encrypted text. This stream will be wrapped by another stream.
        FileOutputStream fos = new FileOutputStream(filePath);

        // Create cipher
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        // Wrap the output stream
        CipherOutputStream cos = new CipherOutputStream(fos, cipher);

        // Write bytes
        int b;
        byte[] d = new byte[8];
        while ((b = fis.read(d)) != -1) {
            cos.write(d, 0, b);
        }

        // Flush and close streams.
        cos.flush();
        cos.close();
        fis.close();

    }catch(IOException e){
        e.printStackTrace();
    }catch (NoSuchAlgorithmException e){
        e.printStackTrace();
    }catch(NoSuchPaddingException e){
        e.printStackTrace();
    }catch(InvalidKeyException e){
        e.printStackTrace();
    }
}

Et j'ai utilisé cette méthode à l'intérieur d'un bouton

Button btnEncrypt = (Button) findViewById(R.id.btnEnc);
    btnEncrypt.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            aesKey = EncAndDec.generateKey();
            String filePath = editText.getText().toString();
            //Generating the file hash
            String md5Hash = MD5Hash.getMD5(filePath);

            System.out.println(aesKey.toString());
            System.out.println(filePath);
            System.out.println(md5Hash);

            //Encrypting the file
            for(int i=1; i<100; i++) {
                EncAndDec.encrypt(aesKey, filePath);
            }
        }
    });

Je ne pouvais toujours pas configurer cette erreur. S'il vous plaît quelqu'un aide!

23
Tharindu

Je suppose que vous utilisez Android 6.0 Marshmallow (API 23) ou une version ultérieure. Si tel est le cas, vous devez implémentez autorisations d'exécution avant d'essayer de lire/écrire du stockage externe.

38
Bryan

Implémentez l'autorisation d'exécution pour exécuter votre application sur Android 6.0 Marshmallow (API 23) ou ultérieure.

ou vous pouvez activer manuellement la permission de stockage

allez dans paramètres> applications> "votre_nom_app"> cliquez dessus> puis cliquez sur autorisations> puis activez le stockage. C'est ça.

Mais je suggère d’aller dans le premier qui est, Implémentez les autorisations d’exécution dans votre code.

16
Debasish Mondal