现在Android SDK API Level 都出到25了,市面上搭载Android6.0以上系统的手机占有率越来越高,最近给自己手头上在开发的项目做了些改进,加上了动态权限获取,在这总结下自己的做法:
首先当然是来个判断(项目需要用的敏感权限主要是相机和读取手机存储两个权限):
private final String[] permissions=new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE};//相机权限 写入内存权限
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
//判断两个权限是否都已获取
if (a!= PackageManager.PERMISSION_GRANTED||b!=PackageManager.PERMISSION_GRANTED){ //已授权为GRANTEED 未授权为DINIED
showRequestPermissionDialog();
}
}
显示请求获取权限的对话框的方法:
private void showRequestPermissionDialog() {
new AlertDialog.Builder(this).setTitle("获取相机与写入内存权限").setMessage("没有相机与写入内存的权限,程序功能将受限")
.setPositiveButton("立即开启", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//点击开启权限按钮所做的操作 permissions为
ActivityCompat.requestPermissions(MainActivity.this,permissions,123);
}
}).setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//点击取消按钮所做的操作
finish();
}
}).setCancelable(false).create().show();
}
重写请求获取权限后的回调函数:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode==1){ //判断是不是自己设置的请求码
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){//判断目前的系统是不是大于6.0
if(grantResults[0]!=PackageManager.PERMISSION_GRANTED||grantResults[1]!=PackageManager.PERMISSION_GRANTED){//是否仍然没有给权限
boolean b=shouldShowRequestPermissionRationale(permissions[0]);
boolean c=shouldShowRequestPermissionRationale(permissions[1]);
if(!b||!c){
//用户是否选择了不再提醒
showDialogTipUserGoToAppSetting();
}else{
finish();
}
}else{
Toast.makeText(this, "获取权限成功!", Toast.LENGTH_SHORT).show();
}
}
}
用户选择了拒绝授予权限,并且选择了不再提醒,只能通过打开系统对应的应用权限设置界面,要求用户手动设置:
private void showDialogTipUserGoToAppSetting() {
dialog=new AlertDialog.Builder(this).setTitle("相机权限")
.setMessage("请在-设置-权限管理中,为绘酷打开相机和读写手机存储权限")
.setPositiveButton("立即开启", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
goToAppSetting();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).setCancelable(false).create();
dialog.show();
}
打开系统对应应用权限设置界面的方法:
private void goToAppSetting() {
Intent intent=new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri=Uri.fromParts("package",getPackageName(),null);
intent.setData(uri);
startActivityForResult(intent,1);
}
重写设置回来后的回调函数:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==1){
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
int i=ContextCompat.checkSelfPermission(this,permissions[0]);
int j=ContextCompat.checkSelfPermission(this,permissions[1]);
if(i!=PackageManager.PERMISSION_GRANTED||j!=PackageManager.PERMISSION_GRANTED){
showDialogTipUserGoToAppSetting();
}else{
if(dialog!=null&&dialog.isShowing()){
dialog.dismiss();
}
Toast.makeText(this, "权限获取成功", Toast.LENGTH_SHORT).show();
}
}
}
}