您的位置:首页 > 移动开发 > Android开发

Android6.0及以上动态申请权限详细讲解

2017-07-24 00:42 501 查看
不知不觉Android已经到了8.0,记得刚开始6.0刚出来的时候也是看了别人写的一些文章这么慢慢的过来了,转眼已经快要两年了,感叹时光过的好快,然而不知道自己到底进步了多少。也许因为自己很懒,不善于总结,导致有时候明明之前见过某个知识点,却又给忘了。当后来慢慢写笔记的时候,我发现笔记对自己真的很重要,假如某个知识忘了,一下子就知道自己记过,在某个地方,如果不总结的话,就要花很多时间找资料,所以希望同学都应该整理自己的一个总结方式。好了,还是说说动态申请权限,网上有很多这方面的文章,有的也写的很好,我想自己记录下来就成了自己的东西,同时也给刚开始接触这一块的同学做做参考。

1,首先还是要先判断android版本是不是23以及以上版本:

Build.VERSION.SDK_INT >=  Build.VERSION_CODES.M


2,动态申请我们所需要的权限,这里申请三个权限分别为:相机拍照、存储,拨打电话,然后用一个数组给装起来:

private String[] mPermission = {
Manifest.permission.WRITE_EXTERNAL_STORAGE
, Manifest.permission.CAMERA
, Manifest.permission.CALL_PHONE
};


3,这里我们就可以开始调用requestPermissions()方法申请权限了,具体代码:

if  (Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
ActivityCompat.requestPermissions(this,mPermission,mRequesCode);
}


也就这两行就可以搞定了,其中mRequestCode事先申明的int类型变量,主要是为了处理申请权限后对返回结果做处理,代码:

private final  int mRequestCode = 321;


4,接下来就是对申请权限的返回结果做处理了,具体就是重写onRequestPermissionsResult()方法,具体代码如下:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
//判断是否是申请权限的请求码
if (requestCode == mRequestCode){
//判断版本是不是23及以上版本,也可以不做判断,因为事先已经做了23以后才动态申请权限
if (Build.VERSION.SDK_INT >=  Build.VERSION_CODES.M){
//这里忽略了其他两个权限,是否申请成功,这里主要检验存储是否申请成功
if (grantResults[0] != PackageManager.PERMISSION_GRANTED){
//shouldShowRequestPermissionRationale判断用户是否点击了不再提醒。(检测该权限是否还可以申请)
//如果点击了不再提醒我们提示用户到引用权限列表手动开启权限
//如果拒绝我们再次向用户申请开启存储权限
boolean b = shouldShowRequestPermissionRationale(mPermission[0]);
if (!b){
//不在提示
showDialogTipUserGoToAppSettting();
}else {
//拒绝
getPermissions(mStorage,mRequestCode);
}
}
}
}
}


其中getPermissions(mStorage,mRequestCode)这个方法是我封装事先封装的一个方法,便于多处调用,其实写法就是这个方法ActivityCompat.requestPermissions(this,mPermission,mRequesCode);传入要申请的权限以及请求码,最开始已经写了,就不再赘述了。

5,接下来就是提示用户去应用权限列表动态设置权限了,也就是上面的 showDialogTipUserGoToAppSettting()方法,代码如下:

private void showDialogTipUserGoToAppSettting() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivityForResult(intent, 123);
}
});
builder.setTitle("存储权限不可用");
builder.setMessage("请在应用权限设置中手动开启存储权限");
builder.show();
}


以上代码应该很好理解就是通过Intent意图打开对应应用权限列表,接下来就是重写onActivityResult方法,用于处理是否手动开启存储权限成功,具体代码如下:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 123) {
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// 检查该权限是否已经获取
int i = ActivityCompat.checkSelfPermission(this, mPermission[0]);
// 权限是否已经 授权 GRANTED---授权  DINIED---拒绝
if (i != PackageManager.PERMISSION_GRANTED) {
// 提示用户应该去应用设置界面手动开启权限
showDialogTipUserGoToAppSettting();
}
}
}
}


最后我们还需要在Manifest中静态添加以上权限

<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />


以上代码已详细注释,动态申请权限的主要代码部分已经详细贴出,不足之处还望多多谅解,谢谢。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: