• 获取手机位置信息


            Android支持通过LocationManager、LocationListener实时获取位置信息。

            相关文档:请求位置权限  |  Android 开发者  |  Android Developers (google.cn)

    目录

    1、位置信息权限

    1.1、App申请定位权限

    1.2、检查权限授予状态

    2、LocationManager

    2.1、获取位置信息提供者

    2.2 、判断位置信息开关是否打开

    3、LocationListener

    4、获取最近一次位置信息

    5、获取接收卫星状态信息

    6、使用地理编码服务获取可读地理位置


    1、位置信息权限

    1.1、App申请定位权限

    在AndroidManifest.xml文件中增加使用权限声明:

    1. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    2. <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

    注:uses-permission需在manifest标签下一级,不可嵌套在其他标签中。

    • ACCESS_COARSE_LOCATION:大致位置
    • ACCESS_FINE_LOCATION:确切位置

    1.2、检查权限授予状态

            确定应用是否已获得权限

            ContextCompat  |  Android Developers (google.cn)

    1. // 是否获得权限
    2. if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
    3. != PackageManager.PERMISSION_GRANTED) {
    4. // 未获得权限,则申请
    5. if (shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_FINE_LOCATION)) {
    6. // 如果用户选择不开启
    7. Toast.makeText(this, "相关权限未开启,无法正常使用定位服务!", Toast.LENGTH_SHORT).show();
    8. }
    9. // 申请权限
    10. requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE);
    11. } else {
    12. // 权限已获得
    13. Toast.makeText(this, "已获得定位权限!", Toast.LENGTH_SHORT).show();
    14. // TODO 可以开始获取位置信息
    15. }

    2、LocationManager

    LocationManager  |  Android Developers (google.cn)

    LocationManager提供访问系统位置服务的方法,可以为应用提供地理定位信息。

    2.1、获取位置信息提供者

    1. LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    2. List providers = lm.getAllProviders();
    3. for (String pro : providers) {
    4. System.out.println(pro);
    5. }
    6. // 打印输出
    7. // I/System.out: passive
    8. // I/System.out: network
    9. // I/System.out: fused
    10. // I/System.out: gps

            我们使用GPS provider可以获取精确的位置信息。

    2.2 、判断位置信息开关是否打开

    1. LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    2. boolean isOpen = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);

            如果手机上打开位置服务,返回true;如果是关闭的,则返回false。

    3、LocationListener

           LocationListener  |  Android Developers (google.cn)

           LocationListener用于接收设备位置发生变化时的通知消息。

    1. // 创建监听对象
    2. LocationListener ll = new LocationListener() {
    3. // Provider的状态在可用、暂时不可用和无服务三个状态直接切换时触发此函数
    4. @Override
    5. public void onStatusChanged(String provider, int status, Bundle extras) {
    6. System.out.println("onStatusChanged");
    7. }
    8. // Provider被enable时触发此函数,比如GPS被打开
    9. @Override
    10. public void onProviderEnabled(String provider) {
    11. System.out.println("onProviderEnabled");
    12. }
    13. // Provider被disable时触发此函数,比如GPS被关闭
    14. @Override
    15. public void onProviderDisabled(String provider) {
    16. System.out.println("onProviderDisabled");
    17. }
    18. //当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发
    19. @Override
    20. public void onLocationChanged(Location location) {
    21. // 位置信息更新
    22. System.out.printf(String.format(Locale.getDefault(), "location: longitude: %f, latitude: %f, accuracy: %f, altitude: %f, alt_accuracy: %f", location.getLongitude(),
    23. location.getLatitude(), location.getAccuracy(), location.getAltitude(), location.getVerticalAccuracyMeters()));
    24. }
    25. };
    26. LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    27. // 注册监听事件,每隔1000ms,最小距离0.5米
    28. lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000L, 0.5f, ll);

            调试过程中遇到了一个问题,无论怎么操作,onLocationChanged 都不会触发。后来起身站在窗口,位置信息就可以获取了。因为在房间里调试,无法获取到GPS卫星的信息,O(∩_∩)O哈哈~ 

    4、获取最近一次位置信息

    1. LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    2. Location loc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);

    5、获取接收卫星状态信息

            GnssStatus.Callback  |  Android Developers (google.cn)

            用于接收GNSS事件

    1. GnssStatus.Callback cb = new GnssStatus.Callback() {
    2. @Override
    3. public void onStarted() {
    4. super.onStarted();
    5. }
    6. @Override
    7. public void onStopped() {
    8. super.onStopped();
    9. }
    10. @Override
    11. public void onFirstFix(int ttffMillis) {
    12. super.onFirstFix(ttffMillis);
    13. }
    14. @Override
    15. public void onSatelliteStatusChanged(@NonNull GnssStatus status) {
    16. super.onSatelliteStatusChanged(status);
    17. int count = status.getSatelliteCount(); // 卫星数量
    18. for (int i = 0; i < count; ++i) {
    19. int type = status.getConstellationType(i);
    20. switch (type) {
    21. case GnssStatus.CONSTELLATION_BEIDOU:
    22. System.out.println("Beidou");
    23. break;
    24. case GnssStatus.CONSTELLATION_GPS:
    25. System.out.println("GPS");
    26. break;
    27. case GnssStatus.CONSTELLATION_GLONASS:
    28. System.out.println("GLONASS");
    29. break;
    30. case GnssStatus.CONSTELLATION_GALILEO:
    31. System.out.println("GALILEO");
    32. break;
    33. }
    34. if (status.usedInFix(i)) {
    35. // 判断是否用于定位
    36. System.out.println("the satellite is used in fix!");
    37. }
    38. }
    39. }
    40. };
    41. LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    42. lm.registerGnssStatusCallback(cb);

    6、使用地理编码服务获取可读地理位置

            Geocoder  |  Android Developers (google.cn)

    1. Geocoder geocoder = new Geocoder(this.getApplicationContext());
    2. List
      list = null;
    3. try {
    4. list = geocoder.getFromLocation(lat, lng, 1);
    5. } catch (IOException e) {
    6. e.printStackTrace();
    7. }
    8. if (null != list) {
    9. for (Address addr : list) {
    10. System.out.println(addr.toString());
    11. }
    12. }

    可以打印出当前位置的详细信息,例如XX省XX市XXX街道。

  • 相关阅读:
    Hbase三大组件 -- Region Server、HMaster、Zookeeper 介绍
    基于Redis的分布式锁安全吗?(上)
    前端工程师面试题详解(一)
    【计算机网络】【《计算机网络·自顶向下方法(原书第7版)》笔记】第三章:运输层
    基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的条形码二维码检测系统(深度学习+UI界面+训练数据集+Python代码)
    Llama 3王者归来,可与GPT-4分庭抗礼,开源模型即将追上闭源模型了?
    PG14启动报错“max_stack_depth“ must not exceed 7680kB
    并购事件是什么?
    【力扣每日一题01】两数之和
    5 Dijkstra算法的设计--来源王英S同学
  • 原文地址:https://blog.csdn.net/zhango5/article/details/126480707