集成
在progect下的build.gradle中配置
allprojects {
repositories {
google()
jcenter()
//权限申请配置
maven { url 'http://oss.jfrog.org/artifactory/oss-snapshot-local/' }
}
}
在module(app)下的build.gradle中配置
//动态权限申请
implementation('com.github.hotchemi:permissionsdispatcher:3.3.1') {
// if you don't use android.app.Fragment you can exclude support for them
exclude module: "support-v13"
}
annotationProcessor "com.github.hotchemi:permissionsdispatcher-processor:3.3.1"
使用
/**
* Created by zxt on 2018/6/14/014.
* Desc : 项目主页面
*/
// 注册Activity或Fragment(我们支持两者)来处理权限
// 这是必须使用的注解
@RuntimePermissions
public class MainActivity extends BaseActivity {
//初始化
@Override
public void init() {
//检查权限
MainActivityPermissionsDispatcher.showPermissionWithPermissionCheck(this);
}
/**
* @author zxt
* creartd at 2018/7/5/005 9:45
* 注释执行需要一个或多个权限的操作的方法
*/
//这也是必须使用的注解,用于标注在你要获取权限的方法,
// 注解括号里面有参数,传入想要申请的权限。也就是说你获取了相应的权限之后就会执行这个方法:
@NeedsPermission({Manifest.permission.CAMERA,
Manifest.permission.CALL_PHONE,
Manifest.permission.RECORD_AUDIO,
Manifest.permission.WRITE_EXTERNAL_STORAGE})
void showPermission() {
// getSupportFragmentManager().beginTransaction()
// .replace(R.id.sample_content_fragment, CameraPreviewFragment.newInstance())
// .addToBackStack("camera")
// .commitAllowingStateLoss();
}
/**
* @author zxt
* creartd at 2018/7/5/005 9:46
* 注释一个解释为什么需要权限的方法。它传入一个PermissionRequest对象
* 该对象可用于在用户输入时继续或中止当前的权限请求
*/
//这个不是必须的注解,用于标注申请权限前需要执行的方法,
//注解括号里面有参数,传入想要申请的权限,而且这个方法还要传入一个PermissionRequest对象,
// 这个对象有两种方法:proceed()让权限请求继续,cancel()让请求中断。
// 也就是说,这个方法会拦截你发出的请求,这个方法用于告诉用户你接下来申请的权限是干嘛的,说服用户给你权限。
@OnShowRationale({Manifest.permission.CAMERA,
Manifest.permission.CALL_PHONE,
Manifest.permission.RECORD_AUDIO,
Manifest.permission.WRITE_EXTERNAL_STORAGE})
void showRationaleForPermission(final PermissionRequest request) {
new AlertDialog.Builder(this)
.setMessage("直播需要使用摄像头、存储、读取来电状态权限,是否同意授权申请?")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//继续执行请求
request.proceed();
}
}).setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//取消执行请求
request.cancel();
}
}).show();
}
/**
* @author zxt
* creartd at 2018/7/5/005 9:46
* 注释如果用户未授予权限则调用的方法
*/
//这个也不是必须的注解,用于标注如果权限请求失败,但是用户没有勾选不再询问的时候执行的方法
// 注解括号里面有参数,传入想要申请的权限。也就是说,我们可以在这个方法做申请权限失败之后的处理,
// 如像用户解释为什么要申请,或者重新申请操作等。
@OnPermissionDenied({Manifest.permission.CAMERA,
Manifest.permission.CALL_PHONE,
Manifest.permission.RECORD_AUDIO,
Manifest.permission.WRITE_EXTERNAL_STORAGE})
void showDeniedForPermission() {
new AlertDialog.Builder(this)
.setMessage("直播需要使用摄像头、存储、读取来电状态权限,您暂时没有授权,请到设置授权必要权限,以免影响您的使用")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//继续执行请求
dialog.cancel();
}
}).setNegativeButton("取消", null).show();
ToastUtil.showMessage("权限被拒绝,可能会影响部分功能的正常使用");
}
/**
* @author zxt
* creartd at 2018/7/5/005 9:46
* 如果用户选择让设备“永不再询问”权限,则注释一个被调用的方法
*/
//这个也不是必须的注解,用于标注如果权限请求失败,而且用户勾选不再询问的时候执行的方法,
// 注解括号里面有参数,传入想要申请的权限。也就是说,我们可以在这个方法做申请权限失败并选择不再询问之后的处理。
// 例如,可以告诉作者想开启权限的就从手机设置里面开启。
@OnNeverAskAgain({Manifest.permission.CAMERA,
Manifest.permission.CALL_PHONE,
Manifest.permission.RECORD_AUDIO,
Manifest.permission.WRITE_EXTERNAL_STORAGE})
void showNeverAskForPermission() {
ToastUtil.showMessage("权限被拒绝,可能会影响部分功能的正常使用,请打开手机设置授予必要权限");
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
MainActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
}
}