Подтвердить что ты не робот

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>. это была моя ошибка! Но спасибо всем за ответ.

4b9b3361

Ответ 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();
            }
        }
    }

}