博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
权限管理AppOpsManager
阅读量:7158 次
发布时间:2019-06-29

本文共 7586 字,大约阅读时间需要 25 分钟。

AppOps工具类

import android.annotation.TargetApi;import android.app.AppOpsManager;import android.content.Context;import android.os.Binder;import android.os.Build;import android.util.Log;import java.lang.reflect.Method;/** * 应用程序被禁用项判断,如:是否禁止在通知栏显示通知、是否禁用悬浮窗 * DateTime:2016/6/15 23:17 * Builder:Android Studio * * @see android.app.AppOpsManager */public class AppOpsUtils {    public static final int OP_NONE = -1;    public static final int OP_COARSE_LOCATION = 0;    public static final int OP_FINE_LOCATION = 1;    public static final int OP_GPS = 2;    public static final int OP_VIBRATE = 3;    public static final int OP_READ_CONTACTS = 4;    public static final int OP_WRITE_CONTACTS = 5;    public static final int OP_READ_CALL_LOG = 6;    public static final int OP_WRITE_CALL_LOG = 7;    public static final int OP_READ_CALENDAR = 8;    public static final int OP_WRITE_CALENDAR = 9;    public static final int OP_WIFI_SCAN = 10;    public static final int OP_POST_NOTIFICATION = 11;    public static final int OP_NEIGHBORING_CELLS = 12;    public static final int OP_CALL_PHONE = 13;    public static final int OP_READ_SMS = 14;    public static final int OP_WRITE_SMS = 15;    public static final int OP_RECEIVE_SMS = 16;    public static final int OP_RECEIVE_EMERGECY_SMS = 17;    public static final int OP_RECEIVE_MMS = 18;    public static final int OP_RECEIVE_WAP_PUSH = 19;    public static final int OP_SEND_SMS = 20;    public static final int OP_READ_ICC_SMS = 21;    public static final int OP_WRITE_ICC_SMS = 22;    public static final int OP_WRITE_SETTINGS = 23;    public static final int OP_SYSTEM_ALERT_WINDOW = 24;    public static final int OP_ACCESS_NOTIFICATIONS = 25;    public static final int OP_CAMERA = 26;    public static final int OP_RECORD_AUDIO = 27;    public static final int OP_PLAY_AUDIO = 28;    public static final int OP_READ_CLIPBOARD = 29;    public static final int OP_WRITE_CLIPBOARD = 30;    public static final int OP_TAKE_MEDIA_BUTTONS = 31;    public static final int OP_TAKE_AUDIO_FOCUS = 32;    public static final int OP_AUDIO_MASTER_VOLUME = 33;    public static final int OP_AUDIO_VOICE_VOLUME = 34;    public static final int OP_AUDIO_RING_VOLUME = 35;    public static final int OP_AUDIO_MEDIA_VOLUME = 36;    public static final int OP_AUDIO_ALARM_VOLUME = 37;    public static final int OP_AUDIO_NOTIFICATION_VOLUME = 38;    public static final int OP_AUDIO_BLUETOOTH_VOLUME = 39;    public static final int OP_WAKE_LOCK = 40;    public static final int OP_MONITOR_LOCATION = 41;    public static final int OP_MONITOR_HIGH_POWER_LOCATION = 42;    public static final int OP_GET_USAGE_STATS = 43;    public static final int OP_MUTE_MICROPHONE = 44;    public static final int OP_TOAST_WINDOW = 45;    public static final int OP_PROJECT_MEDIA = 46;    public static final int OP_ACTIVATE_VPN = 47;    public static final int OP_WRITE_WALLPAPER = 48;    public static final int OP_ASSIST_STRUCTURE = 49;    public static final int OP_ASSIST_SCREENSHOT = 50;    public static final int OP_READ_PHONE_STATE = 51;    public static final int OP_ADD_VOICEMAIL = 52;    public static final int OP_USE_SIP = 53;    public static final int OP_PROCESS_OUTGOING_CALLS = 54;    public static final int OP_USE_FINGERPRINT = 55;    public static final int OP_BODY_SENSORS = 56;    public static final int OP_READ_CELL_BROADCASTS = 57;    public static final int OP_MOCK_LOCATION = 58;    public static final int OP_READ_EXTERNAL_STORAGE = 59;    public static final int OP_WRITE_EXTERNAL_STORAGE = 60;    public static final int OP_TURN_SCREEN_ON = 61;    private static final String TAG = "liyujiang";    /**    * 是否禁用通知    */    public static boolean allowNotification(Context context) {        return isAllowed(context, OP_POST_NOTIFICATION);    }    /**    * 是否禁用悬浮窗    */    public static boolean allowFloatWindow(Context context) {        return isAllowed(context, OP_SYSTEM_ALERT_WINDOW);    }    /**    * 是否禁用某项操作    */    @TargetApi(Build.VERSION_CODES.KITKAT)    public static boolean isAllowed(Context context, int op) {        Log.d(TAG, "api level: " + Build.VERSION.SDK_INT);        if (Build.VERSION.SDK_INT < 19) {            return true;        }        Log.d(TAG, "op is " + op);        String packageName = context.getApplicationContext().getPackageName();        AppOpsManager aom = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);        Class
[] types = new Class[]{
int.class, int.class, String.class}; Object[] args = new Object[]{op, Binder.getCallingUid(), packageName}; try { Method method = aom.getClass().getDeclaredMethod("checkOpNoThrow", types); Object mode = method.invoke(aom, args); Log.d(TAG, "invoke checkOpNoThrow: " + mode); if ((mode instanceof Integer) && ((Integer) mode == AppOpsManager.MODE_ALLOWED)) { Log.d(TAG, "allowed"); return true; } } catch (Exception e) { Log.e(TAG, "invoke error: " + e); e.printStackTrace(); } return false; }}

 

Activity判断

/*** 经测试,部分手机(如华为mate7、华为x1)无法识别出定位是否被禁用,禁用后总是识别为已允许,暂无解决方案。*/public class MainActivity extends FragmentActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);    }    public void onOpCheck(View view) {        String msg = "";        if (AppOpsUtils.allowNotification(this)) {            msg += "允许:显示通知到通知栏\n";        } else {            msg += "禁止:显示通知到通知栏\n";        }        if (AppOpsUtils.isAllowed(this, AppOpsUtils.OP_FINE_LOCATION)) {            msg += "允许:OP_FINE_LOCATION\n";        } else {            msg += "禁止:OP_FINE_LOCATION\n";        }        if (AppOpsUtils.isAllowed(this, AppOpsUtils.OP_COARSE_LOCATION)) {            msg += "允许:OP_COARSE_LOCATION\n";        } else {            msg += "禁止:OP_COARSE_LOCATION\n";        }        if (AppOpsUtils.isAllowed(this, AppOpsUtils.OP_GPS)) {            msg += "允许:OP_GPS\n";        } else {            msg += "禁止:OP_GPS\n";        }        if (AppOpsUtils.isAllowed(this, AppOpsUtils.OP_MONITOR_LOCATION)) {            msg += "允许:OP_MONITOR_LOCATION\n";        } else {            msg += "禁止:OP_MONITOR_LOCATION\n";        }        if (AppOpsUtils.isAllowed(this, AppOpsUtils.OP_MONITOR_HIGH_POWER_LOCATION)) {            msg += "允许:OP_MONITOR_HIGH_POWER_LOCATION\n";        } else {            msg += "禁止:OP_MONITOR_HIGH_POWER_LOCATION\n";        }        if (AppOpsUtils.isAllowed(this, AppOpsUtils.OP_READ_PHONE_STATE)) {            msg += "允许:OP_READ_PHONE_STATE\n";        } else {            msg += "禁止:OP_READ_PHONE_STATE\n";        }        if (AppOpsUtils.isAllowed(this, AppOpsUtils.OP_READ_EXTERNAL_STORAGE)) {            msg += "允许:OP_READ_EXTERNAL_STORAGE\n";        } else {            msg += "禁止:OP_READ_EXTERNAL_STORAGE\n";        }        if (AppOpsUtils.isAllowed(this, AppOpsUtils.OP_WRITE_EXTERNAL_STORAGE)) {            msg += "允许:OP_WRITE_EXTERNAL_STORAGE\n";        } else {            msg += "禁止:OP_WRITE_EXTERNAL_STORAGE\n";        }        showAlert(msg);    }    private void showAlert(String msg) {        AlertDialog dialog = new AlertDialog.Builder(this).create();        dialog.setMessage(msg);        dialog.setButton(AlertDialog.BUTTON_NEUTRAL, "确定", new DialogInterface.OnClickListener() {            @Override            public void onClick(DialogInterface dialog, int which) {                dialog.dismiss();            }        });        dialog.show();    }}

 

转载地址:http://taegl.baihongyu.com/

你可能感兴趣的文章
保卫智能手机安全,让 SSL 数字证书给你多一层安全保护
查看>>
MySQL 起停脚本
查看>>
大数据:一场改变未来的信息革命
查看>>
MAC OS X 安装、配置、启动 rabbitMQ
查看>>
解决webuploader 在chrome 浏览器反应迟钝问题
查看>>
让EditPlus支持javac,java命令[图解]
查看>>
Python初学者的一些技巧
查看>>
centos安装epel源
查看>>
想不到的异或操作。。
查看>>
理解UIApplication
查看>>
例子 /maven-service-factory-api
查看>>
iOS运行回路(RunLoop)总结
查看>>
链表crud
查看>>
GitHub Pages上写完简历后报404
查看>>
硬盘的读写原理
查看>>
eclipse svn时忽略target .project .classpath等目录文件
查看>>
告警系统主脚本、主配置文件、监控项脚本
查看>>
CSS层叠样式表之CSS解析机制的优先级及样式覆盖问题探讨
查看>>
angularjs关于controller之间如何通讯
查看>>
nodejs npm 全局安装路径和本地安装路径区别
查看>>