通过下面的代码获取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
Vous avez trouvé un exemple particulier. Il n'est pas recommandé de passer des appels directs maintenant. Certains téléphones mobiles désactivent les applications tierces pour passer des appels directement et appellent à la place le numéro système. Le contrôle des autorisations inférieur à 6.0 suit toujours la méthode que vous avez répertoriée ci-dessus. Il est jugé en fonction de l'objet et de la valeur. Il ne peut pas être utilisé selon l'obtention d'une autorisation supérieure à 23.