通过下面的代码获取AppOpsManager MODE
private static int checkOp(Context context, int op){
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT){
Object object = context.getSystemService(Context.APP_OPS_SERVICE);
Class c = object.getClass();
try {
Class[] cArg = new Class[3];
cArg[0] = int.class;
cArg[1] = int.class;
cArg[2] = String.class;
Method lMethod = c.getDeclaredMethod("checkOp", cArg);
return (Integer) lMethod.invoke(object, op, Binder.getCallingUid(), context.getPackageName());
} catch(NoSuchMethodException e) {
e.printStackTrace();
LogUtils.e("permission:: NoSuchMethodException"+e.getMessage());
} catch (IllegalAccessException e) {
e.printStackTrace();
LogUtils.e("permission:: IllegalAccessException"+e.getMessage());
} catch (IllegalArgumentException e) {
e.printStackTrace();
LogUtils.e("permission:: IllegalArgumentException"+e.getMessage());
} catch (InvocationTargetException e) {
e.printStackTrace();
LogUtils.e("permission:: InvocationTargetException"+e.getMessage());
}
}
return -1;
}
每次通过设置界面修改 app 拨打电话权限,查看打印的值
小米 ,锤子手机正常
魅族MX5、OPPO R9S 不管怎么切换权限返回值都为0
특별한 예를 찾았습니다. 지금은 직접 전화를 걸지 않는 것이 좋습니다. 일부 휴대폰에서는 직접 전화를 걸기 위해 타사 애플리케이션을 비활성화하고 대신 시스템 다이얼로 전화를 겁니다. 6.0 이하의 권한 제어는 여전히 위에 나열한 방법을 따르며, 23 이상에서는 권한 획득 여부에 따라 동작할 수 없습니다.