Android 外置SDCard讀寫權限總結

evjx0109 8年前發布 | 32K 次閱讀 移動應用 Android開發 移動開發

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

 

 本文由用戶 evjx0109 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!