Android6.0谷歌加强了对android权限机制等管理,对敏感权限要动态加载。为了便于管理动态权限,GitHub上出现了好多开发者封装的动态权限管理库,PermissionsDispatcher是github上面一个广受大家喜爱的权限管理库,做一下笔记方便自己以后使用(该库支持小米手机)。
@RuntimePermissions
注册Activity或Fragment来处理权限
@NeedsPermission
注解执行需要一个或多个权限的操作的方法(允许请求权限后,后面要执行的逻辑写在这里)
@OnShowRationale
注解一个方法,解释为什么需要许可。它传入一个PermissionRequest对象,可以用于在用户输入时继续或中止当前的权限请求(这里可以弹出一个对话框让用户点击是否要允许该权限,如果点击允许,则弹出权限对话框让用户选择。)
@OnPermissionDenied
注释如果用户没有授予权限,则调用该方法( 如果用户没有选择:不再询问,且拒绝了该权限,则会回调此注解的方法)
@OnNeverAskAgain
注解一个方法,如果用户选择让设备“不再询问”一个权限,则调用该方法(小米手机因为有自己的动态权限管理机制,拒绝权限后直接走了这个方法)
核心代码示例:
@RuntimePermissions
public class MainActivity extends AppCompatActivity {
private static final int CODE_REQUEST_CAMERA_PERMISSIONS = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_main);
findViewById (R.id.tv).setOnClickListener (new View.OnClickListener () {
@Override
public void onClick(View v) {
MainActivityPermissionsDispatcher.myNCamWithCheck (MainActivity.this);
}
});
}
@NeedsPermission(Manifest.permission.CAMERA)//允许请求权限后,后面要执行的逻辑写在这里
void myNCam() {
Toast.makeText (this,"权限被允许,本逻辑可以执行了",Toast.LENGTH_LONG).show ();
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult (requestCode, permissions, grantResults);
MainActivityPermissionsDispatcher.onRequestPermissionsResult (this, requestCode, grantResults);
}
@OnShowRationale(Manifest.permission.CAMERA)//这里可以弹出一个对话框让用户点击是否要允许该权限,如果点击允许,则弹出权限对话框让用户选择
void mySCam(final PermissionRequest request) {
showRationaleDialog (R.string.permission_camera_rationale, request);
}
@OnPermissionDenied(Manifest.permission.CAMERA)//如果用户没有选择:不再询问,且拒绝了该权限,则会回调此注解的方法
void myDCam() {
Toast.makeText (this, R.string.permission_camera_denied, Toast.LENGTH_LONG).show ();
}
@OnNeverAskAgain(Manifest.permission.CAMERA)//如果用户选择让设备“不再询问”一个权限,则调用该方法
void myACam() {
Toast.makeText (this, R.string.permission_camera_never_askagain, Toast.LENGTH_SHORT).show ();
//对话框提示语句仿支付宝提示
final AlertDialog.Builder mDialog = new AlertDialog.Builder (this);
mDialog.setTitle ("获取相机权限");
mDialog.setMessage ("我们需要获取相机相关权限,用于拍照;否则,你将无法正常使用本应用\n设置路径:设置->应用->xxx->权限");
mDialog.setNegativeButton ("取消", new DialogInterface.OnClickListener () {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
mDialog.create ().dismiss ();
}
});
mDialog.setPositiveButton ("去设置", new DialogInterface.OnClickListener () {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
settingPermissionActivity (MainActivity.this);
}
});
mDialog.show ();
}
private void showRationaleDialog(@StringRes int messageResId, final PermissionRequest request) {
new AlertDialog.Builder (this)
.setPositiveButton (R.string.button_allow, new DialogInterface.OnClickListener () {
@Override
public void onClick(@NonNull DialogInterface dialog, int which) {
request.proceed ();
}
})
.setNegativeButton (R.string.button_deny, new DialogInterface.OnClickListener () {
@Override
public void onClick(@NonNull DialogInterface dialog, int which) {
request.cancel ();
}
})
.setCancelable (false)
.setMessage (messageResId)
.show ();
}
public static void settingPermissionActivity(Activity activity) {
//判断是否为小米系统
if (TextUtils.equals (BrandUtils.getSystemInfo ().getOs (), BrandUtils.SYS_MIUI)) {
Intent miuiIntent = new Intent ("miui.intent.action.APP_PERM_EDITOR");
miuiIntent.putExtra ("extra_pkgname", activity.getPackageName ());
//检测是否有能接受该Intent的Activity存在
List resolveInfos = activity.getPackageManager ().queryIntentActivities (miuiIntent, PackageManager.MATCH_DEFAULT_ONLY);
if (resolveInfos.size () > 0) {
activity.startActivityForResult (miuiIntent, CODE_REQUEST_CAMERA_PERMISSIONS);
return;
}
}
//如果不是小米系统 则打开Android系统的应用设置页
Intent intent = new Intent (Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts ("package", activity.getPackageName (), null);
intent.setData (uri);
activity.startActivityForResult (intent, CODE_REQUEST_CAMERA_PERMISSIONS);
}
}
重点来了,可以用插件:PermissionsDispatcher plugin
上面代码手动写比较繁琐 androidStudio里面有一个三方插件 可以自动生成注解方法。
在AndroidStudio 添加插件里面搜索:PermissionsDispatcher plugin 安装重启AS即可。
具体使用方法下面网址有详细说明:
https://github.com/shiraji/permissions-dispatcher-plugin
PermissionsDispatcher GitHub地址:
https://github.com/permissions-dispatcher/PermissionsDispatcher
demo地址
https://github.com/momosnail/PermissionDispatcherDemo