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

时间:2012-09-07 12:17:01

标签: java android file file-io

嗯,这不是一个问题,因为我并没有真正“卡住”我的代码,但我发现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 :为什么它有效,因为我不应该在我的SD卡上拥有写作权?


第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呢?

3 个答案:

答案 0 :(得分:14)

尝试这样......

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

修改:

问题2

可能会出现以下链接问题......

Environment.getExternalStorageDirectory does not return the path to the removable storage

答案 1 :(得分:4)

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

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

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

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

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

修改

  

请注意我的清单不包含

你必须!

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

上次修改

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

答案 2 :(得分:0)

我终于弄清楚了什么是hapenning ......

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

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