使用LocationManager获取定位信息

最近项目用到定位,获取经纬度的需求,在项目中使用了百度的地图的定位功能,获取到了定位信息,已经详细的地址,国家,省份,城市等,因为要用到百度的其他功能就引入的百度的包,(这里就不详细介绍百度定位了,官方文档都特别详细!),我个人感觉如果只是单独使用定位功能,我们只需要使用Android自带的就好,下面就我个人了解到介绍一下定位管理器LocationManager

    使用LocationManager的非常简单,就像我们使用其他的管理器一样,使用getSystemService()方法,参数填入Context.LOCATION_SERVICE就可以获取到LocationManager

如下:

  LocationManager systemService = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

然后可以调用getLastKnownLocation()获取到定位信息的Location的对象,参数有2个一个是LocationManager.GPS_PROVIDER,用于GPS定位,一个是LocationManager.NETWORK_PROVIDE,用于网络定位,

我们也可以使用locationManager.getProviders(true),获取一个provider的List集合,然后进行判断

如下:

 List providers = systemService.getProviders(true);
        String provider = "";
        for (int i = 0; i < providers.size(); i++) {
            if (providers.contains(LocationManager.GPS_PROVIDER)) {
                provider = LocationManager.GPS_PROVIDER;
            } else if (providers.contains(LocationManager.NETWORK_PROVIDER)) {
                provider = LocationManager.NETWORK_PROVIDER;
            }else{
                showToast("定位失败!");
            }
        }

获取Location 对象如下:

  Location location = systemService.getLastKnownLocation(provider)

这样简单的获取坐标信息就完成了.

需求总是来了又来,有很多软件现在需要实时刷新定位信息,比如墨迹天气,需要获取定位来播报天气,别担心咱还有:调用requestLocationUpdates(),一共有四个参数:1: provider(即:LocationManager.GPS_PROVIDER和LocationManager.NETWORK_PROVIDE其中之一),2:间隔多少时间(以毫秒为单位),3:定位之间的距离(以米为单位),4:定位监听器LocationListener();这个监听器一共有四个方法onLocationChanged(Location location):坐标信息的改变(一般在这里获取改变的坐标,用的最多),其他三个方法就见名知意了onStatusChanged(),onProviderEnabled(),onProviderDisabled(),具体代码如下:

 systemService.requestLocationUpdates(provider, 2000, 1, new LocationListener() {
                @Override
                public void onLocationChanged(Location location) {
                    if (location!=null){
                        LogUtils.d(location.getLatitude() + "---" + location.getLongitude());
                        loginTvLocaltion.setText(location.getLatitude() + "---" + location.getLongitude());
                    }
                }

                @Override
                public void onStatusChanged(String provider, int status, Bundle extras) {
                    LogUtils.d(provider + "---" + status+"==="+status+extras.toString());
                }

                @Override
                public void onProviderEnabled(String provider) {
                    LogUtils.d(provider + "---" );
                }

                @Override
                public void onProviderDisabled(String provider) {
                    LogUtils.d(provider + "--777-" );
                }
            });
        

整个具体代码如下:

 //使用定位管理者获取定位坐标
        MyApplication context = MyApplication.context();
        LocationManager systemService = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
        List providers = systemService.getProviders(true);
        String provider = "";
        for (int i = 0; i < providers.size(); i++) {
            if (providers.contains(LocationManager.GPS_PROVIDER)) {
                provider = LocationManager.GPS_PROVIDER;
            } else if (providers.contains(LocationManager.NETWORK_PROVIDER)) {
                provider = LocationManager.NETWORK_PROVIDER;
            }else{
                showToast("定位失败!");
            }
        }

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            return;
        }
        if (TextUtils.isEmpty(provider)){
            showToast("定位失败!");
        }else {
            Location location = systemService.getLastKnownLocation(provider);
            if (location!=null){
                LogUtils.d(location.getLatitude() + "---" + location.getLongitude());
                loginTvLocaltion.setText(location.getLatitude() + "---" + location.getLongitude());
            }
            systemService.requestLocationUpdates(provider, 2000, 1, new LocationListener() {
                @Override
                public void onLocationChanged(Location location) {
                    if (location!=null){
                        LogUtils.d(location.getLatitude() + "---" + location.getLongitude());
                        loginTvLocaltion.setText(location.getLatitude() + "---" + location.getLongitude());
                    }
                }

                @Override
                public void onStatusChanged(String provider, int status, Bundle extras) {
                    LogUtils.d(provider + "---" + status+"==="+status+extras.toString());
                }

                @Override
                public void onProviderEnabled(String provider) {
                    LogUtils.d(provider + "---" );
                }

                @Override
                public void onProviderDisabled(String provider) {
                    LogUtils.d(provider + "--777-" );
                }
            });
        }

这样我们就可以动态获取坐标了,如果想获取具体的地址,我们还可以使用反地址编码,进行获取坐标对应的地址,以及国家等等更加详细的信息

这里想请教一个问题:现在这里获取的经纬度都是小数点后6位,想获取小数点12位怎么获取?,请大神赐教!

这里关于LocationManager的使用就介绍完成了!请多指教!

你可能感兴趣的:(安卓)