2015-07-30 17 views
8

Come indicato dal titolo, ho problemi a scrivere file nella memoria esterna. Il mio dispositivo di debug è un Nexus 5. Il fatto è che sono in grado di leggere i file perfettamente dal dispositivo (ho provato con quelli nella cartella Download) ma non riesco a scriverli. Sono consapevole che devo farlo mentre il dispositivo non è collegato al computer. Ma non funziona neanche.Scrittura di file su una memoria esterna in Android non funzionante

Infatti, ho provato a leggere lo stato della scheda SD prima di scriverlo (che ovviamente non funzionava). Lo stato mostrato come "montato" sia quando il dispositivo è stato collegato al mio PC o meno. E ho confrontato lo stato con Environment.MEDIA_MOUNTED_READ_ONLY e Environment.MEDIA_MOUNTED senza alcun successo. Il mio dispositivo non si trova in nessuno di questi stati.

Una cosa che devi sapere è che il mio telefono non ha una scheda SD esterna, in quanto è interna. Ciò comporta che il mio dispositivo abbia una directory "/ storage/emulated/0/..." per la memoria esterna.

Devo anche sottolineare che ho implementato le seguenti tag nel mio manifesto Android:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 
<uses-permission android:name="ANDROID.PERMISSION.WRITE_EXTERNAL_STORAGE"/> 

Non ho alcun indizio di ciò che potrebbe accadere. Un'altra cosa che potrebbe aiutare è che ho provato a gestire i file con winrar (per Android) e sono stato in grado di rimuovere i file con il dispositivo collegato al mio PC e senza averlo collegato. Quindi non so cosa fare.

Il codice che sto usando per scrivere un file è il seguente. Tenete a mente che si deve leggere un file immagine (che lo fa), convertirlo in una stringa, riconvertirlo in un'immagine e quindi salvarlo nella cartella Downloads:

File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath() + "/base_image.jpg"); 
// Reading a Image file from file system 
FileInputStream imageInFile = new FileInputStream(file); 
byte imageData[] = new byte[(int) file.length()]; 
imageInFile.read(imageData); 

// Converting Image byte array into Base64 String 
String imageDataString = encodeImage(imageData); 

// Converting a Base64 String into Image byte array 
byte[] imageByteArray = decodeImage(imageDataString); 

File newFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "converted_image.jpg"); 

//Write a image byte array into file system 
FileOutputStream imageOutFile = new FileOutputStream(newFile); 

imageOutFile.write(imageByteArray); 

imageInFile.close(); 
imageOutFile.close(); 

Cosa devo fare?

+0

Sei sicuro che il file si chiude per scriverlo? – Raghunandan

+0

Sto creando un nuovo file. O, almeno, è quello che sto tentando. Ottengo l'eccezione File non trovato durante il tentativo di crearlo e l'errore EACCES (autorizzazione negata). Questo è il mio problema principale qui. Sto facendo qualcosa di sbagliato? – blastervla

risposta

4

Basta correggere ANDROID.PERMISSION.WRITE_EXTERNAL_STORAGE a android.permission.WRITE_EXTERNAL_STORAGE nel uses-permission.

Ho riscontrato questo problema, MAIUSCOLO in permesso non è utile.

+1

Non posso forse ringraziarti abbastanza per la tua risposta. Questo mi ha infastidito per giorni. Grazie mille!! – blastervla

3

FileOutputStream NON crea automaticamente un file se non esiste.

Quindi, è necessario controllare e creare se il file non esiste.

if(!newFile.exists()) { 
    newFile.createNewFile(); 
} 

Spero che questo aiuto!

+0

Grazie per la tua risposta veloce. L'ho provato, ma ora mi lancia la seguente eccezione: "java.io.IOException: open failed: EACCES (autorizzazione negata)" quando chiamo "newFile.createNewFile();" metodo. Qualche idea su cosa potrebbe accadere? – blastervla

+1

Anche prima di chiamare createFile() chiama 'newFile.getParentFile(). Mkdirs()'. Post scriptum scusate se mi è venuta in mente, sto andando in cima alla mia testa :) – vedi0boy

+0

Ok beh, ovviamente non hai dato alla tua app i permessi corretti, posso vedere dove nel manifest hai aggiunto i permessi. Modifica: Rimosso l'ultima istruzione, era sbagliato. – vedi0boy