如何在Android上创建临时文件的最佳方法是什么?

12

嗯,这不是一个问题,因为我的代码并没有出现“卡住”的情况,但我发现了一些有关访问外部存储和File.createTempFile()方法的Android API奇怪的行为,并且我想理解正在发生的事情...

请注意,我的清单没有包括<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">


第一部分:

我有以下代码,完美地工作:

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

它为我创建了一个临时文件,我可以在其中写入数据而不会遇到任何麻烦。

问题1:为什么它能工作,因为我不应该拥有SD卡上的写入权限?


第二部分:

我尝试更改我的代码以使用createTempFile,这是官方用于创建临时文件的方法。所以我尝试了:

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

我在我的manifest.xml文件中添加了WRITE_EXTERNAL_STORAGE。猜怎么着?这并没有起作用,我得到了一个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:为什么这个不起作用,而我认为它应该起作用?


你使用的是哪个Android API?我相信如果将API设置为Level 4,则某些权限不会被强制执行。 - tomi
3个回答

14

我尝试了,你是对的,它可以工作,并且这比外部目录更适合临时文件。然而,这并没有回答我的问题...请重新阅读。 - Orabîg

4
您之所以会出现这个错误,是因为您在manifest.xml文件中声明了写入外部存储的权限,您需要添加此权限。
另外,请永远不要直接在getExternalStorage()上编写文件(特别是临时文件)。
这会直接放在SD卡上,并创建混乱。 对于仅供您自己的应用程序查看的临时文件,您应该使用:
getExternalStorage() + "/Android/data/<package_name>/cache/"

将应用程序包替换为您的应用程序包,例如com. Orabig.myFirstApp。如果用户卸载应用程序,该特殊文件夹将自动从系统中删除,使系统免受临时文件的影响。
编辑:
请注意,我的清单不包括
你必须!
编辑:
此外,如果您创建临时媒体文件(例如PNG),最好在该文件夹上创建一个名为.nomedia的空文件。这样,您就可以避免媒体扫描仪扫描它并在画廊中显示它。
最后一次编辑:
在创建文件之前,您必须通过调用File对象上的mkdirs()来创建文件夹。

我猜你是指 new File(Environment.getExternalStorageDirectory(), "/Android/data/<package_name>/cache/temp_crop_file.png"); - Orabîg
我只是指向文件夹。然后你可以在那里创建任何文件。并且不要忘记在清单上声明,否则你将始终会收到错误提示。 - Budius
谢谢你提供有关目录(好建议)和.nomedia(非常好的建议)的提示。但是,当你说“你必须”时,你没有仔细阅读我的问题。我的第一段代码确实可以工作,但我想问的是:“它为什么能工作”,而不是“我必须做什么才能让它工作”。 :) - Orabîg
哦,你说得对。我没有完全阅读。现在重新阅读了一遍。老实说,我不知道为什么它能工作。它真的不应该。抱歉,无法帮忙。附注:关于首先创建目录的额外编辑。 - Budius

-1

我终于弄清楚发生了什么...

问题1:实际上,创建的文件是供系统应用程序从用户的图库中检索和裁剪图像使用的。因此,我的应用程序不需要拥有WRITE_EXTERNAL_STORAGE权限,因为文件是由系统本身编写的。

问题2:我不确定。我猜Android不允许在我尝试创建临时文件的地方创建它(因为那不是正确的位置)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接