对比:用普通的方式和用RxPermission差异
RxPermissions实现原理:
构造方法挺容易理解的,就是初始化RxPermissionsFragment,我们所有的权限申请、
回调都是在这个Fragment中实现的,这也是RxPermissions框架最主要的部分,一切都是围绕这个展开的。
在上面我们讲过onRequestPermissionsResult这个方法是处理权限返回时候具体逻辑的,在这里我们就见到了吧。
该框架向外部暴露了一个onRequestPermissionsResult的重载方法,在这个方法中定义了一个PublishSubject,它将每个权限封装为Permission实体类,然后将它发出给订阅它的观察者进行处理。本篇暂时不讲Rxjava的用法。 我暂且认为大家都会Rxjava了。
让我们继续看,isGranted方法。在这个方法中我们看到了一个熟悉的方法checkSelfPermission,说明它是在这个方法中开始的权限申请。
RxPermissionsFragment在fragment中进行权限的申请和结果反馈。
RxPermission:
用于适配Android 6.0新的权限模型的开源框架。官方解释 ,也就是说它是基于Rxjava的动态权限框架。
1)直接申请权限使用
RxPermissions.getInstance(this) .request(permissions) .subscribe(new Action1<Boolean>() { @Override public void call(Boolean granted) { if (granted) { // 在android 6.0之前会默认返回true // 已经获取权限 String jpgPath = getCacheDir() + "test.jpg"; takePhotoByPath(jpgPath, 2); } else { // 未获取权限 Toast.makeText(MainActivity.this, "您没有授权该权限,请在设置中打开授权", Toast.LENGTH_SHORT).show(); } } });
这里直接返回是否授权,我们可以根据这个值进行不同的处理。
2.)条件触发获取权限(结合RxBinding使用)===单独申请一个权限
RxView.clicks(findViewById(R.id.request_permission)) .compose(RxPermissions.getInstance(this).ensure(Manifest.permission.CAMERA)) .subscribe(new Action1<Boolean>() { @Override public void call(Boolean granted) { if (granted) { // 在android 6.0之前会默认返回true // 已经获取权限 String jpgPath = getCacheDir() + "test.jpg"; takePhotoByPath(jpgPath, 2); } else { // 未获取权限 Toast.makeText(MainActivity.this, "您没有授权该权限,请在设置中打开授权", Toast.LENGTH_SHORT).show(); } } });
3).同时请求多个权限
比如同时申请拍照和录音权限
RxPermissions.getInstance(MainActivity.this).request(Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO) .subscribe(new Action1<Boolean>() { @Override public void call(Boolean granted) { if (granted) { // 在android 6.0之前会默认返回true // 已经获取权限 String jpgPath = getCacheDir() + "test.jpg"; takePhotoByPath(jpgPath, 2); } else { // 未获取权限 Toast.makeText(MainActivity.this, "您没有授权该权限,请在设置中打开授权", Toast.LENGTH_SHORT).show(); } } });
注意:如果同时请求多个权限,下面这种方式会合并请求结果,即所有权限请求成功会返回true
,若有一个权限未成功则返回false
。
4).同时请求多个权限(分别获取结果)
同时请求多个权限(分别获取结果)
RxPermissions.getInstance(MainActivity.this).request(Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO) .subscribe(new Action1<Boolean>() { @Override public void call(Boolean granted) { if (granted) { // 在android 6.0之前会默认返回true // 已经获取权限 String jpgPath = getCacheDir() + "test.jpg"; takePhotoByPath(jpgPath, 2); } else { // 未获取权限 Toast.makeText(MainActivity.this, "您没有授权该权限,请在设置中打开授权", Toast.LENGTH_SHORT).show(); } } });