处理一:
接入百度,高德,腾讯地图提供的获取经纬度的sdk;
优点:接入流程相对简单,不用处理网络和GPS定位的切换和获取以及各个经纬度(gcj02,bd09,wgs84)转换问题,技术相对成熟。
缺点:需要引入sdk包增加app的包的大小,存在一定的机型适配问题,
处理二:
使用Android提供的API,自己处理逻辑:
优点:增加的app大小可以接受,内部逻辑可预期,
缺点:需要自己处理网络和GPS定位的切换和获取以及各个经纬度(gcj02,bd09,wgs84)转换问题。
下面是实现自己实现API获取经纬度的代码:
1. 获取请求经纬度的权限,这里就不做详细介绍了,需要请求的权限如下
<!-- 获取位置信息需要的权限 -->
<!-- Allows an app to access approximate location. -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- Allows an app to access precise location -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
2. 获取经纬度
/**
* 获取位置首先网络 ,如果网络没有站点列表,再次获取GPS获取位置
*/
int mLatitude;
int mLongitude;
LocationManager mLocationManager;
private String mBestProvider;
private void getLocation() {
mLatitude = 0;
mLongitude = 0;
//这里可以使用Application的上下文
mLocationManager = (LocationManager)APP.getAppContext().getSystemService(Context.LOCATION_SERVICE);
//如果是同时有GPS和网络定位的权限,我这里的需求精度不是很高 先使用了网络
location = mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if (location == null) {
//试图请求GPS
location = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
// 到了这里说明,本地没有存储位置,需要重新获取一下
if (location == null) {
requestLocation();
return;
}
}
// 到这里说明当前已经获取到经纬度了,直接处理后续的转换,应用了
getAddress(location);
}
3.重新请求经纬度
private void requestLocation() {
// 这里只获取一次的的方法
// 需要更新就要使用这个方法LocationManager.requestLocationUpdates()
mLocationManager.requestSingleUpdate(LocationManager.NETWORK_PROVIDER, new LocationListener() {
@Override
public void onLocationChanged(Location location) {
// 用完将监听移除
mLocationManager.removeUpdates(this);
// 到这里说明当前已经获取到经纬度了,直接处理后续的转换,应用了
getAddress(location);
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
}, null);
}
4. 当前写的是获取过程,请求权限和坐标转换没有写,有什么错误请留言,谢谢。