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

/*** 手机是否开启位置服务,如果没有开启那么所有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_WINDOWint 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判断定位功能是否可用相关推荐

  1. Android判断网络连接是否可用,WiFi、移动数据是否打开等

    Android判断网络连接是否可用,WiFi.移动数据是否打开等 添加权限 <uses-permission android:name="android.permission.ACCE ...

  2. android怎么判断当前网络是否可用,Android 判断当前网络是否可用简单实例

    Android 判断当前网络是否可用简单实例 用户手机当前网络可用:WIFI.2G/3G网络,用户打开与不打开网络,和是否可以用是两码事.可以使用指的是:用户打开网络了并且可以连上互联网进行上网. 首 ...

  3. Android中定位功能的判断与打开

    1.判断定位是否打开 public static boolean getGpsStatus(Context ctx){//从系统服务中获取定位管理器LocationManager lm = (Loca ...

  4. android arcgis定位,arcgis android之定位功能的示例代码

    关于定位的功能,开发,很早之前就有做过百度的定位功能.起初是有想法把百度的Loc V3.2的定位SDK整合进来用.但是终归是想法,但是知道昨天,我问技术群,里面的一位朋友就说起了百度地位SDK整合进来 ...

  5. Android判断网络连接是否可用【从新浪云搬运】

    public class NetworkUtils {public static boolean isNetWorkConnected(Context context) {// 判断网络连接是否可用i ...

  6. 转:Android判断当前网络是否可用--示例代码

    在Android平台上开发基于网络的应用,必然需要去判断当前的网络连接情况.下面的代码,作为例子,详细说明了对于当前网络情况的判断. 先看一个自己定义的应用类. 源码copy to clipboard ...

  7. Android 使用定位功能的坑

    1.oppo手机在设置定位权限为禁止后返回的检查权限值仍未true 2.使用定位时还需要一个位置服务的开启,否则不会定位成功

  8. Android开发定位

    Android开发定位功能 使用Hbuilder+uni-app+android studio开发安卓时,需要定位功能,uni-app官方指定如下: 所以需要借用高德或百度申请SDK资质,获取APPK ...

  9. android 定位功能的实现

    在Android开发其中.常常须要用到定位功能,尤其是依赖于地理位置功能的应用.非常多人喜欢使用百度地图,高德地图提供的sdk.开放API,可是在只须要经纬度,或者城市,街道地址等信息.并不须要提供预 ...

最新文章

  1. JVM(13)之 阶段回顾
  2. php伪造页面url地址,php 伪造HTTP_REFERER页面URL来源的三种方法
  3. flutter listview 滚动到底部_Flutter常用Widget详解(三)
  4. JavaScript:Browser 对象
  5. Find和FirstOrDefault()有什么区别?
  6. English Voice of Way Back Into Love
  7. 势头强劲的 Python PK 强大的 C++,究竟谁更胜一筹?
  8. tmp文件夹的默认权限
  9. antv g2字体阴影_antv/G2 v4使用遇坑之旅
  10. 身体排毒,自己就可以轻松搞定 - 生活至上,美容至尚!
  11. RAID10磁盘阵列损坏修复操作
  12. vue+elementui上传视频并回显
  13. 团队协作之 Git 提交
  14. 支付宝出安全漏洞,买了账户安全险的也要小心
  15. Excel中时间相减的实例教程
  16. 计算机科学期刊催稿,围观!520 ,最“专业”的表白方式
  17. ios android手机传照片大小,实用:Android与iOS手机互传资料小妙招
  18. 大数据的数据科学与关键技术是什么?
  19. 程序员的五层境界,你在哪一层?最后一层的,都是人生赢家
  20. 103 THREE.JS 实现局部纹理刷新

热门文章

  1. 实战hadoop海量数据处理系列:序
  2. IIS下发布mvc遇到的HTTP错误 403.14-Forbidden解决办法
  3. C语言·1个水分子的质量约为3.0*10^-23克。1夸脱水大约是950克。编写程序,输入水的夸脱数,显示水分子数量。
  4. springboot jar包变成系统服务
  5. 值得珍藏的80句话(献给想当经理和已当上经理的朋友)
  6. hdu - 6406 Taotao Picks Apples(离线+离散+技巧)
  7. DNS暴力破解工具Fierce常用命令
  8. vue-cli3.0引入高德3d动画效果方法一:
  9. 综述笔记——A Review of Vehicle Detection Techniques forIntelligent Vehicles
  10. Epic Games 三十而立:狼性团队才能打造刷屏爆款