当前位置:   article > 正文

Android权限声明与动态权限框架RxPermissions、EasyPermission介绍

rxpermissions

一、为什么要有权限?

这个大家应该都知道,简单设想一下,如果Android没有权限管控,应用安装后就可以通过互联网、蓝牙等方式将读取到得设备信息、账户信息、通讯录、照片、文件、聊天记录…通通发出去,隐私泄露的同时还有可能造成直接的经济损失。如果是这样,那么Android将不复存在,没有人会愿意使用Android设备。

二、Android 对于权限的分类

Anroid将权限分为安装时权限,运行时权限和特殊权限。用户可以在系统设置里查看各个应用的权限。

  1. 安装时权限:这一类权限不涉及安全问题,在安装时系统授予应用相关权限。
  2. 运行时权限:这一类权限涉及到隐私安全等问题,必须由用户点击允许后系统才能赋予应用相关权限。
  3. 特殊权限:特殊权限与特定的应用操作相对应。只有平台和原始设备制造商 (OEM) 可以定义特殊权限

三、权限的使用

  1. 可见:用户能够知道应用使用了哪些权限
  2. 可操作:用户可以拒绝应用申请的权限,也可以关闭某一已赋予的权限
  3. 最小化:应用要尽可能减少权限申请,如果能不申请权限实现功能就不要申请权限,如果有更小的权限能实现就申请小的权限,如不需要精确的位置,那就可以申请ACCESS_COARSE_LOCATION 权限,如果需要精确的位置信息,再申请ACCESS_FINE_LOCATION权限。

四、使用系统相机拍照示例

  1. AndroidManifest文件中声明权限
    在不声明权限的情况下使用:
Camera camera = Camera.open();
  • 1

在这里插入图片描述
AndroidManifest中添加权限声明

<uses-permission android:name="android.permission.CAMERA"/>
  • 1
  • Android Manifest中声明Camera权限后,但是没有添加硬件设备调用Camera.open报Error 2
    在这里插入图片描述
    需要添加
<uses-feature android:name="android.hardware.camera" />
  • 1

2、使用相关功能时检查权限,动态申请权限
在AndroidManifest添加权限声明后,要在使用相机拍照处增加权限动态申请,由用户在此处点击允许后才可以获得权限,使用相机功能。
在这里插入图片描述

先用ContextCompat.checkSelfPermission检查要申请的权限是否被授予,若结果等于PackageManager.PERMISSION_GRANTED则表示权限被授予成功,Android将权限名称定义在Manifest类中。

在这里插入图片描述
Android动态权限声明的示例,onRequestPermissionsResult为申请的结果回调。如果权限未被成功授予,禁止使用该功能,但是要让用户能够继续使用其他功能,

    /**
     * 申请权限
     */
    private void reqigsterPermission() {
        if(ContextCompat.checkSelfPermission(CameraActivity.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CODE);
        } else {
            Log.d(TAG, " -----已经获取了权限----- ");
        }
    }

    /**
     * @param requestCode 请求码,和ActivityCompat.requestPermissions申请时指定的对应
     * @param permissions 权限名如android.permission.CAMERA
     * @param grantResults 权限申请结果
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        Log.d(TAG, "onRequestPermissionsResult: " + permissions[0]);
        if(requestCode == REQUEST_CODE) {
            if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
                Log.d(TAG, "onRequestPermissionsResult 相机权限开启成功!");
            } else {
                Log.d(TAG, "onRequestPermissionsResult 相机权限开启失败!");
                finish();
            }
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

    private void initCamera() {
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

3、动态权限框架介绍

  • EasyPermission

引入,androidx和support需要引入不同的包

    // For androidX
    implementation 'pub.devrel:easypermissions:3.0.0'
    // For Android Support Library
    implementation 'pub.devrel:easypermissions:2.0.1'
  • 1
  • 2
  • 3
  • 4

实现EasyPermission的接口asyPermissions.PermissionCallbacks, EasyPermissions.RationaleCallbacks

public class CameraActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks, EasyPermissions.RationaleCallbacks {
	...
	@Override
    public void onPermissionsGranted(int requestCode, @NonNull List<String> perms) {
        Log.d(TAG, "onPermissionsGranted 权限申请成功");//这里正常需要判断requestCode,允许后回调
    }

    @Override
    public void onPermissionsDenied(int requestCode, @NonNull List<String> perms) {
        Log.d(TAG, "onPermissionsGranted 权限申请失败,用户禁止权限 ");//这里正常需要判断requestCode,拒绝后回调
    }

    @Override
    public void onRationaleAccepted(int requestCode) {
        Log.d(TAG, "onRationaleAccepted ");//这里正常需要判断requestCode,提示权限申请额弹框,点击确定时回调,并且弹出权限申请由用户选择授权
    }

    @Override
    public void onRationaleDenied(int requestCode) {
        Log.d(TAG, "onRationaleDenied ");//这里正常需要判断requestCode,提示权限申请额弹框,点击取消时回调
    }
    
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

在具体功能实现的方法添加注解,如果已经有权限执行相关功能调用,否则由EasyPermission申请权限

    @AfterPermissionGranted(PERMISSION_CAMERA)
    private void testCamera(){
        if (EasyPermissions.hasPermissions(this, permissions)) {
            initCamera();
        } else {
            EasyPermissions.requestPermissions(this, "该权限用于拍摄XXX, 不授予权限不能使用相关功能", PERMISSION_CAMERA, permissions);
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

需要实现onRequestPermissionsResult方法,将权限申请的结果交给EasyPermission处理.注意EasyPermissions.onRequestPermissionsResult第四个参数要传上下文,否则即使授权成功onPermissionsGranted也不能正常回调。

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • RxPermissions
    引入,注意不同的版本引入不同的包,否则new RxPermissions(this)时会报错。注意RxJava和RxPermission版本对应。
  // For Android Support Library
    implementation 'io.reactivex.rxjava2:rxjava:2.0.5'
    implementation 'com.github.tbruyelle:rxpermissions:0.10.2'
    // For androidx
    implementation 'io.reactivex.rxjava3:rxjava:3.0.4'
    implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
    implementation 'com.github.tbruyelle:rxpermissions:0.12'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

获取权限示例

    private void requestRxPermission() {
        new RxPermissions(this).request(Manifest.permission.CAMERA).subscribe(new Consumer<Boolean>() {
            @Override
            public void accept(Boolean aBoolean) throws Throwable {
                if(aBoolean){
                    Log.d(TAG, "accept 已获得权限: ");
                } else {
                    Log.d(TAG, "accept 获取权限失败 ");
                }
            }
        });
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 比较,在项目已经引入了rxjava的情况下,推荐使用rxpermissions,这样更简洁,不用实现很多个方法。否则推荐使用easypermisson。

五、小结

总之,要想做一个优秀的app,权限的获取必须要遵循android权限的相关原则,必须给用户知情权,让用户随时能够拒绝某一权限。针对拍照,我们甚至可以选择不获取相机权限的方式实现,因为在当今网络如此发达的形势下,用户对于软件安全逐渐加强了认知,过多的权限申请,可能导致用户流失。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/559085
推荐阅读
相关标签
  

闽ICP备14008679号