Android6.0及以上动态申请权限详细讲解
2017-07-24 00:42
501 查看
不知不觉Android已经到了8.0,记得刚开始6.0刚出来的时候也是看了别人写的一些文章这么慢慢的过来了,转眼已经快要两年了,感叹时光过的好快,然而不知道自己到底进步了多少。也许因为自己很懒,不善于总结,导致有时候明明之前见过某个知识点,却又给忘了。当后来慢慢写笔记的时候,我发现笔记对自己真的很重要,假如某个知识忘了,一下子就知道自己记过,在某个地方,如果不总结的话,就要花很多时间找资料,所以希望同学都应该整理自己的一个总结方式。好了,还是说说动态申请权限,网上有很多这方面的文章,有的也写的很好,我想自己记录下来就成了自己的东西,同时也给刚开始接触这一块的同学做做参考。
1,首先还是要先判断android版本是不是23以及以上版本:
2,动态申请我们所需要的权限,这里申请三个权限分别为:相机拍照、存储,拨打电话,然后用一个数组给装起来:
3,这里我们就可以开始调用requestPermissions()方法申请权限了,具体代码:
也就这两行就可以搞定了,其中mRequestCode事先申明的int类型变量,主要是为了处理申请权限后对返回结果做处理,代码:
4,接下来就是对申请权限的返回结果做处理了,具体就是重写onRequestPermissionsResult()方法,具体代码如下:
其中getPermissions(mStorage,mRequestCode)这个方法是我封装事先封装的一个方法,便于多处调用,其实写法就是这个方法ActivityCompat.requestPermissions(this,mPermission,mRequesCode);传入要申请的权限以及请求码,最开始已经写了,就不再赘述了。
5,接下来就是提示用户去应用权限列表动态设置权限了,也就是上面的 showDialogTipUserGoToAppSettting()方法,代码如下:
以上代码应该很好理解就是通过Intent意图打开对应应用权限列表,接下来就是重写onActivityResult方法,用于处理是否手动开启存储权限成功,具体代码如下:
最后我们还需要在Manifest中静态添加以上权限
以上代码已详细注释,动态申请权限的主要代码部分已经详细贴出,不足之处还望多多谅解,谢谢。
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" />
以上代码已详细注释,动态申请权限的主要代码部分已经详细贴出,不足之处还望多多谅解,谢谢。
相关文章推荐
- Android6.0及以上版本申请权限讲解
- android6.0以上动态申请权限问题。
- Android6.0以上,动态权限申请
- android6.0(API23)以上动态申请权限
- Android6.0版本以上危险权限动态申请及RxPermissions权限库使用
- Android6.0(棉花糖)以上动态获取权限方法
- Android6.0动态权限申请步骤以及需要注意的一些坑
- Android6.0动态申请权限
- Android6.0动态权限申请步骤以及需要注意的一些坑
- android6.0以上权限申请工具类
- 菜鸟笔记3.关于百度地图Android6.0以上权限动态获取,
- 使用AOP封装的权限动态申请库PermissionLibrary,简化针对Android6.0之后实现权限动态申请的复杂性
- Android6.0动态权限申请
- android6.0动态权限申请工具类
- Android6.0动态权限申请
- 动态一次获取多种android6.0以上的权限
- Android 6.0以上动态申请文件读写权限
- Android6.0动态申请权限
- Android6.0动态权限申请步骤以及需要注意的一些坑
- Android6.0动态权限申请步骤以及需要注意的一些坑