十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
在下载页面下载最新的库文件。将liblocSDK2.4.so文件拷贝到libs/armeabi目录下。将locSDK2.4.jar文件拷贝到工程根目录下,并在工程属性-Java Build Path-Libraries中选择“Add JARs”,选定locSDK2.4.jar,确定后返回。这样您就可以在程序中使用百度定位API了。
成都创新互联公司是专业的上思网站建设公司,上思接单;提供成都网站建设、做网站,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行上思网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
设置AndroidManifest.xml
为区分2.3版本service,需要将manifest file中的 intent filter声明为com.baidu.location.service_v2.4 在application标签中声明service组件
service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote" android:permission="android.permission.BAIDU_LOCATION_SERVICE" intent-filter action android:name="com.baidu.location.service_v2.4"/action /intent-filter/service声明使用权限
permission android:name="android.permission.BAIDU_LOCATION_SERVICE"/permissionuses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE"/uses-permissionuses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/uses-permissionuses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/uses-permissionuses-permission android:name="android.permission.ACCESS_WIFI_STATE"/uses-permissionuses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/uses-permissionuses-permission android:name="android.permission.CHANGE_WIFI_STATE"/uses-permissionuses-permission android:name="android.permission.READ_PHONE_STATE"/uses-permissionuses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/uses-permissionuses-permission android:name="android.permission.INTERNET" /uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/uses-permissionuses-permission android:name="android.permission.READ_LOGS"/uses-permissionimport相关类
import com.baidu.location.BDLocation;import com.baidu.location.BDLocationListener;import com.baidu.location.LocationClient;import com.baidu.location.LocationClientOption;import com.baidu.location.BDNotifyListener;//假如用到位置提醒功能,需要import该类功能类的使用
初始化LocationClient类
此处需要注意:LocationClient类必须在主线程中声明。需要Context类型的参数。
public LocationClient mLocationClient = null;public BDLocationListener myListener = new MyLocationListener(); public void onCreate() { mLocationClient = new LocationClient(this); //声明LocationClient类 mLocationClient.registerLocationListener( myListener ); //注册监听函数}实现BDLocationListener接口
BDLocationListener接口有2个方法需要实现:
1.接收异步返回的定位结果,参数是BDLocation类型参数。
2.接收异步返回的POI查询结果,参数是BDLocation类型参数。
public class MyLocationListenner implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { if (location == null) return ; StringBuffer sb = new StringBuffer(256); sb.append("time : "); sb.append(location.getTime()); sb.append("\nerror code : "); sb.append(location.getLocType()); sb.append("\nlatitude : "); sb.append(location.getLatitude()); sb.append("\nlontitude : "); sb.append(location.getLongitude()); sb.append("\nradius : "); sb.append(location.getRadius()); if (location.getLocType() == BDLocation.TypeGpsLocation){ sb.append("\nspeed : "); sb.append(location.getSpeed()); sb.append("\nsatellite : "); sb.append(location.getSatelliteNumber()); } else if (location.getLocType() == BDLocation.TypeNetWorkLocation){ sb.append("\naddr : "); sb.append(location.getAddrStr()); } logMsg(sb.toString()); }public void onReceivePoi(BDLocation poiLocation) { if (poiLocation == null){ return ; } StringBuffer sb = new StringBuffer(256); sb.append("Poi time : "); sb.append(poiLocation.getTime()); sb.append("\nerror code : "); sb.append(poiLocation.getLocType()); sb.append("\nlatitude : "); sb.append(poiLocation.getLatitude()); sb.append("\nlontitude : "); sb.append(poiLocation.getLongitude()); sb.append("\nradius : "); sb.append(poiLocation.getRadius()); if (poiLocation.getLocType() == BDLocation.TypeNetWorkLocation){ sb.append("\naddr : "); sb.append(poiLocation.getAddrStr()); } if(poiLocation.hasPoi()){ sb.append("\nPoi:"); sb.append(poiLocation.getPoi()); }else{ sb.append("noPoi information"); } logMsg(sb.toString()); }}设置参数
设置定位参数包括:定位模式(单次定位,定时定位),返回坐标类型,是否打开GPS等等。eg:
LocationClientOption option = new LocationClientOption();option.setOpenGps(true);option.setAddrType("detail");option.setCoorType("gcj02");option.setScanSpan(5000);option.disableCache(true);//禁止启用缓存定位option.setPoiNumber(5); //最多返回POI个数 option.setPoiDistance(1000); //poi查询距离 option.setPoiExtraInfo(true); //是否需要POI的电话和地址等详细信息 mLocClient.setLocOption(option);发起定位请求
发起定位请求。请求过程是异步的,定位结果在上面的监听函数onReceiveLocation中获取。
if (mLocClient != null mLocClient.isStarted()) mLocClient.requestLocation();else Log.d("LocSDK_2.0_Demo1", "locClient is null or not started");发起POI查询请求
发起POI查询请求。请求过程是异步的,定位结果在上面的监听函数onReceivePoi中获取。
if (mLocClient != null mLocClient.isStarted()) mLocClient.requestPoi();位置提醒使用
位置提醒最多提醒3次,3次过后将不再提醒。 假如需要再次提醒,或者要修改提醒点坐标,都可通过函数SetNotifyLocation()来实现。
//位置提醒相关代码mNotifyer = new NotifyLister();mNotifyer.SetNotifyLocation(42.03249652949337,113.3129895882556,3000,"gps");//4个参数代表要位置提醒的点的坐标,具体含义依次为:纬度,经度,距离范围,坐标系类型(gcj02,gps,bd09,bd09ll)mLocationClient.registerNotify(mNotifyer);//注册位置提醒监听事件后,可以通过SetNotifyLocation 来修改位置提醒设置,修改后立刻生效。
//BDNotifyListner实现public class NotifyLister extends BDNotifyListener{ public void onNotify(BDLocation mlocation, float distance){ mVibrator01.vibrate(1000);//振动提醒已到设定位置附近 }}
//取消位置提醒mLocationClient.removeNotifyEvent(mNotifyer);
可以参考如下内容:
使用Android自带的LocationManager和Location获取位置的时候,经常会有获取的location为null的情况,并且操作起来也不是很方便,在这个Demo里我使用了百度地图API中的定位SDK,可以一次性获取当前位置经纬度以及详细地址信息,还可以获取周边POI信息,同时可以设定位置通知点,当到达某一位置时,发出通知信息等方式来告知用户。jar包下载以及官方文档请参照:百度定位SDK,前提是需要注册百度开发者账号。
下面来看看定位的基本原理,目前,定位SDK可以通过GPS、基站、Wifi信号进行定位。基本定位流程如下图所示,当应用程序向定位SDK发起定位请求时,定位SDK会根据当前的GPS、基站、Wifi信息生成相对应的定位依据。然后定位SDK会根据定位依据来进行定位。如果需要,定位SDK会向定位服务器发送网络请求。定位服务器会根据请求的定位依据推算出对应的坐标位置,然后根据用户的定制信息,生成定位结果返回给定位SDK。
手机版百度地图定位有多种方式,有卫星定位(包括GPS)、IP定位(接入数据网络)、WIFI小区定位(接入WLAN热点),等等。上述各种定位方式只要有一种具备条件,就可以实现定位,并非必须开启GPS。
百度地图的WIFI小区定位还有个特点,就是连接WIFI时,并不需要必须接通网络,有时只要搜索到信号就可以定位。
百度地图是通过移动通信基站定位来确定当前位置所在的城市。其原理就是通过测算周围基站与手机的距离来交会估算手机的空间位置。
手机定位是指通过特定的定位技术来获取移动手机或终端用户的位置信息(经纬度坐标),在电子地图上标出被定位对象的位置的技术或服务。定位技术有两种,一种是基于GPS的定位,一种是基于移动运营网的基站的定位。基于GPS的定位方式是利用手机上的GPS定位模块将自己的位置信号发送到定位后台来实现手机定位的。基站定位则是利用基站对手机的距离的测算距离来确定手机位置的。后者不需要手机具有GPS定位能力,但是精度很大程度依赖于基站的分布及覆盖范围的大小,有时误差会超过一公里。前者定位精度较高。此外还有利用Wifi在小范围内定位的方式。
都会有误差的情况,参考如下内容解释:
基站精度为平均200米左右,视运营商基站覆盖范围而定。WIFI精度为20米左右。GPS精度最高,为10米左右(取决于芯片)。在户外,先开启GPS再进行定位,结果较准。但GPS比较费电,且在室内不可用。
另外,addr=detail 想要获取完整地址(详细到门牌号),或者addr=rough 想要获得到城市一个级别的地址(比如返回中国北京北京);
上面这段是百度官方文档里面的解释: 这个我 在做的时候基本是这种情况, 文档里面提到的 精度取决于芯片的问题,其实就是不同手机设备的差异。这个我专门做过测试,我用了5台手机测试: htc one ,三星I9118,htc t328w,红米1s,联想a820 。 这5台手机在室外同一个位置百度地图定位获取 经纬度坐标,测试结果是:
htc one 误差2-3米 有时候是0-1米 非常精确了相对来说,htc t328w 红米1s,联想 都是 15-30米左右,三星那个机型稍微差点 定位速度不仅慢,而且误差也较大 误差有时候是200多米,稳定后也是80米左右。这个稳定的意思是 ,gps初始化需要时间的,一般要2-3分钟以后,误差范围的数字会越来越小。
获取误差范围的方法是:BDLocation类下的方法 location.getRadius();//获取定位精度