GetExternalFilesDir (null) возвращает null

Еще раз, я столкнулся с вопросом, который был задан и ответил ранее, но в моей реализации он все еще не работает.

Я вызываю getExternalFilesDir (null) прямо в начале моего основного действия onCreate. Он возвращает null каждый раз, независимо от того, запускаю ли я его в AVD или на моем телефоне (Samsung Galaxy Plus).

Да, у меня есть строка <uses-permission android:name="android.permissions.WRITE_EXTERNAL_STORAGE" /> в моем AndroidManifest.xml, и да, я проверяю состояние внешней памяти перед тем, как сделать звонок, и он установлен.

Вот первые три строки внутри моего метода onCreate(). Фактически, это сразу после вызовов super.onCreate() и setContentView().

String state = Environment.getExternalStorageState();
File extFiles = getExternalFilesDir(null);
File locFiles = getFilesDir();

Итак, как только эти три строки выполнены, это значения для переменных:

state == "mounted"
extFiles == null
locFiles == "/data/data/com.mypackage.name/files"

У кого-нибудь есть идеи относительно того, почему это может быть?

----- ----- РЕДАКТИРОВАТЬ

Итак, я пробовал другой подход; Вместо использования getExternalFilesDir(null) я попытался использовать File basePath = new File(Environment.getExternalStorageDirectory(), "myAppName");

Это не идеально, и я знаю, что в документации на Android сказано, и я согласен с этим, что вам лучше использовать getExternalFilesDir(). Увидев, что это не работает для меня, хотя мне пришлось попробовать что-то еще. На этот раз функция возвращает действительный объект File, поэтому после указанной выше строки basePath имеет значение /mnt/sdcard/myAppName. Все идет нормально. Когда я проверяю с помощью DDMS, я вижу, что существует /mnt/sdcard, но не /mnt/sdcard/myAppName. Этого можно ожидать. Поэтому я называю boolean result = basePath.mkdirs();

Но это возвращает false, и когда я проверяю файловую систему, я могу подтвердить, что подпапка myAppName не была создана. Когда я создаю папку вручную через DDMS и помещаю в нее файлы, я могу читать эти файлы из своего приложения, но я не могу ничего писать в этой папке.

Пожалуйста, помогите! Я нахожусь на своем конце.

Ответы

Ответ 1

Если это не опечатка, когда вы разместили свой вопрос, вы, вероятно, ненавидите себя за это:

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

должен быть

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

Ответ 2

Это из документации для Android:

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

Другой вариант - вы можете проверить, доступно ли внешнее хранилище:

String state = Environment.getExternalStorageState();
File filesDir;

// Make sure it available
if (Environment.MEDIA_MOUNTED.equals(state)) {
    // We can read and write the media
    filesDir = getExternalFilesDir(null);
} else {
    // Load another directory, probably local memory
    filesDir = getFilesDir();
}

Ответ 3

Удалить строку

uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"   

в AndroidManifest.xml.

Переключите редактор xml в "Разрешения манифеста Android" на вкладке "Разрешение" в eclipse и добавьте

uses-permission "android.permission.WRITE_EXTERNAL_STORAGE" 

с несколькими кликами.

Затем попробуйте запустить приложение.


Кажется, что затмение (может зависеть от детерминации версии или состояния или настроек) может игнорировать некоторые слова, описанные прямым xml в AndroidManifest.xml.


Спасибо за совет. Вы правы, мой ответ был похож на небольшой разговор.

Ответ 4

Моя проблема заключалась в том, что я открыл FileOutputStream, затем перед тем, как закрыть FileOutputStream, я открыл FileInputStream, чтобы посмотреть, что уже было в файле.

Я переместил открытие FileInputStream до того, как FileOutputStream откроется, и это решило мою проблему.