热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

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

今天小编就为大家分享一篇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样式:


以上这篇Android判断定位功能是否可用的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


推荐阅读
  • 本文介绍了如何使用Java中的同步方法和同步代码块来实现两个线程的交替打印。一个线程负责打印1到52的数字,另一个线程负责打印A到Z的字母,确保输出顺序为12A34B...5152Z。 ... [详细]
  • 通过Web界面管理Linux日志的解决方案
    本指南介绍了一种利用rsyslog、MariaDB和LogAnalyzer搭建集中式日志管理平台的方法,使用户可以通过Web界面查看和分析Linux系统的日志记录。此方案不仅适用于服务器环境,还提供了详细的步骤来确保系统的稳定性和安全性。 ... [详细]
  • 本文详细探讨了 Django 的 ORM(对象关系映射)机制,重点介绍了其如何通过 Python 元类技术实现数据库表与 Python 类的映射。此外,文章还分析了 Django 中各种字段类型的继承结构及其与数据库数据类型的对应关系。 ... [详细]
  • 本文详细介绍如何在王者荣耀中设置公屏打字,包括半屏键盘的配置方法和常见问题解决技巧。 ... [详细]
  • 探讨了在有序数列中实现多种查询和修改操作的高效数据结构设计,主要使用线段树与平衡树(Treap)结合的方法。 ... [详细]
  • 深入理解T-SQL中的NULL与三值逻辑
    本文探讨了SQL Server中的三值逻辑,解释了谓词计算结果为TRUE、FALSE和UNKNOWN的规则。通过具体示例,详细说明了如何正确处理NULL值,并探讨了在不同约束条件下的行为。 ... [详细]
  • 创建项目:Visual Studio Online 入门指南
    本文介绍如何使用微软的 Visual Studio Online(VSO)创建和管理开发项目。作为一款基于云计算的开发平台,VSO 提供了丰富的工具和服务,简化了项目的配置和部署流程。 ... [详细]
  • Redis Hash 数据结构详解
    本文详细介绍了 Redis 中的 Hash 数据类型及其常用命令。Hash 类型用于存储键值对集合,支持多种操作如插入、查询、更新和删除字段值。此外,文章还探讨了 Hash 类型在实际业务场景中的应用,并提供了优化建议。 ... [详细]
  • 解决U盘安装系统后无法重启的问题
    本文详细探讨了运维新手常遇到的U盘安装系统后无法正常重启的问题,提供了从问题分析到具体解决方案的完整步骤。通过理解Boot Loader的工作原理和正确配置启动项,帮助用户顺利解决问题。 ... [详细]
  • FinOps 与 Serverless 的结合:破解云成本难题
    本文探讨了如何通过 FinOps 实践优化 Serverless 应用的成本管理,提出了首个 Serverless 函数总成本估计模型,并分享了多种有效的成本优化策略。 ... [详细]
  • 本文介绍了 Winter-1-C A + B II 问题的详细解题思路和测试数据。该问题要求计算两个大整数的和,并输出结果。我们将深入探讨如何处理大整数运算,确保在给定的时间和内存限制下正确求解。 ... [详细]
  • 本文介绍了Android开发中Intent的基本概念及其在不同Activity之间的数据传递方式,详细展示了如何通过Intent实现Activity间的跳转和数据传输。 ... [详细]
  • 本文介绍了一个用于 Android 开发的 Logcat 日志管理工具类,该类提供了默认和自定义标签的日志记录方法。通过这种方式,开发者可以更方便地管理和调试应用程序中的日志输出。 ... [详细]
  • 优化 Android 按钮状态下的背景和文本颜色变化
    本文介绍如何通过 Android 的 Selector 实现按钮在不同状态下(如按压)的背景和文本颜色动态变化。我们将详细讲解实现步骤,并提供完整的代码示例。 ... [详细]
  • 本文详细介绍超文本标记语言(HTML)的基本概念与语法结构。HTML是构建网页的核心语言,通过标记标签描述页面内容,帮助开发者创建结构化、语义化的Web页面。 ... [详细]
author-avatar
罗帅飞1
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有