2016-06-14 17 views
12

Ho cercato di crittografare i file e di scrivere quei file nello stesso posto. Ma ho ricevuto il messaggio di errore "java.io.FileNotFoundException:/storage/emulated/0/New file.txt: open failed: EACCES (autorizzazione negata)".java.io.FileNotFoundException:/storage/emulated/0/New file.txt: open failed: EACCES (autorizzazione negata)

Il mio file manifesto è questo

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

Credo di aver fornito autorizzazione corretta lì. E il codice um che usa per crittografare i file è questo.

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

E ho usato questo metodo all'interno di un tasto

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

Ancora non ho potuto configurare questo errore. Per favore qualcuno aiuti!

+0

https://stackoverflow.com/questions/32635704/android-permission-doesnt-work-even-if-i-have-declared-it – CommonsWare

+0

Verificare inoltre: il file '/ storage/emulato/0/Nuovo file.txt: 'esiste? Lo vedi quando navighi attraverso il tuo dispositivo? – ishmaelMakitla

+0

@ishmaelMakitla hmmm poiché il messaggio è "Autorizzazione negata", quindi il file esiste (se non fosse il messaggio sarebbe "file non trovato") – niceman

risposta

23

Ho il sospetto che tu stia utilizzando Android 6.0 Marshmallow (API 23) o successivo. Se questo è il caso, è necessario implementare runtime permissions prima di provare a leggere/scrivere memoria esterna.

+1

... solo se l'SDK di destinazione è 23 o superiore – devnull69

+1

Il mio SDK di destinazione è 19 ma l'emulatore è 23 – Tharindu

+0

@Tharindu Hm, come menzionato @ devnull69, se il tuo 'targetSdkVersion' è 22 o inferiore, allora dovrebbe ancora usare il vecchio modello di autorizzazioni. Questo potrebbe non essere il problema. – Bryan

3

Implementare l'autorizzazione di runtime per l'esecuzione della tua app su Android 6.0 Marshmallow (API 23) o versioni successive.

o è possibile attivare manualmente la memorizzazione permission- impostazioni

goto> Applicazioni> "your_app_name"> cliccare su di esso> quindi fare clic su autorizzazioni> quindi attivare l'archiviazione. Questo è tutto.

Ma suggerisco di andare per il primo che è, implementare autorizzazioni di runtime nel codice.

Problemi correlati