繁体   English   中英

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

[英]What is the best way to create temporary files on 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());

并在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/<package_name>/cache/"

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

编辑:

请注意我的清单不包括

你必须!

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

最后编辑:

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM