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

好吧,这不是一个问题,因为我并没有真正“卡住”我的代码,但我发现Android API有一些奇怪的行为,涉及访问外部存储和File.createTempFile()方法,而且我我想知道发生了什么……

请注意,我的清单包括


第1部分 :

我有以下代码作为魅力:

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

它为我创建了一个临时文件,我可以毫不费力地在其中写入数据。

问题1 :为什么它有效,因为我不应该在SDCard上拥有写作权限?


第2部分 :

我试图改变我的代码使用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 :为什么这不起作用,而imho呢?

试试这样……

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

编辑:

问题2

它可能是以下链接的问题…

Environment.getExternalStorageDirectory不返回可移动存储的路径

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

此外,永远不要直接在getExternalStorage()上编写文件(特别是临时文件)。

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

 getExternalStorage() + "/Android/data//cache/" 

替换您的app打包,例如com。 Orabig.myFirstApp如果用户卸载应用程序,系统会自动从系统中删除特殊文件夹,使系统免受临时文件的影响。

编辑:

请注意,我的清单不包括

你必须!

编辑:另外,如果您创建临时媒体文件(例如PNG),最好在该文件夹上创建名为.nomedia的空文件。 这样您就可以避免Media Scanner扫描它并在库中显示它。

最后编辑:

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

我终于想出了什么是hapenning ……

问题1:实际上,系统应用程序使用创建的文件来从用户的库中检索和裁剪图像。 所以我的应用程序不必拥有WRITE_EXTERNAL_STORAGE权限,因为该文件是由系统自己编写的。

问题2:我不确定。 我想Android不允许创建我想要的临时文件(因为它不适合它)