需求:客户端每隔5分钟采集定位坐标数据,发送到服务器。
1、导入jar包,locSDK_4.2.jar
2、在mainfest中加入权限和服务声明
<!-- 百度定位 -->
<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.ACCESS_WIFI_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
</uses-permission>
<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.READ_LOGS" >
</uses-permission>
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
服务及在百度开发者中心接入应用后得到的API——KEY
<!-- 百度定位 -->
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" >
<intent-filter>
<action android:name="com.baidu.location.service_v2.2" >
</action>
</intent-filter>
</service>
<!-- meta-data需要写在application中 -->
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="8888888888888888888" />
3、创建服务Service
使用百度定位,获取定位坐标数据,可以选择定位模式和坐标系,我使用了高精度和bd09ll百度加密经纬度的坐标系
// 定位模式,默认 高精度 其他:LocationMode.Battery_Saving低功耗
// LocationMode.Device_Sensors仅设备
private final LocationMode tempMode = LocationMode.Hight_Accuracy;
// 坐标系,默认bd09ll百度加密经纬度 其他:gcj02国测局 bd09百度加密墨卡托坐标
private final String tempcoor = "bd09ll";
<span style="white-space:pre"> BDLocation location;</span>
然后在onBind()中启动百度定位
//百度定位
mLocationClient = new LocationClient(this.getApplicationContext());
mMyLocationListener = new MyLocationListener();//监听器
mLocationClient.registerLocationListener(mMyLocationListener);
InitLocation();//初始化
mLocationClient.start();
初始化方法
private void InitLocation(){
LocationClientOption option = new LocationClientOption();
option.setLocationMode(tempMode);//设置定位模式
option.setCoorType(tempcoor);//返回的定位结果是百度经纬度,默认值gcj02
int span=5000;//定位时间间隔 ms
option.setScanSpan(span);//设置发起定位请求的间隔时间
option.setIsNeedAddress(true);//是否反地理编码
mLocationClient.setLocOption(option);
}
监听器,初始化定位对象
需求只需要采集上传,没用到监听器。如果有用户到了某个地理位置进行提醒这种需求,可以使用监听器。
public class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
//Receive Location
if(location!=null){
<span style="white-space:pre"> location=location;</span>
}
}
}
下面是服务中的定位采集方法
/**
* 采集定位信息存到数据库
*
*/
public void getLBSLocationAction() {
final String systemUserId = sp.getString(Constants.SYSTEM_USER_ID, "");
ScheduledExecutorService es = Executors.newScheduledThreadPool(1);
es.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
mLocationClient.requestLocation();
long timeSystem=System.currentTimeMillis();
String submitTime=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(timeSystem));
if(location!=null){
System.out.println(submitTime);
DataForLBSLocationBean dataForLBSLocationBean=new DataForLBSLocationBean();
dataForLBSLocationBean.setUserId(systemUserId);
dataForLBSLocationBean.setProjectId(projectId);
dataForLBSLocationBean.setLongitude(String.valueOf(location.getLongitude()));
dataForLBSLocationBean.setLatitude(String.valueOf(location.getLatitude()));
dataForLBSLocationBean.setCurrentTime(submitTime);
if(appDbHelper.isTimeExist(dataForLBSLocationBean.getUserId(),dataForLBSLocationBean.getCurrentTime())){
}else{
appDbHelper.saveLBSLocationData(dataForLBSLocationBean);
}
}
long timeSystemSecond=System.currentTimeMillis();
String submitTime2=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(timeSystemSecond));
}
}, 0, 300*1000, TimeUnit.MILLISECONDS);
}
然后使用定时线程池以同样的方式向服务器发送数据。