Android Study 之聊聊权限那点事儿~别怕,就是干~!!!( 六 )


boolean isMarshmallow() {return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M;}public boolean isGranted(String permission) {// 如果是Android 6.0 (Api 23)之前,则权限被允许使用 。return !isMarshmallow() || mRxPermissionsFragment.isGranted(permission);}
(2) 将权限申请的代码(())和请求结果的代码(())放在一起管理,避免了代码的分散 。
(3) 具备Rx()的特性,例如可以使用链式操作,可以执行操作,操作等等 。
顺便在这里提一下:
是基于的,现在有2个大版本,一个 1.x(通常说),另一个是 。所以有2个版本,分别支持和 。
使用注意事项
参考中的 。
(1) 必须 >= 11 。
(2) 使用申请权限,必须在.()或者View.()中处理 。不能在()中处理,因为()在App的生命周期中可能执行的很频繁 。如果在请求权限的时候,App重新启动了(例如屏幕旋转导致的App关闭再重新创建),那么用户的选择(允许 或者 拒绝)将无法发给App 。更多讨论,请参考:
撸码
1.导入依赖库
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'compile 'io.reactivex.rxjava2:rxjava:2.0.5'compile 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.3@aar'
2.在点击事件中请求
findViewById(R.id.id_rx).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {RxPermissions rxPermission = new RxPermissions(RxPermissionsActivity.this);rxPermission.requestEach(Manifest.permission.CAMERA).subscribe(new Consumer() {@Overridepublic void accept(Permission permission) throws Exception {if (permission.granted) {// 用户已经同意该权限Toast.makeText(RxPermissionsActivity.this, "成功~", Toast.LENGTH_SHORT).show();Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);startActivity(intent);} else if (permission.shouldShowRequestPermissionRationale) {// 用户拒绝了该权限,没有选中『不再询问』(Never ask again),那么下次再次启动时,还会提示请求权限的对话框Toast.makeText(RxPermissionsActivity.this, "拒绝~", Toast.LENGTH_SHORT).show();} else {// 用户拒绝了该权限,并且选中『不再询问』Toast.makeText(RxPermissionsActivity.this, "不在询问~", Toast.LENGTH_SHORT).show();}}});}});
当然还有一种办法就是直接在首页进行申请应用所需要的权限,如下:
/*** 请求权限*/private void requestPermissions() {RxPermissions rxPermissions = new RxPermissions(self);rxPermissions.requestEach(Manifest.permission.ACCESS_COARSE_LOCATION, // 用于进行网络定位Manifest.permission.ACCESS_FINE_LOCATION,// 用于访问GPS定位Manifest.permission.CAMERA // 拍照).subscribe(new Consumer() {@Overridepublic void accept(Permission permission) throws Exception {if (permission.granted) { // 用户授予该权限 让我们尽情浪去吧} else if (permission.shouldShowRequestPermissionRationale) { // 用户拒绝了该权限,没有选中『不再询问』(Never ask again),那么下次再次启动时,还会提示请求权限的对话框} else { // 用户拒绝了该权限,并且选中『不再询问』}}});}
以上俩种方式大家可随意选择~
r使用 简介
用一句话简单概括就是:基于注释的API来处理运行时权限 。
优势注释含义
r仅引入了几个注释,保持其通用的API简洁,具体如下:

Android Study 之聊聊权限那点事儿~别怕,就是干~!!!

文章插图
对此,官方为我们提供了一个小例子,结合上图查看代码后,我们来实际~
@RuntimePermissionspublic class MainActivity extends AppCompatActivity {@NeedsPermission(Manifest.permission.CAMERA)void showCamera() {getSupportFragmentManager().beginTransaction().replace(R.id.sample_content_fragment, CameraPreviewFragment.newInstance()).addToBackStack("camera").commitAllowingStateLoss();}@OnShowRationale(Manifest.permission.CAMERA)void showRationaleForCamera(final PermissionRequest request) {new AlertDialog.Builder(this).setMessage(R.string.permission_camera_rationale).setPositiveButton(R.string.button_allow, (dialog, button) -> request.proceed()).setNegativeButton(R.string.button_deny, (dialog, button) -> request.cancel()).show();}@OnPermissionDenied(Manifest.permission.CAMERA)void showDeniedForCamera() {Toast.makeText(this, R.string.permission_camera_denied, Toast.LENGTH_SHORT).show();}@OnNeverAskAgain(Manifest.permission.CAMERA)void showNeverAskForCamera() {Toast.makeText(this, R.string.permission_camera_neverask, Toast.LENGTH_SHORT).show();}}