Android: mkdirs () / mkdir () на внешнем хранилище возвращает false - PullRequest
31 голосов
/ 27 августа 2011

Я схожу с ума от этого:

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() шаг за шагом, но результат тот же. Пожалуйста, помогите мне. Я так много погуглил и потратил как минимум 2 дня на эту глупость. Спасибо за вашу помощь !!

РЕДАКТИРОВАНИЕ:

Извините всех! Я добавил <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> в тег <application>. это была моя ошибка! Но спасибо всем за ответ.

Ответы [ 11 ]

55 голосов
/ 13 июня 2016

У меня возникла та же проблема, и я уверен, что я поместил тег разрешения в правильном месте, но mkdirs еще не работал, моя система - Android 6.0, я решил ее сейчас, вы можете проверить, как показано ниже: 1001 *

  1. убедитесь, что вы вставили тег разрешения.
  2. откройте «настройки / приложения» в своем телефоне, проверьте разрешение вашего приложения (я обнаружил, что разрешение в моем заявлении манифеста не здесь), откройте переключатель разрешения, как это. "mkdirs" не удалось)

enter image description here

28 голосов
/ 18 ноября 2011

У меня была такая же проблема, и я всю неделю искал все, пытаясь найти ответ.Я думаю, что нашел это, и я думаю, что это смехотворно легко, вы должны поместить заявление о разрешении использования в нужном месте ...

<?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" />

Когда я поместил его в раздел это не сработало.

15 голосов
/ 23 октября 2012

Я знаю, что это старый пост, но, возможно, мой ответ может кому-нибудь помочь.

После нескольких дней решения этой проблемы я понял, что, когда телефон подключен к ПК, он оказывается всегдаво время разработки SD-карта недоступна.Таким образом, чтобы потерпеть неудачу любую попытку создать каталог или файл поверх него.Чтобы сделать это «проще», он, казалось, вел себя по-разному в зависимости от тестируемого телефона.

Я знаю, что это может показаться довольно глупой проблемой, но это может стоить много времени, а может сэкономить какой-то другой.*

8 голосов
/ 12 апреля 2017

добавить эту строку кода в OnCreate ()

ActivityCompat.requestPermissions(this,
            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
4 голосов
/ 27 августа 2011

mkdirs () возвращает true только если каталог был создан.Если он уже на месте, он должен вернуть false.Так что я бы поспорил, что этот каталог уже существует.

2 голосов
/ 22 сентября 2016

Если у вас Android 6.0 и более, убедитесь, что ваш целевой SDK в файле Gradle меньше 22:

targetSdkVersion 22

или вам нужно реализовать разрешения во время выполнения.

2 голосов
/ 09 июня 2016

У меня была такая же проблема, и я просто хотел поделиться своим исправлением.согласно Android Начиная с Android 4.4, для чтения или записи файлов в личных каталогах вашего приложения не требуются разрешения READ_EXTERNAL_STORAGE или WRITE_EXTERNAL_STORAGE.

Таким образом, вы можете заявить, что разрешение следует запрашиватьтолько в более низких версиях Android, добавив атрибут maxSdkVersion:

<uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="18" />

, но проблема заключается в maxSdkVersion, я просто удалил его, и теперь он работает.

2 голосов
/ 27 августа 2011

Ваш код работает нормально для меня. В вашем коде нет ничего плохого.Просто если вы делаете один каталог, используйте f.mkdir() вместо f.mkdirs(). Вы можете увидеть свою папку в mnt => Sd card => DCIM => work_data

2 голосов
/ 27 августа 2011

положить это

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");
1 голос
/ 17 декабря 2014

Это может помочь кому-то в будущем.

проблема также может заключаться в том, что вы пишете адрес "/ File / Address /", вместо этого вы должны написать

File.separator + "File" + File.separator + "Address" + File.separator

Это такая маленькая и глупая вещь, но это сработало для меня, потратив часы моего времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...