使用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<String> 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<String> 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的使用就介绍完成了!请多指教!再见

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LocationManager是Android平台中的一个类,它用于获取设备的位置信息。而要获取卫星信息,则需通过该类的一些方法和接口来实现。 首先,我们需要在AndroidManifest.xml文件中添加相应的权限,即访问位置信息的权限如下: ``` <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> ``` 接下来,在代码中我们需要实例化LocationManager对象,如下所示: ``` LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); ``` 然后,我们可以通过调用locationManager的getGpsStatus方法来获取GPS状态对象: ``` GpsStatus gpsStatus = locationManager.getGpsStatus(null); ``` 得到gpsStatus对象后,我们可以调用它的方法获取卫星相关信息。例如,通过调用gpsStatus的getSatellites方法,可以获得卫星的可见性和信号强度等信息: ``` Iterable<GpsSatellite> satellites = gpsStatus.getSatellites(); for (GpsSatellite satellite : satellites) { // 获取卫星的相关信息 float snr = satellite.getSnr(); // 信噪比 int prn = satellite.getPrn(); // 卫星编号 boolean hasAlmanac = satellite.hasAlmanac(); // 是否有星历数据 boolean hasEphemeris = satellite.hasEphemeris(); // 是否有星历计算 // 其他获取卫星信息的方法 } ``` 这样,我们就可以通过LocationManager和GpsStatus对象获取到卫星的相关信息了。当然,在使用LocationManager获取卫星信息时,需要注意确保设备已经获得了GPS定位权限,并且可以接收到GPS信号。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值