AppOpsManager 一次简单应用

Android手机有一个功能,我是刚知道没几天,也是我一直都想有得功能,那就是禁止掉某些app的权限。在安装app的时候,界面会列出App 已申请的权限,然后让用户决定是否安装。问题是我需要这个app的某些功能,这些功能我觉得不需要那么多得权限。比如我不想让这个app有读取短信通讯录权限,他用到这些权限的功能又是我不需要的。怎么办,以前我没啥办法,装呗,谁让我非要用这个app呢。现在我知道了,原来是可以禁用app的某些权限的, 从Android 4.3开始谷歌就就将权限管理功能集成系统里了,Google把他叫App Ops(Application Operations)。
我是怎么知道有这么一个功能的呢,因为我开发的一个app需要用到手机定位功能,gps+WiFi+基站都定位失败,后来才知道定位功能被禁用了。作为一个程序员就要思考怎么才能让程序知道这次定位失败是没有权限的原因还是一些其他原因呢,通过网上查找知道了AppOpsManager类,


AppOpsManager 是在是在Android 4.4版本支持的 (api 19)。获得他实例的方法是

Context.getSystemService(Context.APP_OPS_SERVICE)

APP_OPS_SERVICE 的值是 “appops”

AppOpsManager类里有一函数 int checkOp(String op, int uid, String packageName)

    public int checkOp(String op, int uid, String packageName) {
        return checkOp(strOpToOp(op), uid, packageName);
    }
    public static int strOpToOp(String op) {
        Integer val = sOpStrToOp.get(op);
        if (val == null) {
            throw new IllegalArgumentException("Unknown operation string: " + op);
        }
        return val;
    }   
功能就是快速检测某个应用是否具有某些权限,看上面的源码可知道最终调用了下面的代码

    public int checkOp(int op, int uid, String packageName) {
        try {
            int mode = mService.checkOperation(op, uid, packageName);
            if (mode == MODE_ERRORED) {
                throw new SecurityException(buildSecurityExceptionMsg(op, uid, packageName));
            }
            return mode;
        } catch (RemoteException e) {
        }
        return MODE_IGNORED;
    }
   op 的值是 0 ~ 47,其中0代表粗略定位权限,1代表精确定位权限,24代表悬浮窗权限。
   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函数出错啦




### AppOpsManager Android 系统权限管理 API 使用指南 #### 1. 概述 `AppOpsManager` 是 Android 提供的一个用于管理和监控应用程序操作的类。通过 `AppOpsManager`,可以控制应用执行特定的操作,如发送短信、访问网络状态等。这对于开发者来说是一个非常有用的工具,可以在运行时动态调整应用的行为。 #### 2. 获取实例 要使用 `AppOpsManager`,首先需要获得其对象实例: ```java Context context = getApplicationContext(); AppOpsManager appOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); ``` #### 3. 查询应用操作模式 可以通过调用 `checkOpNoThrow()` 方法来查询某个应用是否有权执行某项操作: ```java int opMode = appOpsManager.checkOpNoThrow(AppOpsManager.OPSTR_SEND_SMS, android.os.Process.myUid(), "com.example.app"); if (opMode == AppOpsManager.MODE_ALLOWED) { // 应用有权发送短信 } else { // 应用无权发送短信 } ``` #### 4. 设置应用操作模式 设置应用的操作模式通常由系统完成,但在某些情况下也可以通过反射机制实现。需要注意的是,这种方式可能违反 Google Play 的政策,并且在不同版本上可能会有所不同。 #### 5. 监听操作变化 为了监听应用操作的变化,可以注册一个广播接收者或者使用 `OnOpChangedListener` 接口(API Level 29 及以上支持)。当目标操作的状态发生变化时会触发回调函数。 ```java appOpsManager.startWatchingMode( AppOpsManager.OPSTR_SEND_SMS, "com.example.app", new AppOpsManager.OnOpChangedListener() { @Override public void onOpChanged(String op, String packageName) { Log.d("AppOps", "Operation changed: " + op); } }); ``` #### 6. 特殊权限处理 对于一些特殊权限,如外部存储管理 (`MANAGE_EXTERNAL_STORAGE`) 或本地 MAC 地址读取 (`LOCAL_MAC_ADDRESS`),则需遵循相应的声明方式并请求用户授权][^[^23]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值