2012-09-07 30 views
12

好吧,這不完全是一個問題,因爲我並沒有真正「困擾」我的代碼,但我發現Android API有關訪問外部存儲和File.createTempFile()方法的一些奇怪行爲,以及我想了解發生了什麼...什麼是在Android上創建臨時文件的最佳方式?

請注意,我的清單不包含包括<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">


第1部分:

我有下面的代碼確實工作的魅力:

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

它會創建一個臨時文件給我,我可以寫DATAS在它沒有任何麻煩。

問題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:爲什麼這不起作用,而恕我直言,它應注意什麼?

+1

你仔細檢查過嗎? –

+0

是絕對:)兩種情況下 –

+0

你使用哪個android api?我相信如果將api設置爲4級,那麼某些權限不會被強制執行 – tomi

回答

0

我終於弄清楚發生了什麼......

問題1:實際上,創建的文件是爲了讓系統應用程序使用它來從用戶的畫廊中檢索和裁剪圖像。所以我的應用程序不必擁有WRITE_EXTERNAL_STORAGE權限,因爲該文件是由系統本身編寫的。

問題2:我不確定。我猜Android不允許在我試圖創建臨時文件的地方(因爲它不適合它)

4

由於您聲明瞭manifest.xml權限來寫入外部存儲器,因此您會收到此錯誤。您需要添加此權限。

也, 永遠不會永遠寫在getExternalStorage()上的文件(特別是臨時的)。

這將直接放在SD卡上,並會造成一團糟。 對於臨時文件只能由你自己的應用程序中可以看出,你應該使用:

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

通過您的應用程序打包,例如更換COM。 Orabig.myFirstApp 如果用戶卸載應用程序,系統將自動從系統中刪除特殊文件夾,使系統免受臨時文件的影響。

編輯:

請注意,我的清單不包括

你要!

編輯: 另外,如果你在創建臨時的媒體文件(PNG例如)是很好的做法,創建名爲該文件夾上.nomedia一個空文件。這樣你可以避免媒體掃描儀掃描它並在畫廊上顯示它。

最後編輯:

和創建文件之前,您必須在文件對象上調用mkdirs()創建文件夾。

+0

我想你是指'new File(Environment.getExternalStorageDirectory(),/ Android/data//cache/temp_crop_file.png「);'? –

+0

我只指向文件夾。然後你在那裏創建你想要的任何文件。 =],並且不要忘記你必須在清單上聲明,否則你總會得到一個錯誤。 – Budius

+0

感謝關於目錄(好點)和.nomedia(非常好的一點)的提示。但是,當你說「你必須」時,你沒有仔細閱讀我的問題。我的第一個代碼可以工作,但我在問:「它爲什麼會起作用」,而不是「我需要做些什麼才能使其工作」。 :) –

12

嘗試像這樣...

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

+0

我試過了,你是對的,它的工作原理,這是一個比外部目錄更適合臨時文件的地方。但是,這不能回答我的問題......請重新閱讀。 –

相關問題