安卓6.0+动态权限申请
2017-03-16 16:49
330 查看
在公司手机应用中,用到了拍照和选择相册图片的功能。某次同事用华为手机使用,不妙的是这块功能导致应用卡死崩溃。查阅了下资料,便知道是因为少了动态权限申请所导致的
普通权限
普通权只要在AndroidManifest文件中声明即可
危险权限
新的权限机制提出来了权限组的概念,即获取了权限组的中某个权限,便自动获取的组内全部的权限,如下图是要动态申请的危险权限
使用场景
当应用的targetSdkVersion<23时,没有适配权限的申请相关逻辑,在Android6.0以上机型运行的时候,仍然采用安装时授权的方案。
当应用的targetSdkVersion>=23时,在低版本Android系统上运行,仍然采用安装时授权的方案,权限申请的代码逻辑只应该在Android6.0及以上的机型被执行。
2、申请权限
3、权限回调
4、权限说明。
用户如果选择了拒绝,下一次在需要声明该权限的时候,Google建议APP开发者给予用户更多的说明,因此提供了下面这个API
权限申请回调
这里我判断了SDK版本,当版本大于22时才执行申请动态权限的代码。
1.动态权限的由来
Android6.0以前,我们只需要在AndroidManifest文件中声明需要的权限,用户安装时同意权限,APP便永久的获得了授权。然而,同期的iOS对于权限的处理会更加灵活,在APP运行时,用户可以根据自身的需要,决定是否授予APP某一权限。这样动态管理的机制更有利于保护用户的隐私,Android过于简单的权限机制被吐槽已久。终于,Android6.0也发布了动态权限的机制。2.动态权限的基本知识
动态权限的分类普通权限
普通权只要在AndroidManifest文件中声明即可
危险权限
新的权限机制提出来了权限组的概念,即获取了权限组的中某个权限,便自动获取的组内全部的权限,如下图是要动态申请的危险权限
使用场景
当应用的targetSdkVersion<23时,没有适配权限的申请相关逻辑,在Android6.0以上机型运行的时候,仍然采用安装时授权的方案。
当应用的targetSdkVersion>=23时,在低版本Android系统上运行,仍然采用安装时授权的方案,权限申请的代码逻辑只应该在Android6.0及以上的机型被执行。
3.如何申请动态权限
1 、检查是否有所需权限public int checkSelfPermission(permission)
2、申请权限
public final void requestPermissions( new String[permission1,permission2,...], requestCode)
3、权限回调
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { //继续执行逻辑或者提示权限获取失败 }
4、权限说明。
用户如果选择了拒绝,下一次在需要声明该权限的时候,Google建议APP开发者给予用户更多的说明,因此提供了下面这个API
public boolean shouldShowRequestPermissionRationale(permission) { 1、APP没有申请这个权限的话,返回false 2、用户拒绝时,勾选了不再提示的话,返回false 3、用户拒绝,但是没有勾选不再提示的话,返回true 因此如果想在第一次就给用户提示,需要记录权限是否申请过,没有申请过的话,强制弹窗提示,而不能根据这个方法的返回值来。 }
4.在应用中使用示例
以下为申请拍照权限if (Build.VERSION.SDK_INT >= 23) { if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA,}, 5); } else { onCamera(); } } else { onCamera(); }
权限申请回调
/** * 运行时权限申请回调 * * @param requestCode * @param permissions * @param grantResults */ @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) { case 5: if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { onCamera(); } else { Toast.makeText(this, "你拒绝了这个权限", Toast.LENGTH_SHORT).show(); } break; } }
这里我判断了SDK版本,当版本大于22时才执行申请动态权限的代码。
相关文章推荐
- Android 6.0 动态权限申请注意事项
- [置顶] Android 6.0(API 23)及其以上动态申请的权限与申请权限的方法
- android 6.0 以上如何动态申请权限?
- Android 6.0以上动态申请文件读写权限
- Android 6.0 动态权限申请(权限分组)
- 一行代码搞定Android 6.0动态权限申请
- android6.0 动态申请权限
- android 6.0动态权限申请以及拒绝后的控制
- 安卓学习笔记--- Android 6.0运行时权限的申请使用及EasyPermissions的使用
- Android 6.0 动态权限申请
- Android 6.0 动态权限申请详解
- Android 6.0 动态权限申请封装的处理方式
- Android 6.0 动态权限申请
- Android 6.0(API 23)之后需动态申请权限的问题
- 6.0动态申请权限
- Android 6.0 动态申请权限
- Android 6.0动态权限申请
- android 6.0以后动态申请多个危险权限笔记
- 6.0动态申请权限问题
- Android 6.0 动态权限申请