介绍
前言:
课程提醒功能,需要在日历中为课程添加相应的信息,但是在oppo手机,点击拒绝了,fe提示添加到日历成功,优化此处代码
Android 权限机制简介
6.0之前:在menifest注册,用户安装app会有一个权限列表,类似一份协议表示用户对此已经知晓,造成权限胡乱申请,对用户造成风险
6.0之后(包含6.0):9组危险权限,不仅要在manifest注册还要动态申请权限,比如调用拍照会弹出权限提示,只有用户自己点了确定才能继续拍照。
安全权限:
只要在manifest.xml中列出即可
危险权限:
1.targetSDKVersion < 23 & API(手机系统) < 6.0 :默认用户获得所有权限,并且无法手动更改权限配置(在华为4.4手机上,拍照会提示权限申请)
2.targetSDKVersion < 23 & API(手机系统) >= 6.0:默认用户获得所有权限,可以手动更改权限配置,( 取消时手机会弹出提醒,告诉用户这个是为旧版手机打造的应用,让用户谨慎操作 ),启用app,不会弹出设置权限的提示框(华为,oppo,小米都这样,其他手机没有测试)
3.targetSDKVersion >=23 & API(手机系统) < 6.0 :默认用户获得所有权限,并且无法手动更改权限配置
4.targetSDKVersion >=23 & API(手机系统)>=6.0 :安装时候不会获得权限,运行时向用户申请权限,用户授权以后仍然可以在设置界面中取消授权,用户主动在设置界面取消后,在没有检验有无该权限的情况下,执行代码,在app运行过程中可能会出现crash。
封装
没有办法自己写个工具类拿到回调,因为权限回调在onRequestPermissionsResult是在Activity或者Fragment的方法
1.自定义一个PermissionActivity,专门用于处理申请运行时权限操作。该Activity背景透明,用户无法察觉。执行完后finish掉。
2.RxPermision 开源框架:https://github.com/tbruyelle/RxPermissions ,基本思路是透明的Fragment加入到当前的Activity来处理回调,比上面的方法更巧妙,但是可以不用Rxjava
3.封装BaseActivity去实现运行时权限申请方法,然后所有Activity继承BaseActivity,需要时调用方法即可。
2,3方法demo见:GitHub - guohaiping521/PermissionDemo: 申请权限工具类的封装
实际开发的问题
1.没有判断权限的情况下,进行一些需要权限的操作,可能会崩溃,可能没反应,所以不要在没有判断权限的情况下,想当然做一些操作。
1>在代码中我们针对Android6.0的权限检测(ContextCompat.checkSelfPermission和requestPermission)按照正常的写,保证在Android6.0以上的设备正常运行。
2>然后在具体的操作比如拨号,拍照或者录音,加一层tyr catch,能捕获到异常最好,不能捕获到的话继续第三步。
3>对具体机型我们加入if判断,对操作数据做合法性判断
2. Android6.0之后,权限分为install时的权限跟运行时权限
Context checkSelfPermission只检查的install的权限,默认是true
targetSdkVersion<23检查6.0权限情况的解决方案:PermissionChecker.checkSelfPermission
下面是关于Android权限检查API checkSelfPermission失效问题的解释
https://www.jianshu.com/p/d5c1a88f79c4
本篇文章主要参考:
https://www.jianshu.com/p/a9060b1599dc
https://juejin.im/post/59e01ece51882578c6736db7
http://blog.csdn.net/u010263943/article/details/71467877
网友评论