• Android定位服务关闭和定位(悬浮)等权限拒绝的判断


      public void checkLocationPermission() {
            if (!PermissionHelper.isLocServiceEnable(this)) {//检测是否开启定位服务
                DlgUtils.showLocServiceDialog(this);
            } else {//检测用户是否将当前应用的定位权限拒绝
                int checkResult = PermissionHelper.checkOp(this, 2, AppOpsManager.OPSTR_FINE_LOCATION);//其中2代表AppOpsManager.OP_GPS,如果要判断悬浮框权限,第二个参数需换成24即AppOpsManager。OP_SYSTEM_ALERT_WINDOW及,第三个参数需要换成AppOpsManager.OPSTR_SYSTEM_ALERT_WINDOW
                int checkResult2 = PermissionHelper.checkOp(this, 1, AppOpsManager.OPSTR_FINE_LOCATION);
                if (AppOpsManagerCompat.MODE_IGNORED == checkResult || AppOpsManagerCompat.MODE_IGNORED == checkResult2) {
                    DlgUtils.showLocIgnoredDialog(this);
                }
            }
        }
    DlgUtils.java代码如下
    /**
         * 显示定位服务未开启确认对话框
         */
        public static void showLocServiceDialog(final Context context) {
            new AlertDialog.Builder(context).setTitle("手机未开启位置服务")
                    .setMessage("请在 设置-位置信息 (将位置服务打开))")
                    .setNegativeButton("取消", null)
                    .setPositiveButton("去设置", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            Intent intent = new Intent();
                            intent.setAction(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            try {
                                context.startActivity(intent);
                            } catch (ActivityNotFoundException ex) {
                                intent.setAction(Settings.ACTION_SETTINGS);
                                try {
                                    context.startActivity(intent);
                                } catch (Exception e) {
                                    e.printStackTrace();
                                }
                            }
                        }
                    })
                    .show();
        }
    
        /**
         * 显示定位权限被拒绝对话框
         */
        public static void showLocIgnoredDialog(final Context context) {
            AlertDialog.Builder builder = new AlertDialog.Builder(context);
            builder.setIcon(R.mipmap.ic_launcher);
            builder.setTitle("手机已关闭位置权限");
            builder.setMessage("请在 设置-应用权限 (将位置权限打开))");
    
            //监听下方button点击事件
            builder.setPositiveButton("去设置", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    Intent localIntent = new Intent();
                    localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    if (Build.VERSION.SDK_INT >= 9) {
                        localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
                        localIntent.setData(Uri.fromParts("package", getPackageName(), null));
                    } else if (Build.VERSION.SDK_INT <= 8) {
                        localIntent.setAction(Intent.ACTION_VIEW);
                        localIntent.setClassName("com.android.settings", "com.android.settings.InstalledAppDetails");
                        localIntent.putExtra("com.android.settings.ApplicationPkgName", getPackageName());
                    }
                    context.startActivity(localIntent);
                }
            });
            builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    dialogInterface.dismiss();
                }
            });
    
            //设置对话框是可取消的
            builder.setCancelable(true);
            final AlertDialog dialog = builder.create();
            dialog.show();
        }
    PermissionHelper.java类如下:
    /**
         * 手机是否开启位置服务,如果没有开启那么所有app将不能使用定位功能
         */
        public static boolean isLocServiceEnable(Context context) {
            LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
            boolean gps = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
            boolean network = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
            if (gps || network) {
                return true;
            }
            return false;
        }
    
        /**
         * 检查权限列表
         *
         * @param context
         * @param op
         * 这个值被hide了,去AppOpsManager类源码找,如位置权限  AppOpsManager.OP_GPS==2
         * @param opString
         *   如判断定位权限 AppOpsManager.OPSTR_FINE_LOCATION
         * @return  @see 如果返回值 AppOpsManagerCompat.MODE_IGNORED 表示被禁用了
    
         */
        public static int checkOp(Context context, int op, String opString) {
            final int version = Build.VERSION.SDK_INT;
            if (version >= 19) {
                Object object = context.getSystemService(Context.APP_OPS_SERVICE);
    //            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 (Exception e) {
                    e.printStackTrace();
                    if (Build.VERSION.SDK_INT >= 23) {
                        return AppOpsManagerCompat.noteOp(context, opString,context.getApplicationInfo().uid,
                                context.getPackageName());
                    }
    
                }
            }
            return -1;
        }
    附上一些AppOpsManage值
    /** @hide No operation specified. */
        public static final int OP_NONE = -1;
        /** @hide Access to coarse location information. */
        public static final int OP_COARSE_LOCATION = 0;
        /** @hide Access to fine location information. */
        public static final int OP_FINE_LOCATION = 1;
        /** @hide Causing GPS to run. */
        public static final int OP_GPS = 2;
        /** @hide */
        public static final int OP_VIBRATE = 3;
        /** @hide */
        public static final int OP_READ_CONTACTS = 4;
        /** @hide */
        public static final int OP_WRITE_CONTACTS = 5;
        /** @hide */
        public static final int OP_READ_CALL_LOG = 6;
        /** @hide */
        public static final int OP_WRITE_CALL_LOG = 7;
        /** @hide */
        public static final int OP_READ_CALENDAR = 8;
        /** @hide */
        public static final int OP_WRITE_CALENDAR = 9;
        /** @hide */
        public static final int OP_WIFI_SCAN = 10;
        /** @hide */
        public static final int OP_POST_NOTIFICATION = 11;
        /** @hide */
        public static final int OP_NEIGHBORING_CELLS = 12;
        /** @hide */
        public static final int OP_CALL_PHONE = 13;
        /** @hide */
        public static final int OP_READ_SMS = 14;
        /** @hide */
        public static final int OP_WRITE_SMS = 15;
        /** @hide */
        public static final int OP_RECEIVE_SMS = 16;
        /** @hide */
        public static final int OP_RECEIVE_EMERGECY_SMS = 17;
        /** @hide */
        public static final int OP_RECEIVE_MMS = 18;
        /** @hide */
        public static final int OP_RECEIVE_WAP_PUSH = 19;
        /** @hide */
        public static final int OP_SEND_SMS = 20;
        /** @hide */
        public static final int OP_READ_ICC_SMS = 21;
        /** @hide */
        public static final int OP_WRITE_ICC_SMS = 22;
        /** @hide */
        public static final int OP_WRITE_SETTINGS = 23;
        /** @hide */
        public static final int OP_SYSTEM_ALERT_WINDOW = 24;
    
     public static final String OPSTR_FINE_LOCATION =
                "android:fine_location";
     /** Read previously received cell broadcast messages. */
        public static final String OPSTR_READ_CELL_BROADCASTS
                = "android:read_cell_broadcasts";
        /** Inject mock location into the system. */
        public static final String OPSTR_MOCK_LOCATION
                = "android:mock_location";
        /** Read external storage. */
        public static final String OPSTR_READ_EXTERNAL_STORAGE
                = "android:read_external_storage";
        /** Write external storage. */
        public static final String OPSTR_WRITE_EXTERNAL_STORAGE
                = "android:write_external_storage";
        /** Required to draw on top of other apps. */
        public static final String OPSTR_SYSTEM_ALERT_WINDOW
                = "android:system_alert_window";
  • 相关阅读:
    【链表】Bzoj1098[POI2007]办公楼biu
    【构造】Bzoj1432[ZJOI2009]Function
    【Dp】Bzoj1296 [SCOI2009] 粉刷匠
    【二分贪心】Bzoj3969 [WF2013] Low Power
    【递推】Bzoj3612[Heoi2014]平衡
    HDU-3718 Similarity
    HDU-3435 A new Graph Game
    HDU-3488 Tour
    HDU-1853 Cyclic Tour
    HDU-1533 Going Home
  • 原文地址:https://www.cnblogs.com/baiyi168/p/7736648.html
Copyright © 2020-2023  润新知