12

好吧,这不完全是一个问题,因为我并没有真正“卡住”我的代码,但我发现 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:为什么这不起作用,而恕我直言它应该?

4

3 回答 3

14

试试这样...

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

编辑 :

对于问题 2

可能是以下链接的问题...

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

于 2012-09-07T12:22:40.230 回答
4

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

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

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

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

替换为您打包的应用程序,例如 com. Orabig.myFirstApp 如果用户卸载应用程序,该特殊文件夹会自动从系统中删除,从而使系统没有临时文件。

编辑:

请注意,我的清单不包括

你必须!

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

最后编辑:

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

于 2012-09-07T12:22:16.210 回答
-1

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

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

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

于 2012-09-12T09:32:43.377 回答