標籤:設計 實現 方案 資料區 car ica ide color 存取控制
在Android 4.4中,如果同時使用了機身儲存和SD卡, 那麼應用程式將無法在SD卡中建立、修改、刪除資料。但是應用程式仍然可以往主儲存(機身儲存)的任意目錄中寫入資料,不受任何限制。
Google表示, 這樣做的目的是,,通過這種方式進行限制,系統可以在應用程式被卸載後清除遺留檔案。比如,你無法使用酷我音樂盒下載儲存Mp3到外置儲存卡了,也無法使用快讀免費小說將TXT版小說下載儲存到外置儲存卡了
在Android開發人員網站的 "外部儲存技術資訊"文檔中描述道 :
WRITE_EXTERNAL_STORAGE只為裝置上的主要外部儲存授予寫入權限, ,應用程式無法將資料寫入二級外部存放裝置,除非綜合許可權指定了應用程式的包目錄。
這目前隻影響雙存放裝置,如果你的裝置有內部儲存空間,即通常所說的機身儲存,那麼你的SD卡就是一個二級外部存放裝置。
那麼Android 4.4 為何要限制 SD 記憶卡讀寫?
實際上這是個誤解,當讀完以下描述你會發現安卓4.4是加強了對SD卡的支援。
先定義幾個術語,以避免二義性:
內部儲存:指/data分區。
外部儲存:指/sdcard分區。
合并儲存:指/sdcard實際上指向/data分區的一個目錄,兩者在物理上共用儲存空間。
SD卡:指物理可移除的那個小儲存卡片
安卓對SD卡的支援:
安卓2.1及之前的版本,不支援合并儲存,SD卡作為外部儲存,應用只能安裝到內部儲存。
安卓2.2起,不支援合并儲存,SD卡作為外部儲存,考慮到一些機型的內部儲存比較小,所以增加了安裝/行動裝置 App到外部儲存的功能。
安卓3.0起,支援並推薦使用合并儲存方案。不採用合并儲存方案的機型,仍然可以沿用之前版本的方案(參見上一條目)。對於採用了合并儲存方案的機型,安裝一個應用到外部儲存等同於安裝它到內部儲存(所以介面上就沒有"移動到外部儲存/內部儲存"選項了),手機仍然可以配備SD卡,但SD卡對於第三方應用來說是唯讀,僅媒體檔案可以通過MediaProvider暴露給使用者和應用讀取。
安卓4.4起,採用合并儲存方案的機型,可以配備SD卡,第三方應用程式可以通過公開的API讀寫自己在SD卡上的私人資料區(類似於/data/data/[package name]或/sdcard/Android/data/[package name]的私人資料區),也可以通過公開的API讀取SD上的其它檔案。
可以看出安卓對SD卡的支援是在逐步加強的,而產生“安卓4.4限制SD卡”這個誤解的根源是在安卓4.4之前有很多手機廠商為了同時支援外部儲存和SD卡改寫了安卓系統,賦予了第三方應用完全讀寫SD卡的許可權,到安卓4.4時,這些廠商又不得不遵守Google的要求關閉了這個許可權。
需要說明的是,在安卓4.4裡,系統應用(指有platform簽名,或預裝在/system/priv-app目錄下的應用)可以通過使用WRITE_MEDIA_STORAGE許可權擷取完全讀寫SD卡的許可權。
補充:為了保證讀寫SD卡的遺留應用(legacy applications)能正常工作,有些廠商會無視安卓4.4的原始設計,通過修改分組策略在安卓4.4上也賦予使用WRITE_EXTERNAL_STORAGE許可權的程式完全讀寫SD卡的許可權。
Android 5.0不能通過流的形式直接往外置SDCard目標路徑url裡面寫入資料了,必須通過support.v4.provider.DocumentFile來實現,可以通過發送Intent.ACTION_OPEN_DOCUMENT_TREE,動態授予SDCard分類樹的讀寫權限。
Android 6.0還需要先申請外置SDCard讀寫權限。在Android6.0中,第三方應用不再被加入sdcard_r和sdcard_rw組中。相反,通過給應用掛載合適的運行時視圖,實現對外部儲存的存取控制.
Android 外置SDCard讀寫權限總結