2010-10-31 4 views
17

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

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

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

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

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

/sdcard/.test (существует = ложь canWrite = ложь CanRead = ложь CanExecute = эээ isDirectory = ложь ISFILE = ложь)

/SDCard (существует = истина canWrite = TRUE CanRead = TRUE CanExecute = ERR isDirectory = TRUE ISFILE = ложь)

/(существует = истина canWrite = FALSE CanRead = TRUE CanExecute = ERR isDirectory = TRUE ISFILE = ложь)

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

(CanExecute возвращает заблуждаются, потому что тест выполняется на < 9 SDK)

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

+1

Не могли бы вы показать код, где вы пытаетесь создать каталог? Например, если у вас есть жесткая '/ sdcard', это может быть ваша проблема прямо там. – CommonsWare

+0

@CommonsWare: Я использую Environment.getExternalStorageDirectory() и думая о переключении на Context.getExternalFilesDir (null), как только я понял эту проблему ... Я отредактирую свое оригинальное сообщение с кодом .. Thansk для быстрого ответа ! – Danny

+0

Имейте в виду, что 'getExternalFilesDir()' существует только для Android 2.2 и не работает в этой версии. Я буду придерживаться вашей текущей стратегии в обозримом будущем. – CommonsWare

ответ

15

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

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

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

+5

У меня только эта проблема для очень небольшого числа пользователей, и мой AndroidManifest.xml имеет разрешение WRITE_EXTERNAL_STORAGE внутри тега манифеста, поэтому я сожалею, что это не причина. – Danny

2

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

+0

Не думаю, что это он, Я использую http://developer.android.com/reference/android/os/Environment.html#getExternalStorageState(), чтобы проверить это, и он дает «смонтированный», он должен дать «mount_ro» в вашей ситуации, я думаю ... Спасибо, хотя .. – Danny

0

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

MKDIR один/два

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

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

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

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

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

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

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

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

3

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

2

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

2

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

+0

Возможно, я ошибаюсь, но это технически тот же самый ответ, что и мой, с меньшим количеством слов ...: | – yoshi

4

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

1

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

0

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

6

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

7

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

+0

А что делать, если разрешение не предоставляется? Как запросить его правильно? –