Android筆記——運行時權(quán)限

1.0Android權(quán)限機(jī)制

Android 6.0系統(tǒng)中加入了運行時權(quán)限功能。用戶不需要在安裝軟件的時候一次性授權(quán)所有申請的權(quán)限,而是可以在軟件的使用過程中再對某一項權(quán)限申請進(jìn)行授權(quán)。就算拒絕了某個權(quán)限,也不影響使用這個應(yīng)用的其他功能。
Android現(xiàn)在將常用的權(quán)限大致歸成了兩類,一類是普通權(quán)限,一類是危險權(quán)限。準(zhǔn)確地講,其實還有一些特殊權(quán)限,不過這些權(quán)限使用得相對較少,這里不介紹了。

  • 普通權(quán)限:指的是那些不會直接威脅到用戶的安全和隱私的權(quán)限,對于這部分權(quán)限申請,系統(tǒng)會自動幫我們進(jìn)行授權(quán),不需要用戶手動操作。只需要在AndroidManifest.xml文件中添加一下權(quán)限聲明就可以了。
  • 危險權(quán)限:表示那些可能會觸及用戶隱私或者對設(shè)備安全性造成影響的權(quán)限,對于這部分權(quán)限申請,必須由用戶手動授權(quán)才可以,否則程序就無法使用相應(yīng)的功能。如獲取設(shè)備聯(lián)系人信息、定位設(shè)備的地理位置等。不僅需要在AndroidManifest.xml文件中添加一下權(quán)限聲明,還需要在程序運行時申請權(quán)限。

下圖列出了到Android 10系統(tǒng)為止所有的危險權(quán)限,一共是11組30個權(quán)限。除了危險權(quán)限之外,剩下的大多就是普通權(quán)限了。


到Android 10系統(tǒng)為止所有的危險權(quán)限

表格中每個危險權(quán)限都屬于一個權(quán)限組,在進(jìn)行運行時權(quán)限處理時使用的是權(quán)限名。原則上,用戶一旦同意了某個權(quán)限申請之后,同組的其他權(quán)限也會被系統(tǒng)自動授權(quán)。但是請謹(jǐn)記,不要基于此規(guī)則來實現(xiàn)任何功能邏輯,因為Android系統(tǒng)隨時有可能調(diào)整權(quán)限的分組。

1.1在程序運行時申請權(quán)限

CALL_PHONE這個權(quán)限是編寫撥打電話功能的時候需要聲明的,因為撥打電話會涉及用戶手機(jī)的資費問題,因而被列為了危險權(quán)限。再次以這個為例說明。

1.1.1Android6.0以下

修改AndroidManifest.xml文件,聲明CALL_PHONE權(quán)限:


聲明CALL_PHONE權(quán)限

修改MainActivity中的代碼,如下所示:


MainActivity中的代碼

這樣就將撥打電話的功能成功實現(xiàn)了,并且在低于Android 6.0系統(tǒng)的手機(jī)上都是可以正常運行的。但是,如果我們在Android 6.0或者更高版本系統(tǒng)的手機(jī)上運行,點擊“Make Call”按鈕就沒有任何效果了,這時觀察Logcat中的打印日志,你會看到如圖8.4所示的錯誤信息。


打印日志

錯誤信息中提醒我們“Permission Denial”,這是由于權(quán)限被禁止所導(dǎo)致的,因為Android 6.0及以上系統(tǒng)在使用危險權(quán)限時必須進(jìn)行運行時權(quán)限處理。

1.1.2Android6.0以上

修改MainActivity中的代碼,如下所示:


運行時權(quán)限處理
  1. ContextCompat.checkSelfPermission()方法,判斷用戶是不是已經(jīng)給過授權(quán)了
    第一個參數(shù)是Context
    第二個參數(shù)是具體的權(quán)限名
    返回值和PackageManager.PERMISSION_GRANTED做比較,相等就說明用戶已經(jīng)授權(quán),不等就表示用戶沒有授權(quán)
  2. 如果已經(jīng)授權(quán)的話就簡單了,直接執(zhí)行撥打電話的邏輯操作就可以了
    如果沒有授權(quán)的話,則需要調(diào)用ActivityCompat.requestPermissions()方法向用戶申請授權(quán)。
    requestPermissions()方法接收3個參數(shù):
    第一個參數(shù)要求是Activity的實例
    第二個參數(shù)是一個String數(shù)組,把要申請的權(quán)限名放在數(shù)組中即可
    第三個參數(shù)是請求碼,只要是唯一值就可以了,這里傳入了1
  3. 調(diào)用完requestPermissions()方法之后,系統(tǒng)會彈出一個權(quán)限申請的對話框,用戶可以選擇同意或拒絕我們的權(quán)限申請。不論是哪種結(jié)果,最終都會回調(diào)到onRequestPermissionsResult()方法中,而授權(quán)的結(jié)果則會封裝在grantResults參數(shù)當(dāng)中。只需要判斷一下最后的授權(quán)結(jié)果:如果用戶同意的話,就調(diào)用call()方法撥打電話;如果用戶拒絕的話,就放棄操作,并且彈出一條失敗提示。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容