和尚曾经在面试 Demo 中处理过权限方面的问题,当时的权限判断都是自己来处理的,不够灵活方便,封装的还远远不够,这次和尚初步尝试一下 RxPermissions,Rx 系列大大优化了我们的代码。
根据谷歌官网中定义,应用权限分为安全权限与危险权限,安全权限可直接在 AndroidManifest.xml 中申请即可;而危险权限在 Android 6.0(API 级别 23)开始,用户开始在应用运行时向其授予权限,而不是在应用安装时授予。 危险权限组主要包括:日历 / 相机 / 接触 / 定位 / 麦克风 / 手机电话 / 传感器 / 短信 / 存储,等几类:
3.1 request 方式: 有几个权限申请对应弹几个通知框,只有多有对通知窗口都【允许】或【拒绝】处理完之后才会进入判断,是否权限被打开;重新进入本页面时会保留上一次处理过之后对状态;通过手机设置 -> 权限管理 中相关权限更改为提醒时,进入应用才会重新弹框。
new RxPermissions(this)
.request(permission.CAMERA, permission.READ_PHONE_STATE)
.subscribe(granted -> {
if (granted) {
Log.e(TAG, "所有权限都已打开!");
} else {
Log.e(TAG, "至少有一个权限被禁止!");
}
});
3.2 ensure 方式 ensure 方式的效果与 request 相同,一般会配合 RxView 共同使用。
RxView.clicks(findViewById(R.id.work_btn))
.compose(rxPermissions.ensure(permission.CAMERA, permission.READ_PHONE_STATE))
.subscribe(granted -> {
if (granted) {
Log.e(TAG, "所有权限都已打开!");
} else {
Log.e(TAG, "至少有一个权限被禁止!");
}
});
3.3 requestEach 方式 这种方式可以跟踪具体哪个权限被允许和拒绝,这个可以方便有针对性的处理;同样会记录上一次的状态;通过手机设置 -> 权限管理 中相关权限更改为提醒时,进入应用才会重新弹框。
rxPermissions
.requestEach(permission.CAMERA, permission.READ_PHONE_STATE)
.subscribe(permission -> {
if (permission.granted) {
Log.e(TAG, permission.name + "权限被授予!");
} else if (permission.shouldShowRequestPermissionRationale) {
Log.e(TAG, permission.shouldShowRequestPermissionRationale + "");
} else {
Log.e(TAG, permission.name + "权限被禁止!");
}
});
3.4 ensureEach 方式 ensureEach 方式的效果与 requestEach 相同,一般会配合 RxView 共同使用。
RxView.clicks(findViewById(R.id.work_btn))
.compose(rxPermissions.ensureEach(permission.CAMERA, permission.READ_PHONE_STATE))
.subscribe(permission -> {
if (permission.granted) {
Log.e(TAG, permission.name + "权限被授予!");
} else if (permission.shouldShowRequestPermissionRationale) {
Log.e(TAG, permission.shouldShowRequestPermissionRationale + "");
} else {
Log.e(TAG, permission.name + "权限被禁止!");
}
});
3.5 requestEachCombined 方式 和尚的理解是这种方式已权限组的方式进行判断,只有全部都允许才进入 (permission.granted) 权限授予判断,全部禁止或部分允许会进入权限禁止判断,实际上部分允许的权限已被打开。
rxPermissions
.requestEachCombined(permission.CAMERA, permission.READ_PHONE_STATE)
.subscribe(permission -> {
if (permission.granted) {
Log.e(TAG, permission.name + "所有的权限都被授予!");
} else if (permission.shouldShowRequestPermissionRationale) {
Log.e(TAG, permission.name + "至少有一个权限不会被提示!");
} else {
Log.e(TAG, permission.name + "权限被禁止!");
}
});
3.6 ensureEachCombined 方式 ensureEachCombined 方式的效果与 requestEachCombined 相同,一般会配合绑定具体的控件共同使用。
RxView.clicks(findViewById(R.id.work_btn))
.compose(rxPermissions.ensureEachCombined(permission.CAMERA, permission.READ_PHONE_STATE))
.subscribe(permission -> {
if (permission.granted) {
Log.e(TAG, permission.name + "所有的权限都被授予!");
} else if (permission.shouldShowRequestPermissionRationale) {
Log.e(TAG, permission.name + "至少有一个权限不会被提示!");
} else {
Log.e(TAG, permission.name + "权限被禁止!");
}
});
和尚也是初步尝试,有不对的地方烦请提醒。以下是和尚公众号,欢迎闲来吐槽~