最近项目用到定位,获取经纬度的需求,在项目中使用了百度的地图的定位功能,获取到了定位信息,已经详细的地址,国家,省份,城市等,因为要用到百度的其他功能就引入的百度的包,(这里就不详细介绍百度定位了,官方文档都特别详细!),我个人感觉如果只是单独使用定位功能,我们只需要使用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的使用就介绍完成了!请多指教!