版本 Android SDK v3.0.0
1. 导入文件库
在相关下载最新的库文件。将liblocSDK4.so文件拷贝到libs/armeabi目录下。将locSDK4.1.jar文件拷贝到工程的libs目录下,并在工程属性->JavaBuild Path->Libraries中选择“Add JARs”,选定locSDK4.1.jar,确定后返回。这样您就可以在程序中使用百度地理围栏SDK了。
2. 设置AndroidManifest.xml
在application标签中声明service组件,每个app拥有自己单独的定位service
<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>
<!--这个权限用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!--用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<!--获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!--这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!--用于读取手机当前的状态-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<!--写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!--访问网络,网络定位需要上网-->
<uses-permission android:name="android.permission.INTERNET"/>
<!-- SD卡读取权限,用户写入离线定位数据-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
<!--允许应用读取低级别的系统日志文件-->
<uses-permission android:name="android.permission.READ_LOGS"></uses-permission>
import相关类
importcom.baidu.location.BDLocation;
importcom.baidu.location.BDLocationListener;
importcom.baidu.location.LocationClient;
importcom.baidu.location.LocationClientOption;
importcom.baidu.location.BDNotifyListener;//假如用到位置提醒功能,需要import该类
//如果使用地理围栏功能,需要import如下类
importcom.baidu.location.BDGeofence;
importcom.baidu.location.BDLocationStatusCodes;
importcom.baidu.location.GeofenceClient;
importcom.baidu.location.GeofenceClient.OnAddBDGeofencesResultListener;
importcom.baidu.location.GeofenceClient.OnGeofenceTriggerListener;
importcom.baidu.location.GeofenceClient.OnRemoveBDGeofencesResultListener;
3. 功能类的使用
使用基本定位功能
基本定位功能指的根据用户实际需求,返回用户当前位置的基础定位服务。包含GPS和网络定位(Wi-Fi和基站定位)功能。基本定位功能同时还支持结合定位结果的反地理编码功能,离线定位,周边POI查询和位置提醒功能。
初始化LocationClient类 此处需要注意:LocationClient类必须在主线程中声明。需要Context类型的参数。
Context需要时全进程有效的context,推荐用getApplicationConext获取全进程有效的context
public LocationClient mLocationClient =null;
public BDLocationListener myListener =new MyLocationListener();
publicvoid onCreate(){
mLocationClient =new LocationClient(getApplicationContext()); //声明LocationClient类
mLocationClient.registerLocationListener( myListener ); //注册监听函数
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationMode.Hight_Accuracy);//设置定位模式
option.setCoorType("bd09ll");//返回的定位结果是百度经纬度,默认值gcj02
option.setScanSpan(5000);//设置发起定位请求的间隔时间为5000ms
option.setIsNeedAddress(true);//返回的定位结果包含地址信息
option.setNeedDeviceDirect(true);//返回的定位结果包含手机机头的方向
mLocationClient.setLocOption(option);
mLocationClient.start();
if (mLocationClient != null && mLocationClient.isStarted())
mLocationClient.requestLocation();
else
Log.d("LocSDK4", "locClient is null or not started");
}
实现BDLocationListener接口
BDLocationListener接口有2个方法需要实现: 1.接收异步返回的定位结果,参数是BDLocation类型参数。 2.接收异步返回的POI查询结果,参数是BDLocation类型参数。
publicclass MyLocationListener implements BDLocationListener {
@Override
publicvoid onReceiveLocation(BDLocation location){
if(location ==null)
return;
StringBuffer sb =newStringBuffer(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());
}elseif(location.getLocType()== BDLocation.TypeNetWorkLocation){
sb.append("\naddr : ");
sb.append(location.getAddrStr());
}
logMsg(sb.toString());
}
publicvoid onReceivePoi(BDLocation poiLocation){
//将在下个版本中去除poi功能
if(poiLocation ==null){
return;
}
StringBuffer sb =newStringBuffer(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());
}
}
BDLocation类,封装了定位SDK的定位结果,在BDLocationListener的onReceive方法中获取。通过该类用户可以获取errorcode,位置的坐标,精度半径等信息。
4. 定位类的源码
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.util.Log;
importandroid.widget.TextView;
importcom.baidu.location.BDLocation;
importcom.baidu.location.BDLocationListener;
importcom.baidu.location.LocationClient;
importcom.baidu.location.LocationClientOption;
import com.baidu.location.BDNotifyListener;//假如用到位置提醒功能,需要import该类
//如果使用地理围栏功能,需要import如下类
import com.baidu.location.BDGeofence;
import com.baidu.location.BDLocationStatusCodes;
import com.baidu.location.GeofenceClient;
import com.baidu.location.GeofenceClient.OnAddBDGeofencesResultListener;
import com.baidu.location.GeofenceClient.OnGeofenceTriggerListener;
import com.baidu.location.GeofenceClient.OnRemoveBDGeofencesResultListener;
importcom.baidu.location.LocationClientOption.LocationMode;
public classLocation_Activity extends Activity {
public LocationClient mLocationClient = null;
public BDLocationListenermyListener =newMyLocationListener();
TextView tv_content;
@Override
protected voidonCreate(Bundle savedInstanceState) {
// TODOAuto-generated method stub
super.onCreate(savedInstanceState);
tv_content=new TextView(this);
setContentView(tv_content);
mLocationClient = newLocationClient(getApplicationContext()); //声明LocationClient类
mLocationClient.registerLocationListener(myListener ); //注册监听函数
LocationClientOption option = newLocationClientOption();
option.setLocationMode(LocationMode.Hight_Accuracy);//设置定位模式
option.setCoorType("bd09ll");//返回的定位结果是百度经纬度,默认值gcj02
option.setScanSpan(5000);//设置发起定位请求的间隔时间为5000ms
option.setIsNeedAddress(true);//返回的定位结果包含地址信息
option.setNeedDeviceDirect(true);//返回的定位结果包含手机机头的方向
mLocationClient.setLocOption(option);
mLocationClient.start();
if (mLocationClient !=null&&mLocationClient.isStarted())
mLocationClient.requestLocation();
else
Log.d("LocSDK4", "locClientis null or not started");
}
public classMyLocationListener implements BDLocationListener {
@Override
public voidonReceiveLocation(BDLocation location) {
if (location== null)
return ;
StringBuffer sb = newStringBuffer(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());
}
Log.d("LocSDK4",sb.toString());
if(location.getAddrStr()!=null&& !location.getAddrStr().equals("")){
tv_content.setText(location.getAddrStr());
}
}
@Override
public voidonReceivePoi(BDLocation arg0) {
// TODOAuto-generated method stub
}
}
}
5. 需要注意的问题
5.1 <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="key"/>//key:开发者申请的key,在Application内部
5.2 关于应用签名问题请参考
http://blog.csdn.net/ywx683719/article/details/34476981