Android判断定位功能是否可用

来源:互联网 发布:网络投资诈骗寻求帮助 编辑:程序博客网 时间:2024/06/04 18:40

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

/**     * 手机是否开启位置服务,如果没有开启那么所有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>
原创粉丝点击