Android 外置SDCard讀寫權限總結
在 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卡作為外部存儲,考慮到一些機型的內部存儲比較小,所以增加了安裝/移動應用到外部存儲的功能。
安卓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時,這些廠商又不得不遵守谷歌的要求關閉了這個權限。
需要說明的是,在安卓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組中。相反,通過給應用掛載合適的運行時視圖,實現對外部存儲的訪問控制.
來自:http://www.cnblogs.com/changjl/p/6143283.html