Właśnie spadł wolny nowych uprawnień, które odnoszą się do zapisywania plików na kartach pamięci SD (zewnętrzny) na Androida 4.4 (EACCES Permission denied)Android 4.4 KitKat folderu na karcie SD
Przed KitKat ustawiamy nasz Folder zapisu tak:
mfolder = Environment.getExternalStorageDirectory().getPath() + "/appfiles";
jednak po wielu godzinach poszukiwania Doszedłem do wniosku, słusznie lub niesłusznie, że na 4,4 urządzeń w celu umożliwienia zapisu plików to musi być zmienione na:
mfolder = Environment.getExternalStorageDirectory().getPath() + "/Android/data/com.xyz.abc/appfiles";
Tak więc mfolder może wyglądać następująco: /mnt/sdcard/Android/data/com.xyz.abc/appfiles
Czy to prawda, czy tworzymy folder taki jak ten na sdcard, aby umożliwić 4.4 urządzenia do pisać pliki?
mfolder jest ciągiem, który zapisujemy w preferencjach współdzielonych.
Następnie mamy ten kod, który uruchamia się raz, jeśli API> = 19, który zmienia ciąg mfolder, a następnie kopiuje wszystkie pliki ze starego folderu do nowego folderu "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) {
}
}
}
}
}
Następnie powiadomić użytkownika, że ich pliki zostały skopiowane do nowego folderu i że w związku z nowymi uprawnieniami będą musieli ręcznie usunąć stary folder prekitkatfolder. Sądzę, że będą w stanie to zrobić tylko, jeśli mają menedżera plików giełdowych lub jeśli odmontowali kartę SD i umieścili ją na komputerze z powodu nowych uprawnień 4.4?
Ponadto wydaje się, że te uprawnienia 4.4 nie dotyczą wszystkich naszych użytkowników za pomocą KitKat. Niektóre z nich nadal mogą zapisywać do pierwotnej lokalizacji folderu w ich pamięci zewnętrznej, a niektóre otrzymują błąd EACCES (Odmowa uprawnień). Czy ktokolwiek rzuca jakiekolwiek światło na to, dlaczego tak się dzieje, można by pomyśleć, że dotyczyłoby wszystkich urządzeń 4.4 korzystających z pamięci zewnętrznej?
Ponieważ nie mamy rzeczywistego urządzenia 4.4, musimy przetestować ten kod za pomocą emulatora (API 19), ale nie otrzymujemy błędu EACCES Permission Denied. Wydaliśmy wersję beta z powyższym kodem i powiedziano nam, że skopiowane pliki trafiły do pamięci wewnętrznej, jak to możliwe?
Wszelkie pomysły, co robimy źle, z góry dzięki
Cześć Zorac, jestem w podobnej sytuacji na niektórych urządzeniach działa bez nazwy pakietu w ścieżce, a na niektórych potrzebujesz długiej ścieżki dołączonej jak /Android/data/com.xyz.abc/appfiles nie wiesz co się dzieje . Znalazłeś już rozwiązanie? – Ahmed