2011-01-20 2 views
9

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

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

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

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

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


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

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

или

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


Я бегу код на HTC Hero, обновленный с последней версией службы от Sprint. Любая помощь была бы ВЕЛИКОЙ оценкой, спасибо заранее!

-Стив

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

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

UPDATE 2: 2/4/11 - я обнаружил, что я не могу увидеть структуру файлов на физическом устройстве (каталог данных) при любых обстоятельствах. У кого-нибудь есть мысли по этому поводу? Устройство настроено правильно и может запускать приложение из eclipse или adb.

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

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

+0

Получаете ли вы сообщение об ошибке при попытке использовать эти различные методы или просто просто терпят неудачу? –

+0

Я сосредоточен на 'openFileOutput()' прямо сейчас, и я получаю исключение NullPointerException. Кажется, что личный каталог данных на телефоне заблокирован по какой-то причине, я даже не могу посмотреть на каталог; его вроде ничего не создает. Разрешения в каталоге «data» на телефоне: «drwxrwx - x».Я начинаю задаваться вопросом, существует ли неверная настройка на телефоне или что-то в этом роде. Требование к приложению заключается в том, что файл данных записывается во внутреннее хранилище для обеспечения совместимости. – Kingsolmn

+0

, вы не сможете получить доступ к каталогу/данных на физическом устройстве с помощью DDMS, если у вас нет доступа root, но вы все равно сможете писать в файл из своего приложения. что происходит на эмуляторе? можете ли вы написать файл в порядке? – techiServices

ответ

3

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

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

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

+0

Я не могу просмотреть/программно получить доступ к каталогу/data/на любом физическом устройстве. Я не запускаю свое приложение на физическом устройстве, поскольку меняю его на SharedPreferences, но я знаю, что я все еще не могу просмотреть каталог. Я использую Eclipse 3.5 classic, HTC usb drivers, все обновленные до самой последней версии. – Kingsolmn

+0

Использование 'SharedPreferences' действительно работает на физическом устройстве. См. Мой ответ ниже для простых размышлений о том, что здесь произошло. @dbm – Kingsolmn

+0

Yeay! :-) Кажется, ваша немедленная проблема решена по крайней мере. Рад, что я мог бы помочь (спасибо за зеленую галочку) :-) – dbm

4

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

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

4

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

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

к:

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

Thers не нуждается в '+"/"'. –

4

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

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

2

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

// 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 с содержанием приветом миром. Внутренний каталог хранения обычно находится в специальном месте, указанном именем пакета нашего приложения. В моем случае это/data/data/[имя пакета], и созданные файлы хранятся в каталоге с именами файлов в этом каталоге.

0

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

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); 

Подробнее: Saving Files.

 Смежные вопросы

  • Нет связанных вопросов^_^