Не удается создать каталог во внешнем хранилище, хотя разрешения, видимо, установлены правильно
У меня
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
в моем файле манифеста, однако я не могу создать каталог
Log.d(LOG_STRING, android.os.Environment.getExternalStorageState() );
java.io.File folder = new java.io.File(Environment.getExternalStorageDirectory() + java.io.File.separator + "test");
boolean success = true;
if (!folder.exists()) {
success = folder.mkdir();
}
if (success) {
Log.d(LOG_STRING, "Created directory");
} else {
Log.d(LOG_STRING, "FAILED WHILE CREATING DIRECTORY");
}
Состояние внешнего хранилища "смонтировано", но каталог test
не может быть создан, а выход - "FAILED WHILE CREATING DIRECTORY"
.
Просмотр в телефоне "Сведения о приложении" означает, что разрешение "изменить или удалить содержимое вашего USB-накопителя" отмечено для моего приложения.
Что может быть причиной этого? Некоторые специальные настройки телефона? Это Samsung GT-I9506 с Android 4.3 (API18). Следует отметить, что getExternalStorageDirectory
находится не на SD-карте, а на внутренней памяти (/storage/emulated/0/
).
<ч/" > Update:
Говоря с коллегами, кажется, что это устройство подверглось нескольким настройкам после того, как они были внедрены (чтобы конкретное приложение могло напрямую писать на SD-карту). Вероятно, не стоит исследовать дальше, я просто переключусь на другое устройство. Я буду держать устройство на некоторое время, и если кто-нибудь появится с ответом, я быстро проверю, разрешит ли он проблему.
<ч/" > Обновление 2: (конец Bounty)
Проблема остается нерешенной, но, как было сказано ранее, скорее всего, это очень специфично для этого устройства. Невозможно писать на любом пути, будь то внешнее или внутреннее хранилище, даже не в пути, возвращаемом getExternalCacheDir()
.
Ответы
Ответ 1
Сначала вам нужно использовать file.mkdirs()
вместо folder.mkdir()
.
И если он также не работает, вам нужно проверить, можете ли вы получить доступ к SD-карте или нет.
Для проверки вы можете использовать метод ниже.
boolean mExternalStorageAvailable = false;
boolean mExternalStorageWriteable = false;
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
// We can read and write the media
mExternalStorageAvailable = mExternalStorageWriteable = true;
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
// We can only read the media
mExternalStorageAvailable = true;
mExternalStorageWriteable = false;
} else {
// Something else is wrong. It may be one of many other states, but all we need
// to know is we can neither read nor write
mExternalStorageAvailable = mExternalStorageWriteable = false;
}
Читайте на официальном документе.
Надеюсь, это даст вам некоторое представление.
Ответ 2
Вы можете попробовать этот код. Я также эмулировал SD-карту на Lg g2 mini, и я могу получить доступ только к внешней карте в папке моего пакета
for(File f : getExternalFilesDirs(null)){
try {
File f2 = new File(f.getAbsolutePath(), "testFile");
Log.d("test log", "file path " + f2.getAbsolutePath());
f2.createNewFile();
Log.d("test log", "file exist " + f2.exists());
} catch (IOException e) {
Log.d("test log", "error");
}
}
и вывод:
D/test log? file path /storage/emulated/0/Android/data/my.awesome.package/files/testFile
D/test log? file exist true
D/test log? file path /storage/external_SD/Android/data/my.awesome.package/files/testFile
D/test log? file exist true
Ответ 3
В моем случае мне пришлось перейти под Settings -> Apps -> NameOfApp -> Permissions
и активировать разрешения на хранение. Я не знаю, почему это деактивируется по умолчанию, если у меня есть все разрешения на AndroidManifest.xml. Я на Moto G (3rd Gen) с Android Marshmallow 6.0.
Ответ 4
Попробуйте следующее:
final File externalStoragePublicDirectory = Environment.getExternalStorageDirectory();
File file = new File(externalStoragePublicDirectory, "test");
file.mkdirs();
Ответ 5
http://developer.android.com/guide/topics/data/data-storage.html#filesExternal
http://developer.android.com/guide/topics/data/data-storage.html#AccessingExtFiles
эти ресурсы могут решить вашу проблему!