Хранение файла во внешнем хранилище и во внутреннем хранилище в Android

Я делаю приложение OCR в Android. Для этого мне нужно хранить обученные данные и изображения в папке моего приложения. До сих пор я делал это, используя

public static String DATA_PATH = Environment.getExternalStorageDirectory().toString() + "/NewsReader/"

и это прекрасно работает на устройствах с внешними SD-картами.

Но когда я пытаюсь запустить одно и то же приложение на устройстве, в которое либо не вставлены SD-карты и которое работает с внутренней памятью, либо на таком устройстве, как Nexus, у которого есть только внутренняя память, приложение дает сбой. Какие альтернативы у меня есть здесь. Я могу проверить состояние внешнего хранилища, чтобы узнать, доступно оно или нет, но если нет, то что должно делать мое приложение, а не просто сбой. Я даже пытался сделать getFilesDir().toString() + "/NewsReader/", но тот же результат.

ИЗМЕНИТЬ

Из некоторых ответов, которые я получаю, мой вопрос выше не говорит о моей реальной проблеме. Позвольте мне прояснить это подробнее.

Я делаю это: public static String DATA_PATH = Environment.getExternalStorageDirectory().toString() + "/NewsReader/" и он отлично создает папку NewsReader в телефоне, когда я запускаю его на устройстве с внешними SD-картами. Но не работает на устройствах только с внутренней памятью. И, чтобы добавить, в настоящее время я делаю весь этот бизнес по созданию файлов в своей активности splsh в потоке, но раньше, когда я делал тот же код в своей обычной Activity OnCreate, он работал на всех устройствах.


person Yogesh D    schedule 02.04.2014    source источник
comment
Environment.getExternalStorageDirectory() вернет путь к внешнему хранилищу. в большинстве случаев это путь к SD-карте. Но в некоторых телефонах внешнее хранилище в памяти телефона. И не используйте закодированные пути. Используйте File.Separator. То, что вы делаете, правильно   -  person Raghunandan    schedule 02.04.2014
comment
Если то, что я делаю, правильно, то почему приложение вылетает только на телефонах, которые не поддерживают внешние SD-карты?   -  person Yogesh D    schedule 02.04.2014
comment
не могли бы вы указать имя файла или имя каталога, которое вы хотите сохранить, потому что некоторые специальные символы не поддерживаются в качестве имени файла на некоторых мобильных устройствах, так что может быть проблема в этом.   -  person Bhanu Sharma    schedule 02.04.2014
comment
@y.dixit опубликуйте трассировку стека. это даст вам подсказку   -  person Raghunandan    schedule 02.04.2014


Ответы (4)


прочитайте это, надеюсь, вам поможет http://developer.android.com/guide/topics/data/data-storage.html

Вы можете использовать SharedPreferences:

Чтобы сохранить данные:

SharedPreferences.Editor editor = getPreferences(MODE_PRIVATE).edit();
 editor.putString("text", mSaved.getText().toString());
 editor.putInt("selection-start", mSaved.getSelectionStart());
 editor.putInt("selection-end", mSaved.getSelectionEnd());
 editor.commit();

Чтобы получить данные:

SharedPreferences prefs = getPreferences(MODE_PRIVATE); 
String restoredText = prefs.getString("text", null);
int selectionStart = prefs.getInt("selection-start", -1);
int selectionEnd = prefs.getInt("selection-end", -1);
person Mohammad Rababah    schedule 02.04.2014

Environment.getExternalStorageState() returns path to internal SD mount point like "/mnt/sdcard"

Нет, Environment.getExternalStorageDirectory() относится к тому, что производитель устройства считает «внешним хранилищем». На некоторых устройствах это съемный носитель, например SD-карта. На некоторых устройствах это часть встроенной флэш-памяти. Здесь «внешнее хранилище» означает «материал, доступный через режим USB Mass Storage при установке на хост-компьютер», по крайней мере, для Android 1.x и 2.x. Но вопрос по внешней SD. Как получить путь типа "/mnt/sdcard/external_sd" (он может отличаться от устройства к устройству)?

Android has no concept of "external SD", aside from external storage, as described above.

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

https://stackoverflow.com/a/5695129/596555
https://stackoverflow.com/a/15131810/596555

person boiledwater    schedule 02.04.2014

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

/* Checks if external storage is available to at least read */
public boolean isExternalStorageReadable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state) ||
    Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
    return true;
}
return false;}

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

File internal_storagefile = new File("/data/YourPackageName/files/abc.jpg");

Вы даже можете получить путь к внутреннему хранилищу:

File internalPath = File("/data/" + getApplicationContext().getPackageName() + "/");

Источник : Параметры хранилища Android.

Спасибо.

person The Great    schedule 02.04.2014
comment
Да, это правильно, но как использовать внутреннее хранилище, если внешнее хранилище недоступно? - person Yogesh D; 02.04.2014
comment
Поскольку мне просто нужен абсолютный путь... в случае getExternalStorage я получаю это, но как получить абсолютный путь для внутреннего хранилища таким же образом - person Yogesh D; 02.04.2014
comment
Абсолютный путь: /data/YourPackageName/YourFileWithExtension. - person The Great; 02.04.2014

Логично, что если нет внешнего хранилища, то вы не можете хранить во внешнем хранилище. Вы можете проверить, есть ли на устройстве внешнее хранилище.

Если нет, то вы должны хранить данные во внутренней памяти.

`String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        //do your code for external storage
    }else {
        //for internal storage
    }`
person Sayem    schedule 02.04.2014
comment
это пример кода для хранения данных во внутренней памяти. Строка FILENAME = hello_file; Строка string = привет, мир!; FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE); fos.write(string.getBytes()); fos.close(); - person Sayem; 02.04.2014