Android原生权限管理:AppOps
op 的值是 0 ~ 47,其中0代表粗略定位权限,1代表精确定位权限,24代表悬浮窗权限。(具体可以看看android源码在android.app下就有个AppOpsManager类)
uid 当前应用用到的uid ,可通过 Binder.getCallingUid()获得。packageName 应用程序的包名,通过getPackageName获得。
通过上面的知识,写一函数 用来判断 程序是否具有某些权限的函数
private static int checkOp(Context context, int op){
final int version = Build.VERSION.SDK_INT;
if (version >= 19){
Object object = context.getSystemService("appops");
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();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
return -1;
}
调用上面的函数,返回 0 就代表有权限,1代表没有权限,-1函数出错啦
详细情况请参考:http://blog.csdn.net/a_long_/article/details/51987145