Android开发动态获取权限(6.0以上API>23)
2016-11-18 本文已影响568人
瓶子君
大家都知道,在安卓6.0以前,权限是在安装APP的时候以列表的形式体现出来的,这对用户很不友好,很多流氓软件就因此大肆猖獗,盗取用户信息;
在6.0的时候google终于意识到这个问题,以动态的方式去获取权限,需要用户一个一个去允许,用户友好了,码农又苦逼了哈哈,因为所谓的‘动态’,其实是不动态的,也就是说,权限并不会直接跳出来,而是需要码农手动去处理,其代码量以及逻辑性很难处理,于是很多大神就对权限进行了封装处理:
PermissionsDispatcher
使用标注的方式,动态生成类处理运行时权限,目前还不支持嵌套Fragment。
RxPermissions
基于RxJava的运行时权限检测框架
Grant
简化运行时权限的处理,比较灵活
android-RuntimePermissions
Google官方的例子
其中最著名的莫过于PermissionsDispatcher;
首先Project Build中添加:
buildscript {
dependencies {
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
}
然后在app module中添加:
apply plugin: 'android-apt'
dependencies {
compile 'com.github.hotchemi:permissionsdispatcher:${latest.version}'
apt 'com.github.hotchemi:permissionsdispatcher-processor:${latest.version}'
}
Project Build
app module
之后就可以在Activity中进行权限申请的操作了:
Alt+Insert选择相机权限
@NeedsPermission(Manifest.permission.CAMERA)
void showCamera() {
Toast.makeText(this, "用户允许后", Toast.LENGTH_SHORT).show();
}
@OnShowRationale(Manifest.permission.CAMERA)
void showRationaleForCamera(final PermissionRequest request) {
Toast.makeText(this, ""用户拒绝后选择再次出现", Toast.LENGTH_SHORT).show();
}
@OnPermissionDenied(Manifest.permission.CAMERA)
void showDeniedForCamera() {
Toast.makeText(this, "每次拒绝调用", Toast.LENGTH_SHORT).show();
}
@OnNeverAskAgain(Manifest.permission.CAMERA)
void showNeverAskForCamera() {
Toast.makeText(this, "每次触发都会询问一次", Toast.LENGTH_SHORT).show();
}
触发动态权限:
//触发动态权限
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
MainActivityPermissionsDispatcher.cameraStartWithCheck(MainActivity.this);
}
});
MUI
以下代码为自动生成:
@NeedsPermission(Manifest.permission.CAMERA)
void cameraStart() {
//业务处理
textView.setText("您获取到了权限");
System.out.println("开启权限");
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
MainActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
}
.