Подтвердить что ты не робот

Каков наилучший способ создания временных файлов на Android?

Ну, это не совсем вопрос, так как я не "застрял" на своем коде, но я нашел странное поведение для Android API в отношении доступа к внешнему хранилищу и к методу File.createTempFile() и я хотел бы понять, что происходит...

Обратите внимание, что мой манифест не содержит <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">.


Часть 1:

У меня есть следующий код, который делает работает как прелесть:

File tempFile = new File(Environment.getExternalStorageDirectory(),
                      "my_temp_file.png");

он создает для меня временный файл, и я могу писать данные в нем без каких-либо проблем.

Вопрос 1: Почему он работает, поскольку я не должен писать права на SDCard?


Часть 2:

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

File tempFile = File.createTempFile("my_temp", "png", 
                      Environment.getExternalStorageDirectory());

и добавил WRITE_EXTERNAL_STORAGE в мой manifest.xml. Угадай, что? Это не работает, и я получаю java.io.IOException:

09-07 14:07:29.061: E/_CLOG(19982): java.io.IOException: Permission denied
09-07 14:07:29.061: E/_CLOG(19982):     at java.io.File.createNewFileImpl(Native Method)
09-07 14:07:29.061: E/_CLOG(19982):     at java.io.File.createNewFile(File.java:1257)
09-07 14:07:29.061: E/_CLOG(19982):     at java.io.File.createTempFile(File.java:1322)
09-07 14:07:29.061: E/_CLOG(19982):     at com.(...).onClick(ProfileImageUpdater.java:58)

Вопрос 2: Почему это не работает, тогда как imho это должно?

4b9b3361

Ответ 1

Я наконец понял, что было hapenning...

Вопрос 1: Фактически, файл, который был создан, предназначался для использования системным приложением для извлечения и обрезки изображения из галереи пользователя. Поэтому моему приложению не нужно было иметь разрешение WRITE_EXTERNAL_STORAGE, так как файл был написан самой системой.

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

Ответ 3

вы получаете эту ошибку, потому что объявляете разрешение manifest.xml для записи во внешнее хранилище. вам нужно добавить это разрешение.

также, никогда не пишут файлы (особенно временные) непосредственно на getExternalStorage().

Это будет прямо на SD-карте и создаст беспорядок. Для временных файлов, которые должны быть видны только вашему собственному приложению, вы должны использовать:

getExternalStorage() + "/Android/data/<package_name>/cache/"

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

изменить

Обратите внимание, что мой манифест не включает

вам нужно!

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

последнее редактирование:

и перед созданием файлов вы должны создать папку, вызвав mkdirs() в объекте File.