Папка Android KitKat 4.4 на SD-карте
Мы только что испортили новые разрешения, которые применяются для записи файлов на SD-карты (внешнее хранилище) на Android 4.4 (EACCES Permission Denied)
До KitKat мы устанавливали нашу доступную для записи папку следующим образом:
mfolder = Environment.getExternalStorageDirectory().getPath() + "/appfiles";
Однако после нескольких часов поиска, я пришел к выводу, правильно или неправильно, что на устройствах 4.4 для записи файлов это должно быть изменено на:
mfolder = Environment.getExternalStorageDirectory().getPath() + "/Android/data/com.xyz.abc/appfiles";
Таким образом, mfolder будет выглядеть примерно так: /mnt/sdcard/Android/data/com.xyz.abc/appfiles
Правильно ли это, создадим ли мы папку, подобную приведенной выше, на SD-карте, чтобы устройства 4.4 могли записывать файлы?
mfolder - это строка, которую мы сохраняем в общих настройках.
Затем у нас есть этот код, который запускается один раз, если API> = 19, который изменяет строку mfolder, а затем копирует все файлы из старой папки в новую папку '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) {
}
}
}
}
}
Затем я уведомляю пользователя, что его файлы были скопированы в новую папку и что из-за новых разрешений им придется вручную удалить старую папку prekitkatfolder. Я предполагаю, что они смогут сделать это, только если у них есть стандартный файловый менеджер или если они размонтировали SD-карту и поместили ее в ПК из-за новых разрешений 4.4?
Кроме того, для нас кажется, что эти разрешения 4.4 не влияют на всех наших пользователей с Kitkat. Некоторые по-прежнему могут записывать в исходную папку на своем внешнем хранилище, а некоторые получают ошибку EACCES (Permission Denied). Может ли кто-нибудь пролить свет на то, почему это может быть, можно подумать, что это применимо ко всем устройствам 4.4, использующим внешнее хранилище?
Поскольку у нас нет фактического устройства 4.4, нам приходится тестировать этот код с помощью эмулятора (API 19), но мы не получаем ошибку EACCES Permission Denied. Итак, мы выпустили бета-версию с кодом выше, и нам сказали, что скопированные файлы оказались во внутренней памяти, как это может быть?
Любые идеи, что мы делаем не так, спасибо заранее