欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android 快速获得当前所在地理位置(简单定位)

程序员文章站 2022-06-11 18:58:21
...

一、背景

在项目开发过程中,有时候我们可能需要用到定位功能,但是只是简单定个位,并不要求实现地图、周边、检索、路线等其他额外的功能,所以我们引入百度或者高德地图sdk就有些得不偿失了。其实如果只需要一个简单定位,Android已经为我们提供了获取经纬度的方法。

二、概述

借助Android本身的LocationManager这个类提供的方法来获取经纬度

实现起来也很简单,首先获取LocationManager的对象:

LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

其次选择要使用的位置提供器,GPS或网络定位,两种定位方式各有特点,GPS定位精度高,但是非常耗电,网络定位精度稍低,但耗电量比较小:

private String judgeProvider(LocationManager locationManager) {
        List<String> prodiverlist = locationManager.getProviders(true);
        if(prodiverlist.contains(LocationManager.NETWORK_PROVIDER)){
            return LocationManager.NETWORK_PROVIDER;//网络定位
        }else if(prodiverlist.contains(LocationManager.GPS_PROVIDER)) {
            return LocationManager.GPS_PROVIDER;//GPS定位
        }else{
            Toast.makeText(activity.getMyContext(),"没有可用的位置提供器",Toast.LENGTH_SHORT).show();
        }
        return null;
    }

最后获取包含当前位置信息(比如经度纬度)的Location对象:

public Location beginLocatioon() {
        //获得位置服务
        locationManager = activity.getLocationManager();
        provider = judgeProvider(locationManager);
        //有位置提供器的情况
        if (provider != null) {
            //为了压制getLastKnownLocation方法的警告
            if (ActivityCompat.checkSelfPermission(activity.getMyContext(), Manifest.permission.ACCESS_FINE_LOCATION)
                    != PackageManager.PERMISSION_GRANTED
                    && ActivityCompat.checkSelfPermission(activity.getMyContext(), Manifest.permission.ACCESS_COARSE_LOCATION)
                    != PackageManager.PERMISSION_GRANTED) {
                return null;
            }
            return locationManager.getLastKnownLocation(provider);
        }else{
            //不存在位置提供器的情况
            Toast.makeText(activity.getMyContext(),"不存在位置提供器的情况",Toast.LENGTH_SHORT).show();
        }
        return null;
    }

记得不要忘了添加权限,而且自 android6.0 起,app不会在安装时授予权限,而是在运行时一个一个向用户询问是否授予权限。到此,我们就可以通过上述方法获取当前位置的经纬度信息了。

<!--定位-->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

通过百度地图提供的Web服务API,进行反地理编码,将我们的经纬度转换成正常的位置信息

首先我们先登录百度地图开放平台,并创建一个服务端类型应用,其中IP白名单如果没有限制直接填写0.0.0.0/0。

Android 快速获得当前所在地理位置(简单定位)

其次查看百度地图Web服务文档提供的逆地理编码请求网址和返回的json信息,并查看当前服务是否满足自己的项目要求,因为服务配额是有限制的,例如未认证的个人用户,日配额(次)6000,分钟并发数(次/分钟)3000。

Android 快速获得当前所在地理位置(简单定位)

最后的网络请求代码我就不展示了,有兴趣的可以下载demo进行查看,本例中使用的Retrofit2.0进行的网络请求,运行结果如下:

Android 快速获得当前所在地理位置(简单定位)

源码点击下载