Android: mkdirs()/mkdir() на внешнем хранилище возвращает false
Я с ума схожу с этим:
Log.d("STATE", Environment.getExternalStorageState());
File f = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), "work_data");
Log.d("PATH", f.getAbsolutePath());
if (!f.exists()) {
Log.d("MAKE DIR", f.mkdirs() + "");
}
Журнал вывода выглядит следующим образом:
STATE mounted
PATH /mnt/sdcard/DCIM/work_data
MAKE DIR false
Я обязательно добавил правильное разрешение:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Но я не знаю, почему он не смог создать папку. Я также использовал mkdir()
шаг за шагом, но результат тот же. Пожалуйста, помогите мне. Я так много искал и потратил на эту глупость не менее двух дней. Спасибо за вашу помощь!
РЕДАКТИРОВАНИЕ:
Извините всех! Я добавил <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
в тег <application>
. это была моя ошибка! Но спасибо всем за ответ.
Ответы
Ответ 1
У меня была такая же проблема, и я всю неделю искал все, пытаясь найти ответ. Я думаю, что нашел это, и я думаю, что это до смешного легко, вы должны поместить выражение о разрешении использования в нужном месте...
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.company.name"
android:versionCode="1"
android:versionName="0.2">
<uses-sdk android:minSdkVersion="8" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Когда он был внутри раздела <application> </application>, он не работал.
Ответ 2
У меня такая же проблема, и я уверен, что я поместил метку разрешений в нужное место, но mkdirs еще не работает, моя система - Android 6.0, теперь я ее разрешаю, вы можете проверить, как показано ниже:
- убедитесь, что вы помещаете тег разрешения.
- откройте "настройку/приложение" на своем телефоне, проверьте разрешение на использование вашего приложения (я обнаружил, что разрешение в моем манифестном заявлении отсутствует здесь), откройте переключатель разрешения, подобный этому. (Я обнаружил, что он закрыт по умолчанию, что делает "mkdirs" не удалось)
![введите описание изображения здесь]()
Ответ 3
Я знаю, что это старый пост, но, возможно, мой ответ может помочь кому-то.
Спустя несколько дней, когда я столкнулся с этой проблемой, я понял, что, когда телефон подключен к ПК, который, как всегда, работает во время разработки, SD-карта недоступна. Таким образом, чтобы не пытаться создать каталог или файл поверх него.
Чтобы сделать его "проще", казалось, он вел себя по-разному в зависимости от тестируемого телефона.
Я знаю, что это может звучать довольно глупая проблема, но это дорогое время, которое может спасти кто-то другой.
Ответ 4
добавьте эту строку кода в OnCreate()
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
Ответ 5
mkdirs() возвращает true только в том случае, если каталог был создан. Если он уже установлен, он должен вернуть значение false. Поэтому я бы поспорил, что этот каталог уже существует.
Ответ 6
поставьте это
Log.d("MAKE DIR", f.mkdir() + "");
вместо
Log.d("MAKE DIR", f.mkdirs() + "");
или попробуйте это
String s=Environment.getExternalStorageDirectory().toString()+"/";
File f = new File(s+"DCIM/work_data");
Ответ 7
Ваш код отлично работает для меня. В коде нет ничего плохого.
Просто, если вы создаете один каталог, используйте f.mkdir()
вместо f.mkdirs()
Вы можете увидеть свою папку в mnt => Sd card => DCIM => work_data
Ответ 8
У меня была такая же проблема, и я просто хотел поделиться своим исправлением.
по андроиду
Начиная с Android 4.4, чтение или запись файлов в ваших личных каталогах приложений не требует прав READ_EXTERNAL_STORAGE или WRITE_EXTERNAL_STORAGE.
Таким образом, вы можете заявить, что разрешение должно запрашиваться только в более низких версиях Android, добавив атрибут maxSdkVersion:
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />
но maxSdkVersion - проблема, я просто удалил ее, и теперь она работает.
Ответ 9
Если у вас есть android 6.0 и более, убедитесь, что ваш целевой файл sdk в gradle меньше 22:
targetSdkVersion 22
или вам нужно реализовать разрешения времени выполнения.
Ответ 10
Это может помочь кому-то в будущем.
проблема также в том, что вы пишете адрес "/File/Address/", вместо этого вы должны написать
File.separator + "File" + File.separator + "Address" + File.separator
Это такая маленькая и глупая вещь, но это сработало для меня, потратив много времени на мое время.
Ответ 11
Я пытался создать набор подпапок во внешнем хранилище "Test/Test1/Test2", когда mkdirs() продолжал возвращать false. Оказывается, что "Тест" является либо зарезервированным словом для папки в корне внешнего хранилища. Это было на Motorola G (XT1541) и может относиться и к другим устройствам.
Ответ 12
Для новых устройств вы должны запросить разрешение пользователя.
Вы можете сделать это следующим образом, прежде чем создавать файл:
boolean hasPermission = (ContextCompat.checkSelfPermission(MainActivity.this,
Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED);
if (!hasPermission) {
//ask permission
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_WRITE_STORAGE);
}
else {
//you have permission, create your file
}
После действий пользователя вы можете обработать результат.
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode)
{
case 1: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
{
//you have permission, create your file
//reload my activity with permission granted or use the features what required the permission
} else
{
Toast.makeText(MainActivity.this, "The app was not allowed to write to your storage. Hence, it cannot function properly. Please consider granting it this permission", Toast.LENGTH_LONG).show();
}
}
}
}