定位功能是否可用由定位服务和定位权限共同决定:
判断定位服务:

/**     * 手机是否开启位置服务,如果没有开启那么所有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;    }

调用时先检查权限:

/**     * 检查定位服务、权限     */    private void checkLocationPermission() {        if (!AppUtil.isLocServiceEnable(this)) {//检测是否开启定位服务            if (netErrorDialog == null || !netErrorDialog.isShowing()) {                locErrorDialog = DialogUtil.showLocErrorDialog(activity, 0);            }        } else {//检测用户是否将当前应用的定位权限拒绝            int checkResult = AppUtil.checkOp(this, 2, AppOpsManager.OPSTR_FINE_LOCATION);//其中2代表AppOpsManager.OP_GPS,如果要判断悬浮框权限,第二个参数需换成24即AppOpsManager。OP_SYSTEM_ALERT_WINDOW及,第三个参数需要换成AppOpsManager.OPSTR_SYSTEM_ALERT_WINDOW            int checkResult2 = AppUtil.checkOp(this, 1, AppOpsManager.OPSTR_FINE_LOCATION);            if (AppOpsManagerCompat.MODE_IGNORED == checkResult || AppOpsManagerCompat.MODE_IGNORED == checkResult2) {                if (netErrorDialog == null || !netErrorDialog.isShowing()) {                    locErrorDialog = DialogUtil.showLocErrorDialog(activity, 1);                }            }        }    }

如果不能使用,弹出对话框,根据1或2,判断跳转页面:

/**     * 无法定位对话框     *     * @param activity 上下文     * @param state    权限状态0,未开启服务 1,未开启权限     * @return 对话框     */    public static Dialog showLocErrorDialog(Activity activity, int state) {        Dialog locErrorDialog = new Dialog(activity, R.style.MyDialog);        View contentView = View.inflate(activity, R.layout.dialog_tip_error_loc, null);        locErrorDialog.setContentView(contentView);        locErrorDialog.setCanceledOnTouchOutside(true);        locErrorDialog.show();        TextView checkNetCancel = contentView.findViewById(R.id.tv_submit_no);        TextView checkNet = contentView.findViewById(R.id.tv_submit_yes);        checkNetCancel.setOnClickListener(view -> {            locErrorDialog.dismiss();        });        checkNet.setOnClickListener(view -> {            locErrorDialog.dismiss();            Intent intent = new Intent();            if (state == 0) {                //定位服务页面                intent.setAction(Settings.ACTION_LOCATION_SOURCE_SETTINGS);            } else {                //应用详情页面                intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);                intent.setData(Uri.parse("package:" + activity.getPackageName()));            }            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);            try {                activity.startActivity(intent);            } catch (ActivityNotFoundException ex) {                //如果页面无法打开,进入设置页面                intent.setAction(Settings.ACTION_SETTINGS);                try {                    activity.startActivity(intent);                } catch (Exception e) {                    e.printStackTrace();                }            }        });        return locErrorDialog;    }

Dialog样式:

更多相关文章

  1. Android(安卓)检测是否有ROOT权限
  2. Linux Mint下Kindle Fire调试android程序
  3. Android权限控制EasyPermissions
  4. android 注册成功后返回账号和密码到登录界面,精辟讲解
  5. android 打开GPS的几种方式
  6. Android(安卓)Dialog 应用
  7. Set Positive|Neutral|Negative Button disabled in AlertDialog
  8. Android中Intent的用法
  9. Android之类似于黑名单的短信拦截

随机推荐

  1. Android(安卓)keytool 生成证书MD5指纹
  2. Android(安卓)应用指定浏览器开发实例
  3. TableLayout
  4. android 用UDP做的心跳连接 小示例
  5. android 圆环图形的实现
  6. Android中蓝牙使用步骤小结
  7. android获取手机中的短信和,android获取
  8. Android(安卓)中文API (66) —— Bluetooth
  9. android单元测试Test run failed: Unable
  10. Android(安卓)自定义标题栏(title栏)