mkdirs возвращает false для каталога на SD-карте, в то время как родительский каталог доступен для записи - PullRequest
19 голосов
/ 31 октября 2010

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

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

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

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

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

/ sdcard / .test (существует = false canWrite = false canRead = false canExecute = ошибка isDirectory = false isFile = false)

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

/ (существует = true canWrite = false canRead = true canExecute = ошибка isDirectory = true isFile = false)

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

(canExecute возвращает ошибку, поскольку тест выполняется на SDK <9) </p>

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

Ответы [ 12 ]

15 голосов
/ 31 октября 2010

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

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

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

7 голосов
/ 17 февраля 2016

Прежде всего, технически 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

6 голосов
/ 29 мая 2015

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

4 голосов
/ 25 июля 2013

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

4 голосов
/ 11 октября 2011

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

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

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

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

Таким образом, где-то, похоже, что некоторые производители взломали код getExternalStorageDirectory и каким-то образом возвращают ложное местоположение.

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

3 голосов
/ 10 сентября 2012

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

3 голосов
/ 03 января 2012

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

3 голосов
/ 07 декабря 2011

У меня была такая же проблема. Разрешение было установлено, а также путь был по умолчанию (/ mnt / sdcard), но мой андроид был подключен как внешнее устройство хранения для быстрого просмотра 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

Как видите, при подключении SD-карта находится в системной группе пользователей, и у нее нет никаких разрешений. После размонтирования группа изменяется на sdcard_rw и предоставляются разрешения на чтение и запись.

2 голосов
/ 31 октября 2010

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

1 голос
/ 10 сентября 2014

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

...