Java 在Android上创建临时文件的最佳方式是什么?

Java 在Android上创建临时文件的最佳方式是什么?,java,android,file,file-io,Java,Android,File,File Io,好吧,这并不是一个问题,因为我并不是真的“卡在”我的代码上,但我发现Android API在访问外部存储和File.createTempFile()方法方面有一些奇怪的行为,我想了解发生了什么 请注意,我的清单不包含 第1部分: 我有以下代码,可以作为一种魅力: File tempFile = new File(Environment.getExternalStorageDirectory(), "my_temp_file.png"); 它为我创建

好吧,这并不是一个问题,因为我并不是真的“卡在”我的代码上,但我发现Android API在访问外部存储和File.createTempFile()方法方面有一些奇怪的行为,我想了解发生了什么

请注意,我的清单不包含


第1部分:

我有以下代码,可以作为一种魅力:

File tempFile = new File(Environment.getExternalStorageDirectory(),
                      "my_temp_file.png");
它为我创建了一个临时文件,我可以毫不费力地在其中写入数据

问题1:既然我的SD卡上不应该有写权限,为什么它会起作用


第二部分:

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

File tempFile = File.createTempFile("my_temp", "png", 
                      Environment.getExternalStorageDirectory());
并在my 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:为什么这不起作用,而我认为它应该如何?

出现此错误是因为您在manifest.xml上声明了写入外部存储的权限。您需要添加此权限

而且, 永远不要直接在getExternalStorage()上写入文件(特别是临时文件)

这将直接放在SD卡上,造成混乱。 对于只能由您自己的应用程序查看的临时文件,您应该使用:

getExternalStorage() + "/Android/data/<package_name>/cache/"
getExternalStorage()+”/Android/data//cache/“
替换为您的打包应用程序,例如com。Orabig.myFirstApp 如果用户卸载应用程序,该特殊文件夹将自动从系统中删除,从而使系统不受临时文件的影响

编辑:

请注意,我的舱单不包括

你必须这么做

编辑: 此外,如果创建临时媒体文件(例如PNG),最好在该文件夹上创建一个名为.nomedia的空文件。这样,您就避免了媒体扫描仪扫描它并将其显示在多媒体资料中

上次编辑:

在创建文件之前,您必须通过调用File对象上的
mkdirs()
来创建文件夹。

像这样尝试

File outputDir = context.getCacheDir(); // context being the Activity pointer
File outputFile = File.createTempFile("prefix", "extension", outputDir);
编辑:

对于问题2

这可能是问题如下链接


我终于弄明白发生了什么

问题1:事实上,创建的文件是系统应用程序用来从用户的图库中检索和裁剪图像的。因此,我的应用程序不必拥有写入外部存储权限,因为文件是由系统本身写入的


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

我猜你的意思是
新文件(Environment.getExternalStorageDirectory(),“/Android/data//cache/temp_crop_file.png”)?我只指向文件夹。然后你在那里创建你想要的任何文件。=]别忘了你必须在清单上声明,否则你总是会得到一个错误。谢谢你关于目录的提示(好的一点)和.nomedia的提示(非常好的一点)。然而,当你说“你必须”时,你没有仔细阅读我的问题。我的第一个代码可以工作,但我要问的是:“为什么它可以工作”,而不是“我必须做些什么才能让它工作”。)哦,你说得对。我没有完全阅读。现在重读一遍。老实说,我不知道为什么它会起作用。真的不应该。对不起,我没办法。另外,关于先创建目录还有一个额外的编辑。我试过了,你是对的,它可以工作,而且它比外部目录更适合临时文件。然而,这并不能回答我的问题。。。请重新阅读。您使用的是哪种android api?我相信,如果将api设置为4级,则不会强制执行某些权限