Android6.0 動(dòng)態(tài)權(quán)限詳解及動(dòng)態(tài)申請(qǐng)權(quán)限

1、動(dòng)態(tài)權(quán)限獲取機(jī)制

  • Google在Android 6.0中引入了動(dòng)態(tài)權(quán)限獲取機(jī)制(Runtime Permission),使得Android的權(quán)限管理更加嚴(yán)格完善。
  • 動(dòng)態(tài)權(quán)限獲取要求開(kāi)發(fā)者在調(diào)用涉及相關(guān)權(quán)限的代碼時(shí),使用系統(tǒng)接口來(lái)動(dòng)態(tài)得申請(qǐng)相應(yīng)權(quán)限。定位SDK涉及權(quán)限即在此范疇中。
  • 在未獲取到定位權(quán)限情況下,定位SDK獲取到的定位依據(jù)(基站、WiFi)均為空值,因此無(wú)法有效定位,定位服務(wù)會(huì)返回錯(cuò)誤碼167。

2、動(dòng)態(tài)權(quán)限機(jī)制的開(kāi)啟

動(dòng)態(tài)權(quán)限機(jī)制的開(kāi)啟

因此需要在項(xiàng)目配置文件中修改您的targetSdkVersion配置。
對(duì)于Eclipse環(huán)境,請(qǐng)更改AndroidManifest.xml中代碼;AndroidStudio環(huán)境,請(qǐng)更改build.gradle中的代碼。

3、關(guān)于android:protectionLevel:權(quán)限的等級(jí)

  • normal 低風(fēng)險(xiǎn)權(quán)限,只要申請(qǐng)了就可以使用(在AndroidManifest.xml中添加<uses-permission>標(biāo)簽),安裝時(shí)不需要用戶確認(rèn);

  • dangerous 高風(fēng)險(xiǎn)權(quán)限,安裝時(shí)需要用戶的確認(rèn)才可使用;

  • signature 只有當(dāng)申請(qǐng)權(quán)限的應(yīng)用程序的數(shù)字簽名與聲明此權(quán)限的應(yīng)用程序的數(shù)字簽名相同時(shí)(如果是申請(qǐng)系統(tǒng)權(quán)限,則需要與系統(tǒng)簽名相同),才能將權(quán)限授給它;

  • signatureOrSystem 簽名相同,或者申請(qǐng)權(quán)限的應(yīng)用為系統(tǒng)應(yīng)用(在system image中),與signature類似,只是增加了rom中自帶的app的聲明 ,盡量不要使用該選項(xiàng),因?yàn)閟ignature已經(jīng)適合絕大部分的情況。

對(duì)于普通和危險(xiǎn)級(jí)別的權(quán)限,我們稱之為低級(jí)權(quán)限,應(yīng)用申請(qǐng)即授予。其他兩級(jí)權(quán)限,我們稱之為高級(jí)權(quán)限或系統(tǒng)權(quán)限。當(dāng)應(yīng)用試圖在沒(méi)有權(quán)限的情況下做受限操作,應(yīng)用將被系統(tǒng)殺掉以警示。系統(tǒng)應(yīng)用可以使用任何權(quán)限。權(quán)限的聲明者可無(wú)條件使用該權(quán)限。

4、動(dòng)態(tài)權(quán)限代碼樣例

在Android 6.0系統(tǒng)中,需要?jiǎng)討B(tài)獲取的權(quán)限涉及到:

    1. 獲取手機(jī)狀態(tài):
Manifest.permission.READ_PHONE_STATE;
    1. 獲取位置信息:
Manifest.permission.ACCESS_COARSE_LOCATION;
Manifest.permission.ACCESS_FINE_LOCATION;
    1. 讀寫(xiě)SD卡:
Manifest.permission.READ_EXTERNAL_STORAGE;
Manifest.permission.WRITE_EXTERNAL_STORAGE;

5、獲取權(quán)限使用API

  • 第一步,利用Context.checkSelfPermission接口,觸發(fā)系統(tǒng)彈窗
    • int android.content.Context.checkSelfPermission(String permission),此接口會(huì)觸發(fā)系統(tǒng)彈窗,用戶選擇后觸發(fā)Activity中的回調(diào)函數(shù),以READ_PHONE_STATE為例:
private static final int BAIDU_READ_PHONE_STATE =100;
  • 第二步,定義權(quán)限獲取碼,申請(qǐng)權(quán)限
    • 自定義一個(gè)權(quán)限獲取碼,用于回調(diào)函數(shù)中做對(duì)應(yīng)處理,調(diào)用checkSelfPermission接口申請(qǐng)權(quán)限:
if(mContext.checkSelfPermission(Manifest.permission.READ_PHONE_STATE)!=PackageManager.PERMISSION_GRANTED) {
   // 申請(qǐng)一個(gè)(或多個(gè))權(quán)限,并提供用于回調(diào)返回的獲取碼(用戶定義)
   requestPermissions( new String[]{ Manifest.permission.READ_PHONE_STATE },BAIDU_READ_PHONE_STATE );
}
  • 第三步,處理回調(diào)函數(shù)
    • 在Activity的onRequestPermissionResult回調(diào)函數(shù)中做處理:
public void onRequestPermissionsResult(int requestCode,String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions,grantResults);
    switch(requestCode) {
        //requestCode即所聲明的權(quán)限獲取碼,在checkSelfPermission時(shí)傳入
        case 1:
            BAIDU_READ_PHONE_STATE:
            if(grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                //獲取到權(quán)限,做相應(yīng)處理
                //調(diào)用定位SDK應(yīng)確保相關(guān)權(quán)限均被授權(quán),否則會(huì)引起定位失敗
            } else{
                //沒(méi)有獲取到權(quán)限,做特殊處理
            }
            break;
        default:
            break;
    }
}

6、一個(gè)權(quán)限獲取方式

一個(gè)權(quán)限獲取方式

7、多個(gè)權(quán)限獲取方式

多個(gè)權(quán)限獲取方式

8、一個(gè)和多個(gè)權(quán)限獲取唯一不同的地方需要在回調(diào)中分別處理

回調(diào)中分別處理

9、動(dòng)態(tài)權(quán)限獲取的封裝

  • 把權(quán)限的申請(qǐng)放在BaseActivity中,然后各個(gè)子Activity去繼承BaseActivity。
  • 定義權(quán)限回調(diào)接口
  • 申請(qǐng)權(quán)限的方法必須傳遞一個(gè)Activity對(duì)象,工具類中需要一個(gè)Activity管理器獲取最上層的Activity.
定義權(quán)限回調(diào)接口
Activity管理器獲取最上層的Activity
接口處理返回信息

Demo地址如下:
AndroidPermission Demo 地址鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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