ANDROID文件存儲位置切換

最近有個需求,助手的google衛星地圖和OpenCycleMap下載的離線地圖數據,要能夠在內置存儲和外置存儲空間之間切換,因爲離線瓦片數據非常大,很多戶外用戶希望將這些文件存儲在外置TF卡上,不佔用內置存儲空間,所以把最近研究的整理了下,分享給大家。

  需要考慮和遇到的問題(主要是不同手機、不同系統的兼容性):

  1.這樣獲取手機所有掛載的存儲器?

     Android是沒有提供顯式的接口的,首先肯定是要閱讀系統設置應用“存儲”部分的源碼,看存儲那裏是通過什麼方式獲取的。最後找到StorageManager和StorageVolume這2個重要的類,然後通過反射獲取StorageVolume[]列表。

  2.用什麼標示一個存儲器的唯一性?

   存儲路徑?不行(有些手機不插TF卡,內置存儲路徑是/storage/sdcard0,插上TF卡後,內置存儲路徑變成/storage/sdcard1,TF卡變成/storage/sdcard0)。

   存儲卡名稱?不行(可能會切換系統語言,導致名稱匹配失敗,名稱的resId也不行,較低的系統版本StorageVolume沒有mDescriptionId這一屬性)。

     經過測試,發現使用mStorageId可以標示存儲器的唯一性,存儲器數量改變,每個存儲器的id不會改變。

  3.如何獲得存儲器的名稱?

    經測試,不同的手機主要有3種獲取存儲器名換的方法:getDescription()、getDescription(Context context)、先獲得getDescriptionId()再通過resId獲取名稱。

  4.任務文件下載一半時,切換文件保存存儲器,怎麼處理?

    有2種方案:

    4.1 切換時,如果新的存儲空間足夠所有文件轉移,先停止所有下載任務,將所有下載完和下載中的文件拷貝到新的存儲空間,然後再更新下載數據庫下載任務的存儲路徑,再恢復下載任務;

    4.2 切換時,先拷貝所有下載完成的文件到新的存儲空間,下載任務繼續下載,下載完成再移動到新的存儲空間。

  5.在4.4系統上,第三方應用無法讀取外置存儲卡的問題。(參考“External Storage”)

   google爲了在程序卸載時,能夠完全徹底的將程序所有數據清理乾淨,應用將不能向2級存儲區域寫入文件。

   “The WRITE_EXTERNAL_STORAGE permission must only grant write access to the primary external storage on a device. Apps must not be allowed to write to secondary external storage devices, except in their package-specific directories as allowed by synthesized permissions. Restricting writes in this way ensures the system can clean up files when applications are uninstalled.”

   要能夠在4.4系統上TF卡寫入文件,必須先root,具體方法可以google。

   所以4.4系統上,切換會導致文件轉移和下載失敗,用戶如果要切換到TF卡,至少需要提醒用戶,並最好給出4.4上root解決方法。

 

  以下是獲取存儲器的部分代碼:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章