这两天着实头疼了一番,因为适配android 6.0的权限,众所周知,android6.0权限需要动态申请,简单说一下过程吧,一般是根据Build.VERSION.SDK_INT来判断当前手机版本大于M(23)那么就需要获取权限,一般来说第一是判断是否拥有该权限,即ContextCompat.checkSelfPermission(getApplication(), Manifest.permission.WRITE_EXTERNAL_STORAGE)==PackageManager.PERMISSION_GRANTED;这种方式。如果有权限当然是直接做该做的事情没有就只能申请了ActivityCompat.requestPermissions()也就是这个方法,同时复写onRequestPermissionsResult()这个方法,这个方法是申请权限的回调。我们通过他的一些参数来判断当前是否请求成功,这个网上比较多我就不一一赘述了。关键是来看这个方法ActivityCompat.requestPermissions(),很明显他是在activity调用的,第一个坑,如果是fragment调用怎么调用,getactivity?答案是否定的,fragemnt拥有自己的方法直接使用Fragment的requestPermissions方法。同时也是复写onRequestPermissionsResult().在fragment中。
如果在6.0及以下申请权限会怎么样呢?会直接返回正确的值,即是否拥有,或者,没有权限,这个就取决于你是否在清单文件中注册。并不会有6.0的提示框,这个时候更大的坑来了!
在6.0以下你打电话开相机之类的竟然!也弹框问你是否访问!!!!!!!!!!!这个搞什么鬼!ok针对这个问题具体分析下:
1.因为rom的自定制问题,即使你在清单文件注册了,在使用权限的时候仍然会有提示框,提示你是否使用。
2.这个提示即便你在清单文件中注册了权限仍然可以干涉你的操作拒绝你的请求,
3.并没有相关的api及回调,也就是无法监听。并不会走6.0权限的回调。
4.目前经测试最合适的方式是采用try cath的方式来捕获异常提示用户。
5,RECORD_AUDIO:系统在调用需要这个权限的功能的时候,如果被安全软件拒绝,会抛出异常,可以在catch中处理没有权限的情况(MOTO XT1085 系统自带安全软件下测试)。主流软件中,微信通过返回值异常交互,高德,QQ通过catch异常。
CAMERA:调用系统摄像头的时候不会抛出异常(微信,QQ发送照片均无反馈),调用自定义的camera会抛出异常(微信二维码扫描)
LOCATION:对于需要这个权限的应用,可能没有比较好的方法处理,因为高德地图中定位权限被拒绝,同样没有交互。
总结:简单说,怎么解决呢。就是报异常就捕获,然后告诉用户,你看看你是不是哪里有问题,开启下,至于你开没开,反正我是给你提示了。反正我这边不好使。一般项目开发中最后去解决这个问题吧,个人感觉,省的你开始全捕获了,后面是不是你的锅你都甩