EasyPermissions项目地址 https://github.com/googlesamples/easypermissions
1. 在AndroidManifest定义权限
<uses-permission android:name="android.permission.CAMERA" />
2. 在需要权限的方法前添加注解 @AfterPermissionGranted ,该注解需要传入requestCode,用于区分请求
@AfterPermissionGranted(200)
void reqScanCamera() {
String[] perms = {Manifest.permission.CAMERA};
if (EasyPermissions.hasPermissions(this, perms)) {
// 如果拥有权限
} else {
// 如果没有权限
EasyPermissions.requestPermissions(this, "您必须授权开启摄像头权限,才能进行下一步操作", 200, perms);
}
}
EasyPermissions.requestPermissions 第二个参数的作用:
当用户第一次拒绝后,第二次再请求权限时,弹出对话框,提示用户请求权限的原因,用户点击确定后,会自动弹出权限的系统请求。
但坑爹的是,各大手机厂商的定制系统对该逻辑进行了一定的改动,例如红米Note4的MIUI系统当用户首次选择拒绝权限之后就会“不再询问”了,华为EMUI系统在首次弹出权限请求时就会提供“不再询问”的选项。此时就需要判断APP的某个权限是否处于“不再询问”的状态,从而引导用户去APP设置里面开启权限。
判断方法是 EasyPermissions.somePermissionPermanentlyDenied
但是务必注意,该方法一定要在得知权限被拒之后执行,原因是该方法就是在判断是否应该出现上方的图片提示,如果权限被拒绝了,同时不允许出现上方的图片提示,则认为该权限的状态就是“不再询问”。
综上,通过如下第三点,处理不再询问的权限
3. 实现 EasyPermissions.PermissionCallbacks,定义权限被拒和允许时的操作,和判断“不再询问”状态
public class FaceIDFontActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks {
// ... some other code ...
@Override
public void onPermissionsGranted(int requestCode, List<String> perms) {
Log.d(TAG, "onPermissionsGranted:" + requestCode + ":" + perms.size());
}
@Override
public void onPermissionsDenied(int requestCode, List<String> perms) {
Log.d(TAG, "onPermissionsDenied:" + requestCode + ":" + perms.size());
// (Optional) Check whether the user denied any permissions and checked "NEVER ASK AGAIN."
// This will display a dialog directing them to enable the permission in app settings.
if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
new AlertDialog.Builder(this)
.setTitle("权限提示")
.setMessage("本项认证需要摄像头权限,点击确认后在新页面滑动到最下方,在权限管理处,开启相机权限")
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
})
.setPositiveButton("确认", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 跳转到APP设置页面
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivity(intent);
}
})
.create().show();
}
}
}