android檔案管理器開發中遇到的一些問題
1.難點主要有如何獲取外掛裝置的資訊以及路徑無論是U盤還是TF卡等等
獲取方式在其他部落格中請自己檢視。
2.在Android6.0中想要對外部裝置進行的檔案的操作是比較難的
因為6.0中Android系統對外部儲存器操作的許可權進行了修改,所以只能進行讀操作,無法進行對外部裝置的寫操作,在翻看了大量的知識部落格中,找的了相關的解決方法
Android 外部儲存許可權分析
不知道你有麼有發現,來自菜鳥的成長史:http://blog.csdn.net/zjbpku/article/details/25161131,
KitKat之後的版本不再支援使用者對外接SDcard(Secondary Storage)的寫入等操作。如果使用者想要將檔案等copy到手機中,則只能
儲存到內部儲存器中,而無法儲存到外接sdcard中,而且無法建立新的資料夾,這樣一來給使用者和開發者都帶來了一定的不便。之所
以在KitKat之後版本中無法操作外接Sdcard,是因為Google更改了此模組的許可權,以前我們可以直接獲取WRITE_EXTERNAL_STORAGE
和READ_EXTERNAL_STORAGE許可權來直接操作Sdcard,現在則不能,其目的是軟體解除安裝時能將該軟體建立的檔案全部刪除。據Google
員工Jeff SharKey(此模組的開發者)介紹,自Kitkat之後Anroid提供了新的API去訪問Secondary External Storage,但這不是本文重點,本
文重點是分析外部儲存許可權是如何作用的。
在KitKat之前的Android版本會給應用程式單獨分出一塊外部儲存空間(external storage),這塊儲存空間可能在sdcard
(可插拔的外接sdcaard)上,也可能在僅僅是在裝置內部的快閃記憶體上,我們要獲得WRITE_EXTERNAL_STORAGE許可權在能對這塊
空間進行訪問,如果只是讀取內容則不需要許可權。在4.4 KitKat及之後的版本中,Google做了兩個變化:1、進行讀取時需要
READ_EXTERNAL_STORAGE許可權;2、訪問應用所屬的目錄下(如:android/data/[package name])儲存的資料是不需要任
何許可權的。
KitKat中,外部儲存(external storage)被分割成了多個部分:一個“primary”部分,一個或多個“secondary”部分。在Kitkat之前的
API 可以用來操作 primary external storage,secondary external storage 是對write許可權做了稍微修改,與上邊所述一樣,在應用所
所屬的目錄(如:android/data/[package name])下,對檔案是有所有操作許可權的,在應用所能管理到目錄之外,該應用則不具有寫
的許可權,不能進行任何寫的操作。這裡也就引出了本文的重點。ps:Google雖然沒有要求各廠商在Sdcard的操作上新增額外許可權,但
是它卻強制要求製造商對secondary external storage做了許可權限制。如果你對Internal storage和external storage有疑問,可以看看文
檔 https://developer.android.com/guide/topics/data/data-storage.html#filesInternal
根據Jeff SharKey 的介紹,當前版本的Android系統,也就是Kitkat,使用FUSE (Filesysgem in Userspace ) 對external storage進
行管理。為了在檔案建立時獲取必要的許可權,動態地接受或拒絕來自使用者/組的個別請求,會有一個Android 守護程序參與與FUSE 核心
驅動的互動。這僅僅是Android在FAT File System 格式化後的可移動捲上使用Linux型許可權的一部分,在核心中它也允許使用超出基本的
owner/gouper/user 執行的多級許可權控制。看看下面Jeff Sharkey的解釋:
https://android.googlesource.com/platform/system/core/+/master/sdcard/sdcard.c
<uses-permission
Android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
可以讀寫SDCARD,包括其他storage,比如內部flash,usb等等
4.0中如果只宣告這個,會發現其他mount的裝置有可能沒有寫許可權,需要同時宣告
<uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE"/>
這樣才可以讀寫/mnf/flash , /mnt/usb, /mnt/externa等目錄
可能4.0增加了對其他儲存裝置的內建支援,其他裝置不再共享gid "sdcard_rw"
而改用"media_rw",相應的細分了許可權宣告
2.3中 dr-xrwxr-x system sdcard_rw 1969-12-31 16:00 flash
4.0中 d---rwxr-x system media_rw 1970-01-01 08:00 flash
來源:http://blog.csdn.NET/zmyde2010/article/details/7031461
也就是說程式得有"android.permission.WRITE_MEDIA_STORAGE"許可權才可以寫入外部SD卡/U盤
解決方法:
編輯 system\etc\permissions\platform.xml 檔案(system資料夾必須是讀寫狀態,就是點一下r/w 目錄變成r/w),
此處:
<permission name="android.permission.WRITE_EXTERNAL_STORAGE" >
<group gid="sdcard_rw" />
</permission>
改為:
<permission name="android.permission.WRITE_EXTERNAL_STORAGE" >
<group gid="sdcard_rw" />
<group gid="media_rw" />
</permission>