Android权限声明与动态权限框架RxPermissions、EasyPermission介绍
android权限声明,EasyPermission,RxPermissions
一、为什么要有权限?
这个大家应该都知道,简单设想一下,如果Android没有权限管控,应用安装后就可以通过互联网、蓝牙等方式将读取到得设备信息、账户信息、通讯录、照片、文件、聊天记录…通通发出去,隐私泄露的同时还有可能造成直接的经济损失。如果是这样,那么Android将不复存在,没有人会愿意使用Android设备。
二、Android 对于权限的分类
Anroid将权限分为安装时权限,运行时权限和特殊权限。用户可以在系统设置里查看各个应用的权限。
- 安装时权限:这一类权限不涉及安全问题,在安装时系统授予应用相关权限。
- 运行时权限:这一类权限涉及到隐私安全等问题,必须由用户点击允许后系统才能赋予应用相关权限。
- 特殊权限:特殊权限与特定的应用操作相对应。只有平台和原始设备制造商 (OEM) 可以定义特殊权限
三、权限的使用
- 可见:用户能够知道应用使用了哪些权限
- 可操作:用户可以拒绝应用申请的权限,也可以关闭某一已赋予的权限
- 最小化:应用要尽可能减少权限申请,如果能不申请权限实现功能就不要申请权限,如果有更小的权限能实现就申请小的权限,如不需要精确的位置,那就可以申请ACCESS_COARSE_LOCATION 权限,如果需要精确的位置信息,再申请ACCESS_FINE_LOCATION权限。
四、使用系统相机拍照示例
- AndroidManifest文件中声明权限
在不声明权限的情况下使用:
Camera camera = Camera.open();

AndroidManifest中添加权限声明
<uses-permission android:name="android.permission.CAMERA"/>
- Android Manifest中声明Camera权限后,但是没有添加硬件设备调用Camera.open报Error 2

需要添加
<uses-feature android:name="android.hardware.camera" />
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() {
3、动态权限框架介绍
- EasyPermission
引入,androidx和support需要引入不同的包
// For androidX
implementation 'pub.devrel:easypermissions:3.0.0'
// For Android Support Library
implementation 'pub.devrel:easypermissions:2.0.1'
实现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,提示权限申请额弹框,点击取消时回调
}
}
在具体功能实现的方法添加注解,如果已经有权限执行相关功能调用,否则由EasyPermission申请权限
@AfterPermissionGranted(PERMISSION_CAMERA)
private void testCamera(){
if (EasyPermissions.hasPermissions(this, permissions)) {
initCamera();
} else {
EasyPermissions.requestPermissions(this, "该权限用于拍摄XXX, 不授予权限不能使用相关功能", PERMISSION_CAMERA, permissions);
}
}
需要实现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);
}
- 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'
获取权限示例
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 获取权限失败 ");
}
}
});
}
- 比较,在项目已经引入了rxjava的情况下,推荐使用rxpermissions,这样更简洁,不用实现很多个方法。否则推荐使用easypermisson。
五、小结
总之,要想做一个优秀的app,权限的获取必须要遵循android权限的相关原则,必须给用户知情权,让用户随时能够拒绝某一权限。针对拍照,我们甚至可以选择不获取相机权限的方式实现,因为在当今网络如此发达的形势下,用户对于软件安全逐渐加强了认知,过多的权限申请,可能导致用户流失。
更多推荐


所有评论(0)