久等了,鹰眼教程差点忘了写,嘿嘿,现在补上,其实鹰眼在深度运用时还是挺难搞的,会遇到很多坑,这次由于时间有限,忙里偷闲只出了一个基本功能,包含轨迹上传、历史轨迹获取及绘制,深度运用的话,如果大家有需要,我就抽时间出,没评论那就这一篇了,现在开始!
引入鹰眼的SDK
SDK下载地址:http://lbsyun.baidu.com/index.php?title=android-yingyan/sdkandev-download
下载好解压之后得到如下图的文件
将红框中的文件和文件夹统统扔进Android工程的“libs”文件夹下
获取serviceId
进入鹰眼轨迹管理台,创建一个服务,如下图
第一列就是应用的serviceId
权限
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<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.WRITE_EXTERNAL_STORAGE" >
uses-permission>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" >
uses-permission>
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" >
uses-permission>
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" >
uses-permission>
再注册一个鹰眼轨迹的服务
<service
android:name="com.baidu.trace.LBSTraceService"
android:enabled="true"
android:process=":remote" >
service>
其他的还有基本地图的初始化、AK的声明(
中),之前帖子说过。
步骤:显示地图>>>实现定位>>>开启轨迹服务>>>查询历史轨迹>>>显示历史轨迹
主要在于后三步,前两步是为显示历史轨迹服务的(实现定位那一步想省去也可以)
直接看后三步的实现方法吧
开启轨迹服务
先初始化服务和服务客户端,设置定位和打包周期
// 初始化轨迹服务
Trace mTrace = new Trace(serviceId, entityName, isNeedObjectStorage);
// 初始化轨迹服务客户端
mTraceClient = new LBSTraceClient(getApplicationContext());
// 定位周期(单位:秒)
int gatherInterval = 5;
// 打包回传周期(单位:秒)
int packInterval = 10;
// 设置定位和打包周期
mTraceClient.setInterval(gatherInterval, packInterval);
开启服务和采集
mTraceClient.startTrace(mTrace, mTraceListener);//开启服务
mTraceClient.startGather(mTraceListener);//开启采集
在开启过程中用到了轨迹服务监听器mTraceListener,实现代码:
// 初始化轨迹服务监听器
OnTraceListener mTraceListener = new OnTraceListener() {
@Override
public void onStopTraceCallback(int arg0, String arg1) {
// 停止服务回调
}
@Override
public void onStopGatherCallback(int arg0, String arg1) {
// 停止采集回调
}
@Override
public void onStartTraceCallback(int arg0, String arg1) {
// 开启服务回调
}
@Override
public void onStartGatherCallback(int arg0, String arg1) {
// 开启采集回调
}
@Override
public void onPushCallback(byte arg0, PushMessage arg1) {
// TODO Auto-generated method stub
}
};
由此已经开启了轨迹上传,由于本实例仅仅作为功能展示,在实际项目中肯定要涉及到轨迹服务的存活的问题,肯定不能像我这样直接把这些功能的实现写在某一activity下,重编译Android底层的办法我就不说了(其实我是不会,小弟才疏学浅),我说一下我之前的解决办法,写一个远程服务类,“.aidl”文件是少不了的,把对轨迹上传的相关操作放在远程服务里,但是即使是远程服务也无法保障在内存告急时候依然存活,所以仅仅是远程服务是不够了,要把服务搞成前台服务(自己百度),设置成前台服务以后能够大大提高保活率,我是这么做的,但是现在的手机都搞一键清理,直接就清掉了,两个服务通过广播相互启动也不行,一键清理直接全部杀死,我暂时还没找到更合适的办法,如果你有,请不吝赐教,拜谢!
查询历史轨迹
轨迹数据已经在服务存活时根据设置的周期上传至百度的云存储里,下面开始说如何查询已经上传的轨迹数据
private void queryHistoryTrack() {
// 结束时间
long endTime = (System.currentTimeMillis() / 1000);//初始值(可省)
long start = System.currentTimeMillis() / 1000 - 12 * 60 * 60;//初始值(可省)
endTime = getStringToDate("2017-08-28 23:59:59");//毫秒
start = getStringToDate("2017-08-28 00:00:00");//毫秒
System.out.println("开始:" + start + ",结束:" + endTime);
// 查询历史轨迹
HistoryTrackRequest htr = new HistoryTrackRequest(1, serviceId,
entityName);
htr.setServiceId(serviceId);//设置serviceId
htr.setProcessed(false);// 是否纠偏
htr.setEntityName(entityName); // entity标识
htr.setPageIndex(pageIndex);// 分页索引
htr.setPageSize(pageSize);// 分页大小
htr.setStartTime(start);// 开始时间
htr.setEndTime(endTime);// 结束时间
mTraceClient.queryHistoryTrack(htr, new OnTrackListener() {
@Override
public void onHistoryTrackCallback(HistoryTrackResponse response) {
// TODO Auto-generated method stub
super.onHistoryTrackCallback(response);
System.out.println("数量:" + response.getSize());
if (response.getSize() > 0) {//如果当前日期范围内有数据点,则准备绘制
List tp = response.getTrackPoints();// 所有点的坐标信息数据集
Point startPoint = response.getStartPoint();// 起点的坐标信息
Point endPoint = response.getEndPoint();// 终点的坐标信息
drawHistoryTrack(tp, startPoint, endPoint);// 绘制折线
}
}
});
}
查询的历史轨迹时间周期时间差要控制在24个小时之内,为了节省时间,我没有动态设置时间范围,直接写死了,在实际项目中应该有时间列表的动态选择
建议在实际运用时轮询该函数,直至获取到正确的返回数据为止,如果是持续监听当前轨迹变化,那就还有别的实现方式,这次只讲解如果单纯获取历史轨迹;在编写demo时,偷懒了一下,直接线程延迟了5秒才执行该函数,但是实际项目中不要这样
如果请求的该时间段内有轨迹数据,那么会返回一个数据集HistoryTrackResponse
显示历史轨迹
获取之后需要将轨迹点绘制在地图上,也就是绘制折线
private void drawHistoryTrack(List list_tp, Point startPoint,
Point endPoint) {
showMarker(startPoint, 0);//调用showMarker()函数标记起点
showMarker(endPoint, 1);//调用showMarker()函数标记终点
List points = new ArrayList();
//遍历轨迹坐标,装载到List
for (int i = 0; i < list_tp.size(); i++) {
points.add(new LatLng(list_tp.get(i).getLocation().getLatitude(),
list_tp.get(i).getLocation().getLongitude()));
}
// 构造对象 设置折线的宽度和颜色以及points
OverlayOptions ooPolyline = new PolylineOptions().width(10)
.color(0xAAFF0000).points(points);
// 添加到地图
mBaiduMap.addOverlay(ooPolyline);
}
有一点需要注意,如代码所示,先拿到了轨迹返回的坐标集合,后来又遍历一次,是因为轨迹服务的LatLng对象与基础地图的LatLng对象属性是不一致的,所以要重新遍历装载到基础地图sdk中定义的LatLng数据集List
中
这样就把轨迹呈现在了地图上
showMarker()函数
private void showMarker(Point point, int i) {
// 定义Maker坐标点
LatLng latlng = new LatLng(point.getLocation().getLatitude(), point
.getLocation().getLongitude());
// 构建Marker图标
BitmapDescriptor bitmap;
if (i == 0) {
bitmap = BitmapDescriptorFactory
.fromResource(R.drawable.icon_start);
} else if (i == 1) {
bitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_end);
} else {
bitmap = BitmapDescriptorFactory
.fromResource(R.drawable.icon_gcoding);
}
// 构建MarkerOption,用于在地图上添加Marker
OverlayOptions option = new MarkerOptions().position(latlng).icon(
bitmap);
// 在地图上添加Marker,并显示
mBaiduMap.addOverlay(option);
}
完毕!绘制的轨迹是否正确,直接去轨迹管理台查一下相应日期官方绘制的轨迹一对应就行了,当然啦,我这个是没有设置纠偏的,纠偏之后又是另一种形态
源码地址:http://download.csdn.net/download/qq_23931287/9956534