Android判断定位功能是否可用

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

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

<style name="MyDialog" parent="@android:style/Theme.Dialog">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:background">@color/transparent</item>
    </style>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值