Запись во внутреннее приватное хранилище в Android

Я пытаюсь сохранить некоторые данные из своего приложения в простом текстовом файле во внутренней частной области хранения (пользовательские настройки приложения). Я прочитал много вопросов здесь (StackOverflow) и безуспешно пробовал предложенные решения. Кажется, самое простое решение было бы предложено здесь:

http://developer.android.com/guide/topics/data/data-storage.html#filesInternal

но я не могу заставить это работать мой тестовый аппарат. Я также попытался создать файл, используя методы, доступные в java.io.File, с соответствующими методами. Я также пытался создать файл на SD-карте с тем же результатом, но безуспешно. Я пробовал многие решения, перечисленные в других ответах, точно следуя предложенному коду и инструкциям, и нашел тот же результат. Я начинаю чувствовать, что мне не хватает какого-то важного фрагмента кода или где-то установленного флага, я установил разрешение в файле манифеста:

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


Чтобы было ясно, я пытаюсь писать во внутреннюю частную память устройства. Это небольшой файл, содержащий имя, номер телефона и пару флагов типа int. Какой бы метод я ни использовал, я либо обнаруживаю, что файл не создан (или изменяется, если я помещаю файл вручную на SDCard), либо получаю NullPointerException, когда пытаюсь сослаться на файл или местоположение файла:

private              File   fILE = new File("Mydata", main.FILENAME);

or

private              File   fILE  = getDir("Mydata", 0);


Я запускаю код на HTC Hero, обновленном последней версией обновления от Sprint. Любая помощь будет БОЛЬШОЙ признательна, Спасибо заранее!

-Стив

Обновление (2/2/11): Используя EVO (API 8), я все еще получаю исключение NullPointerException. Код, генерирующий исключение, приведен ниже. Любые мысли о том, почему мое приложение не может получить доступ к внутреннему хранилищу? У меня есть эта проблема на трех разных физических устройствах, использующих два уровня API (API 7 и 8).

    File newfile = new File(this.getFilesDir() + "/data/files/", "sample.txt");

ОБНОВЛЕНИЕ 2: 04.02.11. Я обнаружил, что ни при каких обстоятельствах не вижу файловую структуру на физическом устройстве (каталог данных). У кого-нибудь есть мысли по этому поводу? Устройство правильно настроено и может запускать приложение из eclipse или adb.

ОБНОВЛЕНИЕ 3: (9.02.11) - Думаю, я нашел, в чем здесь проблема, но я не уверен, как с этим справиться. Я выяснил, что права доступа к каталогу /data/ на физических устройствах: drwxrwx--x. Я не уверен, почему это так, может быть, что-то со Sprint? Я нашел этот набор таким образом на HTC Hero, Samsung Epic (Galaxy S) и HTC EVO на Sprint. Проблема, по-видимому, в том, что DDMS и мое приложение не имеют доступа r/w к каталогу. Здесь мне нужно выяснить две вещи: почему это так и как решить эту проблему в дикой природе. Опять же, любая помощь здесь будет УДИВИТЕЛЬНОЙ!!

ОБНОВЛЕНИЕ 4: Я думаю, что февраль прошлого года был для меня моментом полной блондинки (см. ОБНОВЛЕНИЕ 3). Тестовые устройства, которые у меня есть, не имеют ROOT-прав и, следовательно, доступа к ним (DUH!). После всех обновлений, которые прошли он SGS и EVO 4G, результат все тот же. Я все еще работаю над этой проблемой и постараюсь вернуться сюда с обновлением в ближайшее время (надеюсь, в следующий раз меньше чем через год).


person Kingsolmn    schedule 20.01.2011    source источник
comment
Вы получаете сообщение об ошибке, когда пытаетесь использовать эти разные методы, или это просто молчаливый сбой?   -  person Chris Thompson    schedule 27.01.2011
comment
Сейчас я концентрируюсь на пути openFileOutput() и получаю исключение NullPointerException. Кажется, что каталог личных данных на телефоне почему-то заблокирован, я даже не могу посмотреть каталог; там вроде ничего не создается. Права доступа к каталогу data на телефоне: drwxrwx--x. Я начинаю задаваться вопросом, есть ли недопустимые настройки на телефоне или что-то в этом роде. Приложение требует, чтобы файл данных записывался во внутреннюю память для совместимости.   -  person Kingsolmn    schedule 27.01.2011
comment
вы не сможете получить доступ к каталогу /data на физическом устройстве с DDMS, если у вас нет корневого доступа, но вы все равно сможете писать в файл из своего приложения. что происходит на эмуляторе? вы можете написать файл ок?   -  person techiServices    schedule 18.02.2011
comment
Я могу писать нормально, используя класс File в эмуляторе. это странно, у меня должен быть root-доступ на телефоне, не так ли?   -  person Kingsolmn    schedule 18.02.2011
comment
У вас не будет root-доступа на реальном устройстве, если вы не root операционную систему. Чего я бы не предложил. У меня есть Google Dev Phone 2, и даже у него нет root-доступа. Можете ли вы опубликовать трассировку стека из Logcat? Нет смысла работать на эмуляторе, но ни на одном из ваших устройств.   -  person techiServices    schedule 18.02.2011


Ответы (6)


Не прямой ответ на ваш вопрос, но тем не менее: я заметил, что вы не хотите хранить тонны данных в своем файле. Будет ли достаточной альтернативой использовать общие настройки?

И, возможно, даже более интересно: возникает ли проблема, даже если вместо этого вы пишете в файл общих настроек?

http://developer.android.com/guide/topics/data/data-storage.html#pref

person dbm    schedule 18.02.2011
comment
Я не могу просмотреть/программно получить доступ к каталогу /data/ на любом физическом устройстве. Я не запускал свое приложение на физическом устройстве с момента перехода на SharedPreferences, но я знаю, что по-прежнему не могу просмотреть каталог. Я использую Eclipse 3.5 classic, USB-драйверы HTC, все обновлены до самой последней версии. - person Kingsolmn; 18.02.2011
comment
Использование SharedPreferences работает на физическом устройстве. Смотрите мой ответ ниже для праздных предположений о том, что здесь произошло. @дбм - person Kingsolmn; 23.02.2011
comment
Да! :-) Вроде бы твоя насущная проблема по крайней мере решена. Рад, что смог помочь (спасибо за зеленую галочку) :-) - person dbm; 23.02.2011

Попробуйте изменить следующую строку:

File newfile = new File(this.getFilesDir() + "/data/files/", "sample.txt");

to:

File newfile = new File(this.getFilesDir() + "/","sample.txt");
person Panoli    schedule 29.10.2012
comment
Нет нужды в + "/". - person frogatto; 16.10.2017

Каталог /data/ физического устройства доступен только пользователю root. Поскольку единственный реальный способ получить этот доступ на физическом устройстве — получить root права на устройство, файловый менеджер DDMS не может попасть в эту ветвь дерева каталогов.

Что касается того, почему приложение не будет писать туда, вероятно, проблема в том, что я подписал приложение ключами отладки (не большой эксперт *NIX, но то, что здесь имеет место из моего личного исследования).

person Kingsolmn    schedule 23.02.2011

Я занимался той же проблемой. Наконец, я обнаружил, что вам действительно не нужно указывать все пути к файлам, чтобы создать новый файл во внутренней памяти. Просто укажите имя файла, и он будет создан в папке пакета вашего приложения на устройстве. Я точно упомянул здесь

И это работает отлично. Я бы посоветовал не указывать полный путь к файлу, например: /data/..., чтобы создать файл (вам нужны права на запись для создания файла таким образом). Позвольте платформе Android выполнить работу по созданию частного файла для вашего приложения.

person bianca    schedule 01.02.2013

Область внутреннего хранилища является частной для приложения, поэтому пользователь должен иметь root-доступ (устройство с root-правами) для создания и загрузки файлов. Если у вас есть рутированное устройство, вот как записать файл во внутреннюю память:

 // Create a file in the Internal Storage

String fileName = "MyFile";
String content = "hello world";

FileOutputStream outputStream = null;
try {
outputStream = openFileOutput(fileName, Context.MODE_APPEND);
outputStream.write(content.getBytes());
outputStream.close();
} catch (Exception e) {
  e.printStackTrace();
}

Это должно мгновенно создать файл с именем MyFile с содержимым hello world. Каталог внутреннего хранилища обычно находится в специальном месте, указанном в имени пакета нашего приложения. В моем случае это /data/data/[имя пакета], и созданные файлы хранятся в каталоге с именем files в этом каталоге.

person Akash    schedule 16.12.2016

Как говорит @bianca, вам лучше не использовать путь к файлу. Но вместо этого используйте только имя файла для создания File. Что-то вроде этого:

public static void saveTextToFile(Context context, String filename, String content) {
  try {
     FileOutputStream fos = openFileOutput(filename, Context.MODE_PRIVATE);
     fos.write(content.getBytes());
     fos.close();
  } catch (Exception e) {
     e.printStackTrace();
  }
}

И чтобы получить файл, вы можете использовать:

File file = new File(context.getFilesDir(), filename);

Подробнее: Сохранение файлов.

person ישו אוהב אותך    schedule 28.06.2017