1. 程式人生 > >android6.0許可權申請學習筆記

android6.0許可權申請學習筆記

從android6.0開始,訪問危險許可權需要使用者明確授予。關於6.0的許可權講解可以檢視官網的介紹,本文主要記錄具體的使用步驟。

1、首先需要在manifest.xml檔案中列出所需許可權,如下所示:

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.INTERNET"/><!-- 訪問網路是正常許可權,只需要在manifest檔案中宣告即可-->
2、在Activity中,首先檢查許可權,使用
ContextCompat.checkSelfPermission(context,permission)
該方法用於判斷是否已授權,返回值為
PackageManager.PERMISSION_GRANTED(同意)或PackageManager.PERMISSION_DENIED(拒絕),若許可權未授予,則申請許可權。
3、申請授權,使用ActivityCompat.requestPermissions方法申請許可權,如下所示:
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},PERMISSION_REQUEST_CODE);
第一個引數為Context,第二個引數為所需的許可權陣列,第三個引數是請求碼,用於回撥時使用。
許可權檢查與申請完整程式碼如下:
private void checkPermissions(){
        String[] permissionArray=new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.CAMERA,
        Manifest.permission.ACCESS_FINE_LOCATION};//所需要的危險許可權陣列
        List<String> needRequestPermission=new ArrayList<>();//需要申請的許可權列表
        List<String> noGrantedPermission=new ArrayList<>();//已拒絕許可權列表
        for(String permission:permissionArray){
        int checkPermission=ContextCompat.checkSelfPermission(this,permission);//檢查許可權,返回值為PackageManager.PERMISSION_GRANTED(同意)或PackageManager.PERMISSION_DENIED(拒絕)
            if(checkPermission!= PackageManager.PERMISSION_GRANTED){//若未同意
                if(ActivityCompat.shouldShowRequestPermissionRationale(this,permission)){//shouldShowRequestPermissionRationale用於使用者已經拒絕過,再次申請時需要向用戶解釋為什麼需要這些許可權
                    noGrantedPermission.add(permission);//將使用者拒絕的許可權加入拒絕列表中
                }else {
                    needRequestPermission.add(permission);//將需要申請的許可權加入申請列表中
                }
            }
        }
        if(needRequestPermission.size()>0){
            ActivityCompat.requestPermissions(this,needRequestPermission.toArray(new String[needRequestPermission.size()]),PERMISSION_REQUEST_CODE);
        }
        if(noGrantedPermission.size()>0){
            final List<String> permissions=noGrantedPermission;
            showRationaleDialog("應用所必需許可權未開啟,請開啟許可權", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    ActivityCompat.requestPermissions(MainActivity.this,permissions.toArray(new String[permissions.size()]),PERMISSION_REQUEST_CODE);
                }
            });
        }
    }
4、申請許可權的回撥
@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if(requestCode==PERMISSION_REQUEST_CODE){
		//TODO
		}else{
		//TODO
		}
	}
具體實現如下:
@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
//        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if(requestCode==PERMISSION_REQUEST_CODE){
            if(allPermissionGranted(grantResults)){
                Toast.makeText(MainActivity.this,"授權成功!",Toast.LENGTH_SHORT).show();
            }else{
                showRationaleDialog("請開啟應用所需許可權", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Intent intent=new Intent();//開啟應用管理介面,修改許可權
                        intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                        intent.setData(Uri.parse("package:"+getPackageName()));
                        startActivity(intent);
                    }
                });
            }
        }
    }
    private boolean allPermissionGranted(int[] grantResults){
        for(int i=0;i<grantResults.length;i++){
            if(grantResults[i]!=PackageManager.PERMISSION_GRANTED){
                return false;
            }
        }
        return true;
    }
自定義dialog,用於使用者拒絕之後,彈框提醒使用者開啟許可權:
private void showRationaleDialog(String message,DialogInterface.OnClickListener onClickListener){
        new AlertDialog.Builder(MainActivity.this)
                .setMessage(message)
                .setPositiveButton("OK", onClickListener)
                .setNegativeButton("Cancel",null)
                .create()
                .show();
    }

以上是許可權申請的整個流程,需要注意的是,targetSDK>=23時是必須動態申請許可權的,若targetSDK<23,則只需要在manifest.xml檔案中配置即可,不過對於targetSDK<23,使用
checkSelfPermission可能會導致應用崩潰,可以在程式碼中判斷Build.VERSION.SDK_INT是否小於23。