- Add it in your root build.gradle at the end of repositories:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
- Add the dependency
dependencies {
implementation 'com.github.ly-android:PermissionUtils:1.0.3'
}
- user PermisstionUtils
if (PermissionUtils.hasPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)) {
Toast.makeText(this, "有权限!", Toast.LENGTH_SHORT).show();
}
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
PermissionUtils.toPermissionSetting(MainActivity.this);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
});
我们知道在6.0之后,android的一些权限需要动态获取,网上很多封装好的动态获取权限框架,如RxPermisstion,PermissionsDispatcher,easypermissions
如果项目targetSdkVersion<23,使用它们判断是否授权,会出现在设置中关闭权限,还能判断已经授权,由于国产手机都定制了Rom,需要使用原生api来判断,当然也可以用PermissionChecker.checkSelfPermission,测试发现在vivo,oppo手机上判断权限始终返回已授权
/**
* 系统层的权限判断
*
* @param context 上下文
* @param permissions 申请的权限 Manifest.permission.READ_CONTACTS
* @return 是否有权限 :其中有一个获取不了就是失败了
*/
public static boolean hasPermission(@NonNull Context context, @NonNull List<String> permissions) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) return true;
for (String permission : permissions) {
String op = AppOpsManagerCompat.permissionToOp(permission);
if (TextUtils.isEmpty(op)) continue;
int result = AppOpsManagerCompat.noteOp(context, op, android.os.Process.myUid(), context.getPackageName());
if (result == AppOpsManagerCompat.MODE_IGNORED) return false;
AppOpsManager appOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
String ops = AppOpsManager.permissionToOp(permission);
int locationOp = appOpsManager.checkOp(ops, Binder.getCallingUid(), context.getPackageName());
if (locationOp == AppOpsManager.MODE_IGNORED) return false;
result = ContextCompat.checkSelfPermission(context, permission);
if (result != PackageManager.PERMISSION_GRANTED) return false;
}
return true;
}
如果没有权限,主动去申请,也会出现弹不出权限允许的对话框,这时候需要跳转到权限设置界面怎么办?
这时候希望重新去打开该权限,那么问题来了,Android厂家定制的room五花八门,很多时候却发现找不到权限管理的入口。为了解决这一问题,如果我们应用中直接提供权限管理入口给用户,是不是会很方便的解决用户这一困扰呢?经过一番研究,整理出了大部分国产手机直接打开权限管理界面的方法:
贴出部分代码
/**
* 跳转到权限设置界面
*
* @param context
*/
public static void toPermissionSetting(Context context) throws NoSuchFieldException, IllegalAccessException {
if (Build.VERSION.SDK_INT < 23) {
if (RomUtils.checkIsMiuiRom()) {
MiuiUtils.applyMiuiPermission(context);
} else if (RomUtils.checkIsMeizuRom()) {
MeizuUtils.applyPermission(context);
} else if (RomUtils.checkIsHuaweiRom()) {
HuaweiUtils.applyPermission(context);
} else if (RomUtils.checkIs360Rom()) {
QikuUtils.applyPermission(context);
} else if (RomUtils.checkIsOppoRom()) {
OppoUtils.applyOppoPermission(context);
} else {
RomUtils.getAppDetailSettingIntent(context);
}
} else {
if (RomUtils.checkIsMeizuRom()) {
MeizuUtils.applyPermission(context);
} else {
if (RomUtils.checkIsOppoRom() || RomUtils.checkIsVivoRom()
|| RomUtils.checkIsHuaweiRom() || RomUtils.checkIsSamsunRom()) {
RomUtils.getAppDetailSettingIntent(context);
} else if (RomUtils.checkIsMiuiRom()) {
MiuiUtils.toPermisstionSetting(context);
} else {
RomUtils.commonROMPermissionApplyInternal(context);
}
}
}
}
参考网站:Android 6.0动态权限及小米(MIUI)权限的特殊处理
Android各大手机品牌手机跳转到权限管理界面