Android 的權(quán)限機(jī)制并不是什么新鮮事物近尚,從系統(tǒng)的第一個(gè)版本開(kāi)始就已經(jīng)存在了把跨。但其實(shí)之前Android的權(quán)限機(jī)制在保護(hù)用戶安全和隱私等方面起到的作用比較有限谁鳍,尤其是大家都離不開(kāi)的軟件。非常容易 “店大欺客”稍途。為此阁吝,Android 開(kāi)發(fā)團(tuán)隊(duì)在Android 6.0系統(tǒng)中引用了運(yùn)行時(shí)權(quán)限這個(gè)功能,從而更好的保護(hù)用戶的安全和隱私晰房。
Android權(quán)限有上百個(gè)求摇,怎么區(qū)分哪些是普通權(quán)限,哪些是危險(xiǎn)權(quán)限殊者。下面的圖片列舉了Android中所有的危險(xiǎn)權(quán)限与境,一共是9組25個(gè)權(quán)限。
完整的權(quán)限列表請(qǐng)?jiān)L問(wèn)Manifest.permission ?|? Android Developers
注意:表格中每一個(gè)危險(xiǎn)權(quán)限都屬于一個(gè)權(quán)限組猖吴,我們?cè)谶M(jìn)行運(yùn)行時(shí)權(quán)限處理的是權(quán)限名摔刁,但是用戶一旦同意授權(quán)了,那么該權(quán)限所對(duì)應(yīng)的權(quán)限組中所有的其他權(quán)限也會(huì)同時(shí)被授權(quán)海蔽。
接下來(lái)通過(guò)一個(gè)小Demo來(lái)演示一下
上面Demo已經(jīng)將運(yùn)行時(shí)權(quán)限的完整流程覆蓋了共屈,下面具體分析一下
第一步就是先判斷用戶是不是已經(jīng)給我們授權(quán)了,借助的是ContextCompat.checkSelfPermission()方法党窜。checkselfPermission()方法接收兩個(gè)參數(shù)拗引,第一個(gè)是context,這個(gè)沒(méi)什么好說(shuō)的幌衣,第二個(gè)參數(shù)是具體的權(quán)限名稱矾削,比如打電話的權(quán)限名。然后我們使用方法的返回值和PackageManager.PERMISSION_GRANTED作比較豁护,相等就說(shuō)明用戶已經(jīng)授權(quán)哼凯,不等就表示用戶沒(méi)有授權(quán)。
如果已經(jīng)授權(quán)了就簡(jiǎn)單了楚里,直接去執(zhí)行撥打電話的邏輯操作就行了断部,如果沒(méi)有授權(quán),就調(diào)用ActivityCompat.requestPermissions()方法向用戶申請(qǐng)授權(quán)班缎,requestPermissions()方法接受3個(gè)參數(shù)蝴光,第一個(gè)要求的是Activity實(shí)例她渴,第二個(gè)參數(shù)是一個(gè)string數(shù)組,第三個(gè)是請(qǐng)求碼虱疏,只要是唯一值就行惹骂,這里傳入了1苏携;
調(diào)用完requestPermissions()方法之后做瞪,系統(tǒng)會(huì)彈出一個(gè)權(quán)限申請(qǐng)的對(duì)話框,然后用戶可以選擇同意或者拒絕我們的權(quán)限申請(qǐng)右冻,不論那種結(jié)果装蓬,都會(huì)回調(diào)onRequestPermissionsResult()方法中,而授權(quán)的結(jié)果則會(huì)封裝在grantResults參數(shù)中纱扭,這里只判斷一下最后的授權(quán)結(jié)果牍帚,如果用戶同意就call,不同意就放棄操作乳蛾,并彈出一個(gè)Toast暗赶。
參考資料:第一行代碼第二版第七章