Android M 動(dòng)態(tài)權(quán)限申請(qǐng)

Android6.0開始新增了動(dòng)態(tài)權(quán)限的申請(qǐng),以往我們?cè)贏ndroidManifest.xml文件中添加的權(quán)限,有一部分現(xiàn)在需要?jiǎng)討B(tài)申請(qǐng)了,當(dāng)compileSdkVersion和targetSdkVersion為 23時(shí),必須要?jiǎng)討B(tài)設(shè)定權(quán)限了。這無形中增加了不少代碼量呀!下面來看看哪些權(quán)限需要?jiǎng)討B(tài)申請(qǐng)了:

需要申請(qǐng)的權(quán)限
權(quán)限組 權(quán)限
android.permission-group.CALENDAR android.permission.READ_CALENDAR
android.permission.WRITE_CALENDAR
android.permission-group.CAMERA android.permission.CAMERA
android.permission-group.CONTACTS android.permission.READ_CONTACTS
android.permission.WRITE_CONTACTS
android.permission.GET_ACCOUNTS
android.permission-group.LOCATION android.permission.ACCESS_FINE_LOCATION
android.permission.ACCESS_COARSE_LOCATION
android.permission-group.MICROPHONE android.permission.RECORD_AUDIO
android.permission-group.PHONE android.permission.READ_PHONE_STATE
android.permission.CALL_PHONE
android.permission.READ_CALL_LOG
android.permission.WRITE_CALL_LOG
android.permission.USE_SIP
android.permission.PROCESS_OUTGOING_CALLS
android.permission-group.STORAGE android.permission.READ_EXTERNAL_STORAGE
android.permission.WRITE_EXTERNAL_STORAGE
android.permission-group.SENSORS android.permission.BODY_SENSORS
android.permission-group.SMS android.permission.SEND_SMS
android.permission.READ_SMS
android.permission.RECEIVE_SMS
android.permission.RECEIVE_WAP_PUSH

上表中同一組的任何一個(gè)權(quán)限被授權(quán)了,其他權(quán)限也自動(dòng)被授權(quán)。例如,一旦WRITE_CONTACTS被授權(quán)了,app也有READ_CONTACTS和GET_ACCOUNTS了。

使用方法
例如:我們?cè)谑褂孟鄼C(jī)的時(shí)候需要檢查是否應(yīng)有相機(jī)授權(quán)

1.在Activity中

//檢查權(quán)限
if(ActivityCompat.checkSelfPermission(EditPersonalDynamicActivity.this, 
Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED){
    //調(diào)用這個(gè)方法只會(huì)在API>=23的時(shí)候才會(huì)起作用,否則一律返回false
    //第一次請(qǐng)求權(quán)限時(shí),用戶拒絕了,調(diào)用后返回true
   //第二次請(qǐng)求權(quán)限時(shí),用戶拒絕且選擇了“不在提醒”,調(diào)用后返回false。
   //設(shè)備的策略禁止當(dāng)前應(yīng)用獲取這個(gè)權(quán)限的授權(quán)時(shí)調(diào)用后返回false 。
if(ActivityCompat.shouldShowRequestPermissionRationale(EditPersonalDynamicActivity.this,Manifest.permission.CAMERA)){
        //此時(shí)我們都彈出提示
        ActivityCompat.requestPermissions(EditPersonalDynamicActivity.this,
                new String[]{Manifest.permission.CAMERA},CAMERA_PREMISSION);
    }else{
        //這里是用戶各種拒絕后我們也彈出提示
        ActivityCompat.requestPermissions(EditPersonalDynamicActivity.this,
                new String[]{Manifest.permission.CAMERA},CAMERA_PREMISSION);
    }
}else {
    //正常情況,表示權(quán)限是已經(jīng)被授予的
}
@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if(requestCode==CAMERA_PREMISSION) {
        if (grantResults.length == permissions.length){
            for(int grant:grantResults){
                 if(grant!=PackageManager.PERMISSION_GRANTED){
                        //有權(quán)限被禁止了
                        //......
                        return;
                 }
            }
            // 此處表示權(quán)限被授予,你可以開始做你想要做的事
      
        } else {
            // 權(quán)限被用戶禁止
        }
    }
}

2.在Fragment中

  • 在Fragment中申請(qǐng)權(quán)限,不要使用ActivityCompat.requestPermissions, 直接使用Fragment的requestPermissions方法,否則會(huì)回調(diào)到Activity的onRequestPermissionsResult,另外在fragment中詢問的方法也可以直接使用fragment中的方法shouldShowRequestPermissionRationale方法。

  • 如果在Fragment中嵌套Fragment,在子Fragment中使用requestPermissions方法,onRequestPermissionsResult不會(huì)回調(diào)回來,建議使用getParentFragment().requestPermissions方法,
    這個(gè)方法會(huì)回調(diào)到父Fragment中的onRequestPermissionsResult,加入以下代碼可以把回調(diào)透?jìng)鞯阶覨ragment

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    List<Fragment> fragments = getChildFragmentManager().getFragments();
    if (fragments != null) {
        for (Fragment fragment : fragments) {
            if (fragment != null) {
                fragment.onRequestPermissionsResult(requestCode,permissions,grantResults);
            }
        }
    }
}

然而,每次都要這樣寫一遍還是太麻煩,后面我會(huì)封裝一個(gè)So easy的庫(kù)用來簡(jiǎn)化申請(qǐng)權(quán)限。
PS:這是地址:http://www.itdecent.cn/p/184679b311b2

最后編輯于
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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