#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. Все еще нет. Смотрите выше.