Не удается создать Dir External Files в Android.WRITE_EXTERNAL_STORAGE присутствует - PullRequest
8 голосов
/ 28 сентября 2011

Я пытался использовать и мой ApplicationContext, и мой Service Context для доступа к внешнему каталогу. К сожалению, он продолжает возвращать 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>

и вот где код портится:

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 не работает, хотя и раньше.

Ответы [ 3 ]

10 голосов
/ 28 сентября 2011

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

6 голосов
/ 26 июня 2013

Это старая ветка, но я столкнулся с той же проблемой и нашел причину, которая меня удивляет, не является более распространенной.Я пытался записать данные на внешнее хранилище, когда мое устройство было подключено к компьютеру / 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: открыть не удалось: EROFS (файловая система только для чтения) 06-25 16: 16: 09.565: W / System.err (4290): at libcore.io.IoBridge.open (IoBridge.java:416) 06-25 16: 16: 09.565: W / System.err (4290):в 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): на com.seine.trophy.database.DownloaderThread.run (DownloaderThread.java:79) 06-25 16: 16: 09.573: W / System.err (4290): Вызвано: libcore.io.ErrnoException: открыть не удалось: EROFS (файловая система только для чтения) 06-25 16: 16: 09.573: W / System.err (4290): at libcore.io.Posix.open (собственный метод) 06-25 16: 16: 09.573: W / System.err (4290): at libcore.io.BlockGuardOs.open (BlockGuardOs.java:110) 06-25 16: 16: 09.573: W / System.err (4290): at libcore.io.IoBridge.open (IoBridge.java: 400) 06-25 16: 16: 09.573: W / System.err (4290): ... еще 3

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

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

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

2 голосов
/ 24 декабря 2012

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

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

...