Android判断定位功能是否可用的方法

 更新时间:2018年07月31日 10:05:29   作者:brave_shine  
今天小编就为大家分享一篇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判断定位功能是否可用的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 获取android4.0版本sdcard路径示例

    获取android4.0版本sdcard路径示例

    自从android4.0开始,谷歌为没有内存卡的手机模拟了一个SD卡,占用了原来的SD卡路径,并为真实的sd卡挂载到该目录的子目录,由于所挂载的目录并没有官方规范,所以命名会不同,只能通过搜索,下面是获取android4.0版本sdcard路径示例
    2014-03-03
  • flutter消息推送客户端集成方案详解

    flutter消息推送客户端集成方案详解

    这篇文章主要为大家介绍了flutter消息推送客户端集成方案详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • android自定义toast(widget开发)示例

    android自定义toast(widget开发)示例

    这篇文章主要介绍了android自定义toast(widget开发)示例,需要的朋友可以参考下
    2014-03-03
  • android项目实现带进度条的系统通知栏消息

    android项目实现带进度条的系统通知栏消息

    本篇文章主要介绍了android项目实现带进度条的系统通知栏消息,就是实现在通知栏看到下载进度。具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2016-10-10
  • Android Studio的安装及第一次启动时的配置问题

    Android Studio的安装及第一次启动时的配置问题

    这篇文章主要介绍了Android Studio的安装及第一次启动时的配置,需要的朋友可以参考下
    2019-09-09
  • Android 面试精华题目总结

    Android 面试精华题目总结

    本文主要介绍Android 面试题,这里整理了几个经典面试题,帮助大家学习相关知识,有需要的小伙伴可以参考下
    2016-09-09
  • Android自定义ImageView实现圆角功能

    Android自定义ImageView实现圆角功能

    这篇文章主要为大家详细介绍了Android自定义ImageView实现圆角功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • Android实现拍照截取和相册图片截取

    Android实现拍照截取和相册图片截取

    这篇文章主要为大家详细介绍了Android实现拍照截取和相册获取图片截取,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • 实例详解Android中JNI的使用方法

    实例详解Android中JNI的使用方法

    JNI是Java Native Interface的缩写,它提供若干的API实现Java与其他语言之间的通信,这篇文章主要给大家介绍了关于Android中JNI的使用方法,需要的朋友可以参考下
    2021-08-08
  • Android四大组件之broadcast广播详解

    Android四大组件之broadcast广播详解

    Android开发的四大组件分别是:活动(activity),用于表现功能;服务(service),后台运行服务,不提供界面呈现;广播接受者(Broadcast Receive),勇于接收广播;内容提供者(Content Provider),支持多个应用中存储和读取数据,相当于数据库,本篇着重介绍广播组件
    2022-10-10

最新评论