天天看點

Android如何正确的儲存檔案 - 三戒1993

Android如何正确的儲存檔案

2015-09-17 20:02 

三戒1993 

閱讀(151) 

評論(0) 

編輯 

收藏 

舉報

在Android 官方開發文檔中有一篇文檔來介紹如何儲存應用的資料,但筆者用過很多程式(從知名的到不知名的)處理的都不是很完美,或者 沒有按照Android 開發團隊建議的方式去儲存他們應用的資料。當一些試用過的軟體解除安裝後,在SDCard中還保留了這些軟體的檔案目錄,時間一長就有很多目錄需要手工去清理,并且很難确認那些目錄是仍然在使用的

那些目錄已經沒用了,給使用者帶來困擾。這裡我們來讨論下該如何正确的儲存應用的資料。

首先資料分為兩種:和應用相關的資料;和應用無關的資料。這裡分别介紹:

應用無關的資料是那些使用者比較關心的資料,不管您的應用在不在使用者裝置上,這些資料使用者都希望保留,這些資料包含:用相機拍攝的照片、用浏覽器(下載下傳工具)下載下傳的檔案、使用者制作的個性鈴聲等。

假設您開發了一個照相應用(例如: 360相機),使用者用您的應用拍攝并處理過的照片就屬于應用無關的資料,如果使用者把您的應用給解除安裝了,使用者還是會期望仍然保留他們拍攝并處理過的照片。這裡的照片按照Android官方的建議應該儲存到 DIRECTORY_PICTURES 目錄中,該目錄通過Environment.getExternalStoragePublicDirectory(String

type)來擷取,您可以在該目錄下建立一個以您的程式命名的目錄來儲存資料。其他支援的目錄清單請參考這裡。

應用相關的資料: 這種資料隻和您的應用相關,如果您的應用被使用者删除了這些資料也沒有理由還存在使用者裝置中。這種資料包含:資料庫檔案、屬性配置檔案、應用的緩存檔案等。這種資料可以有很多種儲存方式,詳情參考這裡。

這裡我們隻讨論在API 8(Android 2.2)中新引入了一種儲存到外部存儲空間的僞私有資料API,通過函數getExternalFilesDir()

來擷取該路徑,同樣可以設定擷取各種類型資料的參數,例如 DIRECTORY_MUSIC 和 DIRECTORY_RINGTONES (如果參數為null則傳回您應用資料的跟目錄)。比如一個應用的包名為 org.goodev.test 的應用,通過函數getExternalFilesDir(Environment.DIRECTORY_MOVIES)擷取到的檔案路徑為 /storage/sdcard0/Android/data/org.goodev.test/files/Movies。

細心的讀者已經發現,該資料目錄為SDCard (外部儲存設備,有可能是内置SDCard 比如 Nexus S) 中名字為 Android 的根目錄下,該目錄下有個用來儲存應用資料的 data 目錄,在這個 data 目錄中儲存了裝置中各個應用的資料,依包名來命名,如果設定參數為null則傳回的是跟目錄:/storage/sdcard0/Android/data/org.goodev.test/files。

為啥這個目錄我們稱之為僞私有資料目錄呢? 因為在2.2以上的系統中,當您的應用被使用者解除安裝的時候,儲存在這個目錄下的資料也會被系統删除;并且在預設情況下多媒體掃描器不會掃描該目錄下的圖檔、MP3等多媒體檔案– 從這個角度看這個目錄是應用的私有資料目錄。 由于該目錄存在于外部存儲空間中,任何其他具有讀寫外部存儲空間權限的應用都可以通路您的應用資料 — 從這個角度看這些資料又不是私有的。 是以我們就稱之為 僞私有資料。

那麼為什麼Android在2.2中引入這種僞私有資料儲存方式呢? 這樣應用的資料不是很不安全嗎? 這種存儲方式适合儲存那些資料呢? 下面我們來逐個分析下這些問題:

為何引入這種存儲方式?

有些Android應用在使用過程中,可能會産生很多需要儲存的檔案資料,而這些資料需要在應用解除安裝的時候被删除掉,按照2.2之前的方式,這種需求的資料隻能儲存到内部存儲空間中,而系統的内部存儲空間都是有限的,為了讓使用者能在有限的存儲空間中安裝更多的應用,是以出現了這種存儲方式。個人觀點僅供參考 \(^o^)/~。

存儲在僞私有目錄的資料是不是很不安全?

當然是不安全的,任何應用都有可能通路這些資料,是以一般而言這裡隻儲存那些不是非常敏感的資料,由于這些目錄中的資料有可能被使用者或者其他應用删除掉,是以在使用這裡面的資料的時候要先檢測下資料是否存在、有效,如果無效則需要從新下載下傳使用。

這種存儲方式适合那些資料呢?

比如一個圖檔浏覽類的應用,用該目錄來儲存系統圖檔的縮略圖友善提高應用浏覽圖檔的流暢度;或者圖書類應用用來儲存圖書的封面圖檔等。

如果您的應用運作在舊的裝置(低于2.2的版本)上,則您也應該按照上面的建議把檔案儲存到 /Android/data//files/ 目錄下,這樣如果使用者更新的裝置版本後,這些資料就随着應用的解除安裝而被删除掉了。

遺留問題

當然也有一些比較有争議的資料,比如 IM聊天軟體接收到的圖檔和自定義表情資料 應該儲存到SDCard中呢還是上面介紹的 僞私有資料 存儲目錄中呢? 如果使用者解除安裝了聊天軟體,使用者是否期望繼續儲存他們接收到的圖檔和自定義表情圖檔呢? 這個問題恐怕針對不同的使用者得到的答案是不一樣的。這時,我們咋辦??

個人建議針對這種沒有明确界限的需求,可以在使用者第一次使用程式的時候,引導使用者去設定他們的這些資料儲存到哪裡?儲存到外部存儲空間(應用解除安裝後資料依然存在);或者儲存到應用外部存儲目錄中(應用解除安裝後資料自動删除)。 這種做法類似下載下傳一些PC軟體的做法,比如一些軟體在解除安裝的時候會填出對話框讓使用者選擇是否保留使用者資料。隻不過在Android系統中解除安裝應用目前沒辦提供該功能,是以隻能在應用第一次使用的時候 讓使用者知道有這麼個設定項。

PS:筆者目前最反感的就是一些應用下載下傳了很多小圖檔到SDCard中,然後打開圖庫應用會發現裡面有很多這種小圖檔(比如人的頭像啦、物品縮略圖啦、圖書封面圖檔啦),這種資料就不應該出現在使用者的圖庫應用中去。 如果把這些資料儲存到上述的僞私有資料目錄中則 就不會出現這種問題。 目前為了避免這種問題,筆者不得不自己在各種目錄中建立“.nomedia”檔案。相當繁瑣啦!

本文出自 雲在千峰,轉載時請注明出處及相應連結。

本文永久連結: http://blog.chengyunfeng.com/?p=438

Read more: http://blog.chengyunfeng.com/?p=438#ixzz3lzqnErH5