1. 程式人生 > >android檔案管理器開發中遇到的一些問題

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>