Невозможно создать External Files Dir в Android. WRITE_EXTERNAL_STORAGE присутствует

Я попробовал использовать как мой ApplicationContext и мой вызывающий Context Service для доступа к внешнему каталогу. К сожалению, он продолжает возвращать null , а LogCat сообщает, что он не смог создать внешний каталог. Я уверен, что у меня есть WRITE_STORAGE_PERMISSION , но это все равно не сработает. На моем устройстве работает API 10 (2.3.3) vanilla android. Есть идеи?

Вот мой манифест:

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="droid.signboard" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="10" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <application android:icon="@drawable/icon" android:label="@string/app_name" android:name="SignboardApp"> <receiver android:name=".ApplicationStarter"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"></action> <action android:name="droid.signboard.LAUNCHER_START"></action> </intent-filter> </receiver> <activity android:label="@string/app_name" android:screenOrientation="landscape" android:launchMode="singleTop" android:name=".view.Signboard"> <intent-filter> <action android:name="android.intent.action.MAIN"></action> <category android:name="android.intent.category.LAUNCHER"></category> </intent-filter> </activity> <service android:name=".controller.MasterControllerService"> <intent-filter> <action android:name="droid.signboard.LAUNCH_SERVICE_FROM_ACTIVITY"></action> </intent-filter> </service> </application> </manifest> ? <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="droid.signboard" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="10" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <application android:icon="@drawable/icon" android:label="@string/app_name" android:name="SignboardApp"> <receiver android:name=".ApplicationStarter"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"></action> <action android:name="droid.signboard.LAUNCHER_START"></action> </intent-filter> </receiver> <activity android:label="@string/app_name" android:screenOrientation="landscape" android:launchMode="singleTop" android:name=".view.Signboard"> <intent-filter> <action android:name="android.intent.action.MAIN"></action> <category android:name="android.intent.category.LAUNCHER"></category> </intent-filter> </activity> <service android:name=".controller.MasterControllerService"> <intent-filter> <action android:name="droid.signboard.LAUNCH_SERVICE_FROM_ACTIVITY"></action> </intent-filter> </service> </application> </manifest> 

И вот где код запутывается:

 private boolean canWriteEx () { String state = Environment.getExternalStorageState (); if (state.equals (Environment.MEDIA_MOUNTED)) { Log.i (TAG, "Can write to external directory: " + context.getExternalFilesDir (null).getAbsolutePath ()); return true; } else { Log.i (TAG, "Cannot write to external directory: " + context.getExternalFilesDir (null).getAbsolutePath ()); return false; } } 

Код – это метод Runnable , вызываемый Service . Конструктор Runnable принимает в качестве параметра Context . Это Context используемый кодом. Код вызывает исключение при успешном вызове журнала, подразумевая наличие и доступность внешнего хранилища.

ОБНОВЛЕНИЯ ПОПЫТКОВЫХ ИСПЫТАНИЙ:

Чистая установка не работает.
Возврат к API 9 не работает, хотя он работал раньше.

FIXED , но я действительно не знаю, почему это работает сейчас. Я перезагружаю устройство , и внезапно все будет работать; Context#getExternalFilesDir () перестает возвращать null . Несмотря на то, что он работает сейчас (спасибо и реквизит для Роя и Мосса The IT Crowd ), я должен сообщить об этом Google или что-то еще?

Это старая нить, но я столкнулся с одной и той же проблемой и нашел причину, которую я удивляю, не чаще. Я пытался писать на внешнюю память, пока мое устройство было подключено к компьютеру / Eclipse .. и я получал следующую ошибку,

06-25 16: 16: 09.565: W / ApplicationContext (4290): невозможно создать каталог внешних файлов 06-25 16: 16: 09.565: W / System.err (4290): java.io.FileNotFoundException: /full_archive.zip : Open failed: EROFS (файловая система только для чтения) 06-25 16: 16: 09.565: W / System.err (4290): на libcore.io.IoBridge.open (IoBridge.java:416) 06-25 16: 16: 09.565: W / System.err (4290): at java.io.FileOutputStream. (FileOutputStream.java:88) 06-25 16: 16: 09.565: W / System.err (4290): на java.io. FileOutputStream. (FileOutputStream.java:73) 06-25 16: 16: 09.565: W / System.err (4290): at com.seine.trophy.database.DownloaderThread.run (DownloaderThread.java:79) 06-25 16 : 16: 09.573: W / System.err (4290): вызвано: libcore.io.ErrnoException: open failed: EROFS (файловая система только для чтения) 06-25 16: 16: 09.573: W / System.err (4290) ): В libcore.io.Posix.open (родной метод) 06-25 16: 16: 09.573: W / System.err (4290): в libcore.io.BlockGuardOs.open (BlockGuardOs.java:110) 06-25 16: 16: 09.573: W / System.err (4290): на libcore.io.IoBridge.open (IoBridge.java:400) 0 6-25 16: 16: 09.573: W / System.err (4290): … еще 3

Это из руководства разработчика …

Внимание: внешнее хранилище может стать недоступным, если пользователь монтирует внешнюю память на компьютере …

Простое снятие телефона с моего компьютера / IDE решило проблему для меня.

Вам нужно иметь разрешение WRITE_EXTERNAL_STORAGE в вашем AndroidManifest.xml. По крайней мере, вот что решило это для меня.

Добавьте строку <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> перед вашей строкой <application ...