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

Mkdirs возвращает false для каталога на SD-карте, тогда как родительский каталог доступен для записи

При запуске приложения для Android мне нужно создать каталог на SD-карте, поскольку небольшое число пользователей это не удается, и я не могу понять причину этого...

(Я нашел похожие проблемы, вызванные отсутствием разрешения WRITE_EXTERNAL_STORAGE, он существует и работает почти для всех пользователей, поэтому я не думаю, что это причина)

Я упростил предыдущую ситуацию, чтобы упростить объяснение, если создание directoy не удается, я запускаю тестовый пример, где я пытаюсь создать каталог .test на sdcard:

new File(Environment.getExternalStorageDirectory(), ".test").mkdir() -> false
new File(Environment.getExternalStorageDirectory(), ".test").mkdirs() -> false

Свойства файла соответствующих каталогов:

/sdcard/.test(существует = false canWrite = false canRead = false canExecute = err isDirectory = false isFile = false)

/sdcard (exists = true canWrite = true canRead = true canExecute = err isDirectory = true isFile = false)

/(exists = true canWrite = false canRead = true canExecute = err isDirectory = true isFile = false)

= getExternalStorageState установлен

(canExecute возвращает err, потому что тест выполняется на sdk < 9)

Предложения и идеи очень приветствуются...

4b9b3361

Ответ 1

Это обычное явление, когда у вас нет разрешения в вашем манифесте.

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

Что касается меня, это была единственная ошибка.

Ответ 2

Прежде всего, технически mkdirs() возвращает false, это не значит, что это не удалось, это просто означало, что он не создавал каталоги. Если каталоги уже существуют, то mkdirs() будет продолжать возвращать false.

Во-вторых, в Android 6 вам не только нужны:

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

Вам также нужен некоторый эквивалент:

ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED

Дополнительные сведения о проверке разрешений см. в следующих разделах: https://github.com/googlesamples/android-RuntimePermissions

Ответ 3

У меня была проблема simillar и потратил несколько часов, чтобы понять, что не так. Он не работал на Sumsung Mega, но для других телефонов он работал нормально. У меня действительно было разрешение WRITE_EXTERNAL_STORAGE, и getExternalStorageDirectory смонтирован и доступен. Но каталог не был создан. Что помогло? Я только что возобновил работу! И это помогло! Жаль, что никто раньше этого не советовал. Надеюсь, это поможет!

Ответ 4

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

Я считаю, что есть проблема с некоторыми телефонами, Atrix и Bionic - два примера.

Эти телефоны при использовании кода Environment.getExternalStorageDirectory() действительно возвращают /mnt/sdcard.

Однако на этих телефонах SD-карта фактически /mnt/sdcard -ext.

Итак, где-то вдоль строк похоже, что некоторые производители нарушили код getExternalStorageDirectory и каким-то образом возвратили ложное расположение.

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

Ответ 5

Моя проблема заключалась в том, что я использовал mkdir для создания пути нескольких каталогов, и каждый раз получал false. Когда я использовал mkdirs, моя проблема была решена.

Ответ 6

У меня была та же проблема. Разрешение было установлено, а также путь по умолчанию (/mnt/sdcard), но мой Android был установлен в качестве внешнего устройства хранения для быстрого просмотра SD-карты. Однако это мешает другим приложениям.

Я понял это при погружении в оболочку adb:

$ cd /mnt   
$ cd sdcard
cd: can't cd to sdcard
$ ls -l
d--------- system   system            2011-12-07 01:59 sdcard

после размонтирования изображения, которое у меня есть:

$ ls -l                   
drwxrwxr-x system   sdcard_rw          2011-12-07 11:46 sdcard

Как вы можете видеть, когда установлена ​​sdcard, вы находитесь в группе пользователей системы, и никаких прав вообще нет. После разминирования группа будет изменена на sdcard_rw и предоставлены права на чтение и запись.

Ответ 7

Возможно, у этих пользователей есть SD-карта, которая повреждена и, таким образом, смонтирована только для чтения. Если возможно, вы должны проверить с ними, чтобы узнать, может ли что-нибудь еще записать на него файлы. Учитывая, что у вас есть разрешение WRITE_EXTERNAL_STORAGE, вы не должны беспокоиться о внесении изменений в SD-карту (а разрешения всего на SD-карте - это чтение/запись в мире для таких приложений, поэтому ничто не может испортить разрешения файлов, чтобы вызвать у них проблемы).

Ответ 8

Я знаю, что это старая публикация, но я думал, что могу предложить предложение. Если вы используете приложение во время разработки (т.е. Телефон подключен к ПК через USB), то, скорее всего, SD-карта была смонтирована ПК. Вы должны отключить его (вы можете сделать это с телефона или с ПК), чтобы получить разрешение на запись, для этого требуется, чтобы он был установлен в манифесте.

Ответ 9

Я думал, что у меня возникла проблема при отладке приложения. Это было неудачно, потому что SD-карта была смонтирована главным компьютером во время отладки. Отключение с компьютера снова заставило приложение работать.

Ответ 10

Я столкнулся с этой проблемой, когда symlink/storage/emulated/0 каким-то образом отсутствовала. То, что я сделал, было использовать приложение камеры, чтобы сделать снимок. Я заметил, что в деталях изображения указано, что он находится внутри /storage/emulated/ 0, хотя этот каталог не существует из файлового проводника. Затем я перезагрузил телефон. После перезагрузки каталог появился в проводнике файлов.

Ответ 11

У меня возникла аналогичная проблема при использовании mkdirs(), однако, поскольку выполняется команда:

mkdir one/two

не работает в Linux, тогда API (http://download.oracle.com/javase/1.4.2/docs/api/java/io/File.html#mkdirs()) также терпит неудачу. Я предполагаю, что это означает, что нельзя использовать mkdirs на Android? Мой (возможно, довольно хакерский) обход должен был создать каждый необходимый каталог отдельно:

String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
new File(extStorageDirectory + "/one/").mkdirs();
new File(extStorageDirectory + "/one/two/).mkdirs();

Ответ 12

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