1. 程式人生 > >Android 外接SDCard讀寫許可權總結

Android 外接SDCard讀寫許可權總結

在Android中SD卡的讀寫許可權會經常用到,但由於最近的幾個版本對該部分一直在做相應的變動,所以在此做個總結,梳理一下。
主要的許可權為:

android.permission.READ_EXTERNAL_STORAGE
android.permission.WRITE_EXTERNAL_STORAGE

下面就沒個版本對SDCard許可權的變化做詳細的介紹:

Android 4.4

如果同時使用了機身儲存和SD卡, 那麼應用程式將無法在SD卡中建立、修改、刪除資料。但是應用程式仍然可以往主儲存(機身儲存)的任意目錄中寫入資料,不受任何限制。

Google表示, 這樣做的目的是,,通過這種方式進行限制,系統可以在應用程式被解除安裝後清除遺留檔案。

在Android開發者網站的 “外部儲存技術資訊”文件中描述道 :
WRITE_EXTERNAL_STORAGE只為裝置上的主要外部儲存授予寫許可權, ,應用程式無法將資料寫入二級外部儲存裝置,除非綜合許可權指定了應用程式的包目錄。這目前隻影響雙儲存裝置,如果你的裝置有內部儲存空間,即通常所說的機身儲存,那麼你的SD卡就是一個二級外部儲存裝置。

下面是來自知乎大神對該部分內容的一個總結:
那麼Android 4.4 為何要限制 SD 卡讀寫?
實際上這是個誤解,當讀完以下描述你會發現安卓4.4是加強了對SD卡的支援。
先定義幾個術語,以避免二義性:
內部儲存:指/data分割槽。
外部儲存

:指/sdcard分割槽。
合併儲存:指/sdcard實際上指向/data分割槽的一個目錄,兩者在物理上共享儲存空間。
SD卡:指物理可移除的那個小儲存卡片

Android 對SD卡的支援:
Android 2.1及之前的版本,不支援合併儲存,SD卡作為外部儲存,應用只能安裝到內部儲存。
Android 2.2起,不支援合併儲存,SD卡作為外部儲存,考慮到一些機型的內部儲存比較小,所以增加了安裝/移動應用到外部儲存的功能。
Android 3.0起,支援並推薦使用合併儲存方案。不採用合併儲存方案的機型,仍然可以沿用之前版本的方案(參見上一條目)。對於採用了合併儲存方案的機型,安裝一個應用到外部儲存等同於安裝它到內部儲存(所以介面上就沒有”移動到外部儲存/內部儲存”選項了),手機仍然可以配備SD卡,但SD卡對於第三方應用來說是隻讀的,僅媒體檔案可以通過MediaProvider暴露給使用者和應用讀取。
Android 4.4起,採用合併儲存方案的機型,可以配備SD卡,第三方應用程式可以通過公開的API讀寫自己在SD卡上的私有資料區(類似於/data/data/[package name]或/sdcard/Android/data/[package name]的私有資料區),也可以通過公開的API讀取SD上的其它檔案。

可以看出Android 對SD卡的支援是在逐步加強的,而產生“Android4.4限制SD卡”這個誤解的根源是在安卓4.4之前有很多手機廠商為了同時支援外部儲存和SD卡改寫了安卓系統,賦予了第三方應用完全讀寫SD卡的許可權,到Android 4.4時,這些廠商又不得不遵守谷歌的要求關閉了這個許可權。
需要說明的是,在Android 4.4裡,系統應用(指有platform簽名,或預裝在/system/priv-app目錄下的應用)可以通過使用WRITE_MEDIA_STORAGE許可權獲取完全讀寫SD卡的許可權。
補充:為了保證讀寫SD卡的遺留應用(legacy applications)能正常工作,有些廠商會無視安卓4.4的原始設計,通過修改分組策略在Android 4.4上也賦予使用WRITE_EXTERNAL_STORAGE許可權的程式完全讀寫SD卡的許可權。

Android 5.0

Android 5.0 起不能通過流的形式直接往外接SDCard目標路徑url裡面寫入資料了,必須通過support.v4.provider.DocumentFile來實現,可以通過傳送Intent.ACTION_OPEN_DOCUMENT_TREE,動態授予SDCard目錄樹的讀寫許可權。

Android 6.0

Android 6.0 加入了動態許可權申請機制,而SDCard讀寫許可權屬於危險許可權,所以對於這種許可權我們只在AndroidMenifest.xml中配置了還不行,還需動態的申請外接SDCard讀寫許可權。在Android6.0中,第三方應用不再被加入sdcard_r和sdcard_rw組中。相反,通過給應用掛載合適的執行時檢視,實現對外部儲存的訪問控制.

筆者水平有限,如有錯誤,歡迎指正,謝謝!