Android获取当前位置经纬度(非第三方地图集成)
1 添加权限:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
或者
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
GPS定位模式权限需要第一个 网络定位模式下的权限需要第一个或者第二个
2 创建LocationManager 对象 用于管理Android的定位服务
// 获取当前位置经纬度
LocationManager locMan = (LocationManager) getSystemService(Context.LOCATION_SERVICE);// 获取的是位置服务
3 指定LocationManager的定位方法 主要有两种方式:GPS定位和网络定位
GPS定位:更加精确,但更耗电,速度稍慢。
网络定位:提供的位置信息精度差,但速度较GPS定位要迅速 ,利用基站或WiFi访问的提供近似的位置信息。
Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
LocationManager.GPS_PROVIDER为GPS定位模式
LocationManager.NETWORK_PROVIDER为网络定位模式
这里可能会提示你若用户选择拒绝打开定位服务,则要加一个permission Check判断(动态访问权限)
alt+enter 去加即可 若用户拒绝,就会return
4 获取当前位置经纬度
double lat = location.getLatitude();//获取纬度
double lng = location.getLongitude();//获取经度
private void getCurrentPosition() {
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
// 申请权限 第一个为context 第二个可以指定多个请求的权限 第三个参数为请求码
ActivityCompat.requestPermissions(this,
new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.ACCESS_COARSE_LOCATION},
GlobalVariable.ACCESS_LOCATION);
}else {
//获取所有可用的位置提供器
List<String> providers = locationManager.getProviders(true);
String locationProvider;
if(providers.contains(LocationManager.GPS_PROVIDER)){
//如果是GPS
locationProvider = LocationManager.GPS_PROVIDER;
}else if(providers.contains(LocationManager.NETWORK_PROVIDER)){
//如果是Network
locationProvider = LocationManager.NETWORK_PROVIDER;
}else{
Toast.makeText(this, "没有可用的位置提供器", Toast.LENGTH_SHORT).show();
return ;
}
// 调用getLastKnownLocation()方法获取当前的位置信息
Location location = locationManager.getLastKnownLocation(locationProvider);
if(location!=null) {
lat = location.getLatitude();//获取纬度
lng = location.getLongitude();//获取经度
LatLonPoint latLonPoint = new LatLonPoint(lat, lng);
// 地址逆解析
geocoderSearch = new GeocodeSearch(this);
geocoderSearch.setOnGeocodeSearchListener(this);
// 第一个参数表示一个Latlng(经纬度),第二参数表示范围多少米,第三个参数表示是火系坐标系还是GPS原生坐标系
RegeocodeQuery query = new RegeocodeQuery(latLonPoint, 10, GeocodeSearch.AMAP);
geocoderSearch.getFromLocationAsyn(query);
}
}
}
实际测试中发现存在一些坑:
1 定位不准确 偏差较大
2 经常会有空指针情况出现
3 当未开启GPS 然后打开了GPS再重新调用 依旧不能获取当前位置
因为他是getLastKnownLocation
因此不推荐使用该方式
还是建议通过高德地图 或者百度地图去获取 当前位置的经纬度较准确!!!