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

#java #android

#java #Android

Вопрос:

Я пишу приложение, в котором я хотел бы разрешить использование созданного файла csv на ПК. Android имеет внутреннее хранилище, которое доступно для просмотра на Android и может быть доступно через USB на ПК. Я пробовал различные методы для генерации имени файла:

 /data/user/0/com.ed.ilan.ioioterbium/files/documents/2016_9_16_10_28_12.csv
/data/user/0/com.ed.ilan.ioioterbium/files/2016_9_16_10_35_57.csv
2016_9_16_10_46_34.csv
 

Имя приложения я получил с помощью getFilesDir(), но первые 2 примера не сработали, поскольку Java жаловалась на косые черты в имени. 3-й работал, но в (AppName)/files/ ничего не было видно. Я не знаю, было ли это сделано специально по соображениям безопасности или файла действительно не было. Код

 String name = getFileName();
try {
        FileOutputStream fOut = new FileOutputStream(name);
        OutputStreamWriter osw = new OutputStreamWriter(fOut);
        osw.write("test1");
        osw.flush();
        osw.close();
        fOut.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
 

Мне бы очень хотелось, чтобы файл находился во внутреннем хранилище. Я создал папку с именем myData, которую я могу видеть как на телефоне, так и на ПК. Вопрос в том, как мне направить приложение на запись во внутреннее хранилище. Я понимаю, что это не «безопасно», но я просто хочу получить файл.

Для записи во внутреннее хранилище это необходимо в манифесте

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

Если мы решим поместить файл на облачный сервер, есть ли стандартный способ сделать это?

Спасибо, Илан

Ответ №1:

Если вы используете getFilesDir(), то он возвращает путь, специфичный для приложения Android. Пользователь просто не может получить доступ к пути, возвращаемому getFilesDir().

Если у вас есть корневое устройство, вы можете получить доступ к указанному выше пути.

Если вы хотите, чтобы только ваше приложение могло получать доступ к файлам, сохраненным вами, тогда используйте getFilesDir() , иначе вы можете использовать

 Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS).getAbsolutePath();
 

Комментарии:

1. Все еще нет. Для пути я получаю /storage/emulated/0/2016_9_16_16_20_46.csv. Затем я получаю сообщение об ошибке при выводе openFileOutput как: java.lang. Исключение IllegalArgumentException: File /storage/emulated/0/2016_9_16_16_20_46.csv содержит разделитель путей. Я думаю, что эта ошибка жалуется на косые черты.

2. Разделитель пути произошел из-за того, что не использовался new FileOutputStream. Я отредактировал сообщение с правильным кодом. Теперь я получаю java.io.FileNotFoundException: /storage/emulated/0/2016_9_16_20_19_30.csv: открыть не удалось: EACCES (отказано в разрешении). Я думал, что добавление к манифесту должно исправить это, но что-то все еще не так. Очевидно, что сам файл не существует, но он должен его создать? Может быть, мне нужно явно поместить его в каталог, подобный myData?

3. Не пойдет. Это что-то другое java.io.FileNotFoundException: /storage/emulated/0/myData/2016_9_16_20_33_25.csv: ошибка открытия: EACCES (отказано в разрешении)

4. На какой версии Android вы запускаете приложение??

5. Если вы используете API 23 или выше, вам необходимо запросить разрешение во время выполнения

Ответ №2:

Я понимаю, что вы хотите записать файл в Documents папку вашего телефона, я прав? Если это так, может помочь следующее, куда вы можете записать свои файлы .csv.

  Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS);
 

Комментарии:

1. Все еще нет. Смотрите выше.