今天就跟大家聊聊有关怎么在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>
Android是一种基于Linux内核的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由美国Google公司和开放手机联盟领导及开发。
看完上述内容,你们对怎么在Android中判断定位功能是否可用有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。