天天看點

android6.0以上權限管理及封裝demo 問題:①onRequestPermissionsResult回調不執行 1.權限分析2.相關方法

問題:

①onRequestPermissionsResult回調不執行

有的時候我們可能在fragment中去檢查權限、申請權限,自然就認為回調也就寫在fragment中了,而且寫了之後也沒有報任何錯。這也就是為什麼回調方法不執行的原因,是以我們把這個回調移到這個Fragment所依附的那個Activity,就可以順利執行啦。(注意,我這裡說的Fragment是v4包下的)

②如果你的app的targetSdkVersion 是23也就是android 6.0的話,遇到運作時權限不去做代碼處理的話,程式直接崩掉

如果你的app沒有在android 6.0上做足夠的測試,請不要設定targetSdk為23,22以下就不會出現問題。

1.權限分析

從Android6.0開始,權限分為普通權限和許可權限。許可權限分類歸組,一個權限授權之後,該組下的權限均可使用.

①普通權限

隻需要在xml申請即可,使用方法和之前6.0以前的一樣。在應用安裝應用時,會預設獲得許可。

②許可權限

可執行 $adb shell pm list permissions -d -g

Permission Group Permissions

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

  • com.android.voicemail.permission.ADD_VOICEMAIL

  • android.permission.USE_SIP

  • android.permission.PROCESS_OUTGOING_CALLS

android.permission-group.SENSORS

  • android.permission.BODY_SENSORS

android.permission-group.SMS

  • android.permission.SEND_SMS

  • android.permission.RECEIVE_SMS

  • android.permission.READ_SMS

  • android.permission.RECEIVE_WAP_PUSH

  • android.permission.RECEIVE_MMS

  • android.permission.READ_CELL_BROADCASTS

android.permission-group.STORAGE

  • android.permission.READ_EXTERNAL_STORAGE

  • android.permission.WRITE_EXTERNAL_STORAGE

同一組的任何一個權限被授權了,其他權限也自動被授權。例如,一旦WRITE_CONTACTS被授權了,app也有READ_CONTACTS和GET_ACCOUNTS了。

源碼中被用來檢查和請求權限的方法分别是Activity的checkSelfPermission和requestPermissions,這些方法api23引入。

2.相關方法

①.ContextCompat.checkSelfPermission()

檢查應用是否擁有該權限,被授權傳回值為PERMISSION_GRANTED,否則傳回PERMISSION_DENIED

②.ActivityCompat.requestPermissions()

将彈出請求授權對話框,這個方法在M之前版本調用,OnRequestPermissionsResultCallback 直接被調用,帶着正确的 PERMISSION_GRANTED或者 PERMISSION_DENIED 。

(3).AppCompatActivity.onRequestPermissionsResult()

該方法類似于Activity的OnActivityResult()的回調方法,主要接收請求授權的傳回值
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

    if (ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED
            && ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        if ( progressDialogUtil != null) {
            progressDialogUtil.DismissAllDialog();
        }
        String[] permissions = new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION};
        ActivityCompat.requestPermissions(getActivity(), permissions, 10);
        return;
    }
}
           
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    MyLogManager.d("資料定位權限回調", grantResults.length + "");
    if (grantResults.length == 0) {
        return;
    }
    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        //已授權
        ToastUtil.getInstance(this).makeTextCenter("您已開啟定位權限,請重新操作");


    } else { //使用者拒絕
        if (progressDialogUtil != null) {
            progressDialogUtil.DismissAllDialog();
        }
        ToastUtil.getInstance(this).makeTextCenter("您已拒絕了開啟定位權限,若想再通路請手動打開定位權限");

    }
}
           

封裝demo位址:   https://download.csdn.net/download/haoxuhong/10414632

注:将demo中baseactivity類裡面的

Manifest.permission.CAMERA   改為:
           
permission