android6.0許可權申請學習筆記
阿新 • • 發佈:2019-01-28
從android6.0開始,訪問危險許可權需要使用者明確授予。關於6.0的許可權講解可以檢視官網的介紹,本文主要記錄具體的使用步驟。
1、首先需要在manifest.xml檔案中列出所需許可權,如下所示:
2、在Activity中,首先檢查許可權,使用<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檔案中宣告即可-->
ContextCompat.checkSelfPermission(context,permission)
該方法用於判斷是否已授權,返回值為
PackageManager.PERMISSION_GRANTED(同意)或PackageManager.PERMISSION_DENIED(拒絕),若許可權未授予,則申請許可權。
3、申請授權,使用ActivityCompat.requestPermissions方法申請許可權,如下所示:
第一個引數為Context,第二個引數為所需的許可權陣列,第三個引數是請求碼,用於回撥時使用。ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},PERMISSION_REQUEST_CODE);
許可權檢查與申請完整程式碼如下:
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。