Abbiamo appena caduto fallo delle nuove autorizzazioni che si applicano alla scrittura di file su schede SD (di archiviazione esterna) su Android 4.4 (EACCES Autorizzazione negata)Android KitKat 4.4 cartella su scheda SD
Prima di KitKat abbiamo fissato i nostri cartella scrivibile in questo modo:
mfolder = Environment.getExternalStorageDirectory().getPath() + "/appfiles";
Tuttavia dopo ore di ricerca sono giunto alla conclusione, a torto oa ragione, che il 4.4 dispositivi per consentire la scrittura di file di questo deve essere cambiato in:
mfolder = Environment.getExternalStorageDirectory().getPath() + "/Android/data/com.xyz.abc/appfiles";
Quindi mfolder sarebbe qualcosa di simile: /mnt/sdcard/Android/data/com.xyz.abc/appfiles
E 'corretto, creiamo una cartella come quella sopra sulla sdcard per abilitare i dispositivi 4.4 scrivere file?
mfolder è una stringa che viene salvata in preferenze condivise.
Quindi abbiamo questo codice che viene eseguito una volta se API> = 19 che modifica la stringa mfolder e quindi copia tutti i file dalla vecchia cartella nella nuova cartella 'kitkat'.
if (android.os.Build.VERSION.SDK_INT>=19){
if (!mfolder.contains("/Android/data/com.xyz.abc/appfiles")){
if (prefs.getBoolean("kitkatcheck", false)==false){
//update mfolder from
// /mnt/sdcard/appfiles
// to
// /mnt/sdcard/Android/data/com.xyz.abc/appfiles
String prekitkatfolder = mfolder;
String kitkatfolder = mfolder.replace("/appfiles", "/Android/data/com.xyz.abc/appfiles");
mfolder = kitkatfolder;
try {
File sd = new File(mfolder);
if(!sd.exists() || !sd.isDirectory()) {
sd.mkdirs();
}
} catch (Exception e) {
Toast.makeText(getBaseContext(), "Error creating Kitkat folder!\n" + e.toString(), Toast.LENGTH_LONG).show();
return;
}
prefEditor.putString("patternfolder", mfolder);
prefEditor.putBoolean("kitkatcheck", true);
prefEditor.commit();
//copy files and folder from old appfiles folder to new.
AllFiles.clear();
listFilesAndFilesSubDirectories(prekitkatfolder);
if (AllFiles.size()>0){
for (File child : AllFiles) {
try {
File dest = new File(child.toString().replace(prekitkatfolder, kitkatfolder));
try {
String filePath = dest.getPath().substring(0, dest.getPath().lastIndexOf(File.separator));
File subfolder = new File(filePath);
if(!subfolder.exists() || !subfolder.isDirectory()) {
subfolder.mkdirs();
}
} catch (Exception ex) {
}
copyFile(child, dest);
} catch (Throwable t) {
}
}
}
}
}
Ho poi informare l'utente che i loro file sono stati copiati nella nuova cartella e che a causa delle nuove autorizzazioni avrebbero dovuto eliminare manualmente la vecchia cartella prekitkatfolder. Immagino che saranno in grado di farlo solo se hanno un gestore di file di magazzino o se hanno smontato la scheda SD e lo mettono in un PC, a causa delle nuove autorizzazioni 4.4?
Inoltre, per noi sembra che queste autorizzazioni 4.4 non abbiano effetto su tutti i nostri utenti con Kitkat. Alcuni possono ancora scrivere nella cartella originale sulla loro memoria esterna e alcuni ottengono l'errore EACCES (Permission Denied). Qualcuno può far luce sul motivo per cui questo potrebbe essere, si potrebbe pensare che si applicherebbe a tutti i dispositivi 4.4 che utilizzano memoria esterna?
Dato che non abbiamo un dispositivo 4.4 reale, dobbiamo testare questo codice usando l'emulatore (API 19) ma non otteniamo l'errore EACCES Permission Denied. Quindi abbiamo rilasciato una versione beta con il codice sopra e ci è stato detto che i file copiati sono finiti nella memoria interna, come può essere?
Tutte le idee che stiamo facendo di sbagliato, grazie in anticipo
Ciao Zorac, sono in una situazione simile su alcuni dispositivi funziona senza nome pacchetto nel percorso e su alcuni è necessario il lungo percorso aggiunto come /Android/data/com.xyz.abc/appfiles non è sicuro di cosa sta succedendo . Hai già trovato una soluzione ? – Ahmed