packagemanager中提供的武器,可以用“既多又雜,版本變化大”來形容。
不過,我們通過分類和排序的方法将它們組織起來,讓開發者同學們可以學會使用這些強大的武器!
這一節我們将學習:
如何查詢系統中都有哪些權限組
每個權限組都有些什麼權限
如何查詢是否被授予某一權限
如何查詢都有哪些應用申請了某一項權限
我們先看第一個大族的api,permission相關的api

創始成員7個. android 2.2版新增1個,android 4.3新增1個,android 6.0再增1個。共計10個。
一共七個,基本上是權限的增,删,檢查和查詢4種操作。
addpermission:動态新增一個新權限
removepermission:删除一個權限
checkpermission:校驗權限是否通過
getallpermissiongroups:擷取系統中所有的權限組
getpermissiongroupinfo:查詢某個權限組的内容。系統中都有哪些權限組可通過getallpermissiongroups來查詢
querypermissionsbygroup:查詢一個權限組下面都有些什麼權限
getpermissioninfo:根據權限名擷取這個權限對象
原型:
參數:
真棒,隻有一個選擇:get_meta_data。
我們寫一段例程看看效果:
日志結果如下:
可見,我目前所用的android m手機上,有下面這些perssiongroup:
android.permission-group.contacts:聯系人相關權限組
android.permission-group.phone:電話相關權限組
android.permission-group.appstore_cloud:應用商店雲服務相關權限組
android.permission-group.calendar:月曆相關權限組
android.permission-group.camera:相機相關權限組
android.permission-group.sensors:傳感器相關權限組
android.permission-group.location:位置服務相關權限組
android.permission-group.storage:存儲相關權限組
android.permission-group.microphone:話筒相關權限組
android.permission-group.sms:短消息相關權限組
這其中用到的permissiongroupinfo類,用于來存儲權限組的資訊. 我們後面專門有相關資料結構類的詳細說明。
根據字元串來查詢特定的perssiongroupinfo。
例程:
通過上面兩個方法的學習,我們已經可以擷取permissiongroup的資訊了。那麼,我們如何去知道一個權限組裡都有哪些權限呢?
我們可以通過querypermissionsbygroup方法來實作這個需求,請看例程:
輸出的結果如下:
從上面的log上我們可以看到,android.permission-group.contacts組裡有3個成員:
android.permission.write_contacts:允許該應用修改您手機上存儲的聯系人的相關資料,包括您通過打電話、發送電子郵件或以其他方式與特定聯系人通信的頻率。此權限可讓應用删除聯系人資料。
android.permission.get_accounts:允許該應用擷取手機已知的帳戶清單,其中可能包括由已安裝的應用建立的所有帳戶。
android.permission.read_contacts:允許該應用讀取您手機上存儲的聯系人的相關資料,包括您通過打電話、發送電子郵件或以其他方式與特定個人通信的頻率。此權限可讓應用儲存您的聯系人資料,而惡意應用可能會在您不知情的情況下分享聯系人資料。
根據名字查找對應的權限對象,不多說了,上例程:
輸出如下:
檢查是否一個包是否被允許某個權限。看例程:
addpermission和removepermission兩個方法暫時沒見到有人用到,先略過不講了。
addpermissionasync:異步添加新權限,可以快速傳回。可以用于批量添權重限。
這個api也沒見有人用過,就不講了。
getpackagesholdingpermissions:檢視目前系統裡安裝的應用中,哪些使用了這個權限。這個api很好玩啊,能查到哪些應用用到了危險的權限。
輸出吓一跳,怎麼這麼多應用要改聯系人!
ispermissionrevokedbypolicy:檢視權限是否符合policy的規定。如果policy不允許,就隻能換policy,否則無法通過。
公開域:
public charsequence nonlocalizeddescription:如果這個權限組的名字字元串直接定義在androidmanifest.xml中,那麼通過這個域就可以得到它的字元串名字。如果是空,那麼說明是調用的字元串資源,要去查另一個屬性descriptionres。
public int descriptionres:如果上面的nonlocalizeddescription是空,那麼這個肯定不空。可以調用loaddescription(pm)方法擷取。
其實loaddescription中早已經考慮到上面所講的兩種情況了,調用loaddescription一定能得到描述的字元串:
我們還是通過一個例程來學習下,可以讀取到權限的本地語言,如中文的描述,還是挺好玩的哈: