在Android应用中,往往有获取当前地理位置的需求,比如微信获取附近的人需要获取用户当前的位置,不多说,直接上例子。
public Location getLocation() { LocationManager locManger = (LocationManager) getSystemService(Context.LOCATION_SERVICE); List<String> providers_list = locManger.getAllProviders(); for (String item : providers_list) { Location loc = locManger.getLastKnownLocation(item); if (loc != null) { return loc; } } String str1 = LocationManager.GPS_PROVIDER; String str2 = LocationManager.PASSIVE_PROVIDER; String str3 = LocationManager.NETWORK_PROVIDER; return null; }
// 上面providers_list中的三个子项一般就为str1,str2,str3,这是常见的几种手机支持的定位,需要注意的是有的手机好像只支持PASSIVE_PROVIDER{我在一个项目
就是因为只写了另外两种而查不到地理位置}
// 当没有得到位置信息时,可以通过请求更新位置信息看是否能够获取位置信息
loc.requestLocationUpdates(provider, minTime, minDistance, listener);// 四个参数分别为:provider名称,请求间隔时间,更新最小距离,位置监听器
Location的一些简单用法
public void LocationMethod() {// Location常用方法简介 Location loc = getLocation(); // loc.distanceTo(Location dest);float // loc.getAltitude();double 海拔高度 // loc.getLatitude();double // loc.getLongitude();double // loc.getSpeed();float }
要想使用Location服务,还必须添加Location的权限:<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
---------------------------------------------------修改-----------------------------------------------------------------------------
最近在项目中遇到一个问题,用上述的方法并不能很好的解决定位的问题,大多数手机用上述方法可以实现定位,但在有的手机上,仍然无法定位,最后只得使用百度定位SDK进行定位才得以解决;
一、添加一个百度定位服务及权限
<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"> </service>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission> <uses-permission android:name="android.permission.INTERNET" />
二、编写实现代码
public class LocationManger { private LocationClient mLocClient; private BDLocationListener listener; private Context context; public LocationManger(Context context) { super(); this.context = context; } public void getLocation() { mLocClient = new LocationClient(context); listener = new BDLocationListener() { @Override public void onReceivePoi(BDLocation arg0) { } @Override public void onReceiveLocation(BDLocation location) { if (location != null) { Log.e("" + location.getLatitude(), "" + location.getLongitude()); mLocClient.unRegisterLocationListener(listener); } } }; mLocClient.registerLocationListener(listener); LocationClientOption option = new LocationClientOption(); option.setOpenGps(true); option.setAddrType("all");// 返回的定位结果包含地址信息 option.setCoorType("bd09ll");// 返回的定位结果是百度经纬度,默认值gcj02 option.setScanSpan(5000);// 设置发起定位请求的间隔时间为5000ms option.disableCache(true);// 禁止启用缓存定位 option.setPoiNumber(5); // 最多返回POI个数 option.setPoiDistance(1000); // poi查询距离 option.setPoiExtraInfo(true); // 是否需要POI的电话和地址等详细信息 mLocClient.setLocOption(option); mLocClient.start(); if (mLocClient != null && mLocClient.isStarted()) { mLocClient.requestLocation(); } } }
BDLocationListener接口
BDLocationListener接口有2个方法需要实现: 1.接收异步返回的定位结果,参数是BDLocation类型参数。 2.接收异步返回的POI查询结果,参数是BDLocation类型参数。在一般的程序中,只需要重写第一个方法即可,里面返回的BDLocationo类型参数包含了经纬度信息;