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 откроется, и это решило мою проблему.