百度地图API基础操作--百度鹰眼篇
久等了,鹰眼教程差点忘了写,嘿嘿,现在补上,其实鹰眼在深度运用时还是挺难搞的,会遇到很多坑,这次由于时间有限,忙里偷闲只出了一个基本功能,包含轨迹上传、历史轨迹获取及绘制,深度运用的话,如果大家有需要,我就抽时间出,没评论那就这一篇了,现在开始!
准备工作
引入鹰眼的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><!-- 这个权限用于访问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><!-- 写入扩展存储,向扩展卡写入数据,用于写入对象存储BOS数据 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" ></uses-permission><!-- 访问网络,网络定位需要上网 --><uses-permission android:name="android.permission.INTERNET" /><!-- SD卡读取权限,用于写入对象存储BOS数据 --><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" ></uses-permission><!-- 用于加快GPS首次定位 --><uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" ></uses-permission><!-- 用于Android M及以上系统,申请加入忽略电池优化白名单 --><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的声明(<application>
中),之前帖子说过。
功能实现
步骤:显示地图>>>实现定位>>>开启轨迹服务>>>查询历史轨迹>>>显示历史轨迹
主要在于后三步,前两步是为显示历史轨迹服务的(实现定位那一步想省去也可以)
直接看后三步的实现方法吧
开启轨迹服务
先初始化服务和服务客户端,设置定位和打包周期
// 初始化轨迹服务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() {@Overridepublic void onStopTraceCallback(int arg0, String arg1) {// 停止服务回调}@Overridepublic void onStopGatherCallback(int arg0, String arg1) {// 停止采集回调}@Overridepublic void onStartTraceCallback(int arg0, String arg1) {// 开启服务回调}@Overridepublic void onStartGatherCallback(int arg0, String arg1) {// 开启采集回调}@Overridepublic 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);//设置serviceIdhtr.setProcessed(false);// 是否纠偏htr.setEntityName(entityName); // entity标识htr.setPageIndex(pageIndex);// 分页索引htr.setPageSize(pageSize);// 分页大小htr.setStartTime(start);// 开始时间htr.setEndTime(endTime);// 结束时间mTraceClient.queryHistoryTrack(htr, new OnTrackListener() {@Overridepublic void onHistoryTrackCallback(HistoryTrackResponse response) {// TODO Auto-generated method stubsuper.onHistoryTrackCallback(response);System.out.println("数量:" + response.getSize());if (response.getSize() > 0) {//如果当前日期范围内有数据点,则准备绘制List<TrackPoint> tp = response.getTrackPoints();// 所有点的坐标信息数据集Point startPoint = response.getStartPoint();// 起点的坐标信息Point endPoint = response.getEndPoint();// 终点的坐标信息drawHistoryTrack(tp, startPoint, endPoint);// 绘制折线}}});}
查询的历史轨迹时间周期时间差要控制在24个小时之内,为了节省时间,我没有动态设置时间范围,直接写死了,在实际项目中应该有时间列表的动态选择
建议在实际运用时轮询该函数,直至获取到正确的返回数据为止,如果是持续监听当前轨迹变化,那就还有别的实现方式,这次只讲解如果单纯获取历史轨迹;在编写demo时,偷懒了一下,直接线程延迟了5秒才执行该函数,但是实际项目中不要这样
如果请求的该时间段内有轨迹数据,那么会返回一个数据集HistoryTrackResponse
显示历史轨迹
获取之后需要将轨迹点绘制在地图上,也就是绘制折线
private void drawHistoryTrack(List<TrackPoint> list_tp, Point startPoint,Point endPoint) {showMarker(startPoint, 0);//调用showMarker()函数标记起点showMarker(endPoint, 1);//调用showMarker()函数标记终点List<LatLng> points = new ArrayList<LatLng>();//遍历轨迹坐标,装载到List<LatLng>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()));}// 构造对象 设置折线的宽度和颜色以及pointsOverlayOptions ooPolyline = new PolylineOptions().width(10).color(0xAAFF0000).points(points);// 添加到地图mBaiduMap.addOverlay(ooPolyline);}
有一点需要注意,如代码所示,先拿到了轨迹返回的坐标集合,后来又遍历一次,是因为轨迹服务的LatLng对象与基础地图的LatLng对象属性是不一致的,所以要重新遍历装载到基础地图sdk中定义的LatLng数据集List<LatLng>
中
这样就把轨迹呈现在了地图上
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,用于在地图上添加MarkerOverlayOptions option = new MarkerOptions().position(latlng).icon(bitmap);// 在地图上添加Marker,并显示mBaiduMap.addOverlay(option);}
完毕!绘制的轨迹是否正确,直接去轨迹管理台查一下相应日期官方绘制的轨迹一对应就行了,当然啦,我这个是没有设置纠偏的,纠偏之后又是另一种形态
源码地址:http://download.csdn.net/download/qq_23931287/9956534
来张成品图
百度地图API基础操作--百度鹰眼篇相关推荐
- java 百度鹰眼sdk,百度地图API基础操作--百度鹰眼
[实例简介] 博文地址:http://blog.csdn.net/qq_23931287/article/details/77684033 [实例截图] [核心代码] 6bd90028-b72d-48 ...
- 百度地图API制作类似 百度地图的路线导航界面并实现简单的路线规划功能
之前我们讲了怎么在百度地图上设置Marker(如A点..) 和弹出框(跟随Marker的,Marker移动的时候也是会跟着移动的),接着又觉得百度地图自带的放大缩小不(fei)是(chang)很(de ...
- 安卓学习专栏——百度地图(1)获取SHA1指纹申请百度地图API Key使用百度LBS定位功能(图文保姆级)
步骤 系列文章 前言 1.前期准备 2.创建应用 3.获取发布版SHA1和开发版SHA1 3.1找到.android文件夹位置 3.2Android Studio的Terminal中cd路径 3.3输 ...
- 百度地图API—简易操作
效果图 代码 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset=" ...
- android 百度地图api密钥,Android百度地图开发获取秘钥之SHA1
最近在做一个关于百度地图的开发. 不过在正式开发之前还必须要在百度地图API官网里先申请秘钥,而在申请秘钥的过程中,就需要获取一个所谓的SHA1值. 如上所示,但是由于不是正式开发,所以以上的发布版和 ...
- 百度地图api设置html5,百度地图API详解之自定义地图类型
今天的文章主要介绍如何利用地图API实现自定义地图. 百度地图API目前默认支持两种地图类型(map type):普通图和三维图,它们分别通过常量BMAP_NORMAL_MAP和BMAP_PERSPE ...
- 经由过程百度地图API,将百度坐标转换成GPS经纬度
百度地图API中,有GPS坐标转百度坐标的功能 http://dev.baidu.com/wiki/static/map/API/examples/?v=1.2&0_6#0&6 htt ...
- 【百度地图api】前端 百度地图添加地理围栏
需求:添加教练场区域,在百度地图上选择多边形电子围栏,保存坐标: 主要参考百度地图api: 遇到的小坑:注意绘制百度地图多边形时,传入的坐标数组的结构!!! 相对来说比较简单,百度api已经很详细了. ...
- 百度地图API学习---隐藏百度版权标志
通过设置css样式来隐藏百度版权标志 如下图 通过设置 .anchorBL{display:none; } 效果如下图
最新文章
- MFC中快速应用OpenCV(转)
- systemverilog数据类型
- 微信能远程控制电脑吗_神器分享:用微信就能远程控制电脑,这款神器有些厉害...
- Mybatis(12)事务原理和自动提交设置
- quartz集群分布式(并发)部署解决方案-Spring
- 如果可以再读一次研究生
- 【总结】Apache Sentry 服务简介
- tomcat部署安装
- pip安装时ReadTimeoutError解决办法
- Nmap列举远程机器开放的端口
- wsimport命令介绍
- 商务部都在努力为直销行业创造良好的发展环境,你还在等什么?
- 【Python】pandas的使用——CSV文件、Excel文件、TXT文件之间的转换
- 《修炼——我的职场十年》 摘录
- 关于Dell r720重装系统时遇到的识别不到磁盘的问题
- 数据可视化之文本情绪(极性)分析
- 数字平原cg场景制作流程
- HTML制作点播图,基于HTML5的视频点播系统设计与实现_问答库
- 概率论基础 —— 1. 基本事件类型、运算规则,及古典概型与几何型概型
- 泛函分析--from BBS 水木清华站
热门文章
- Web端H.265播放器研发解密 1
- 【安卓学习笔记】安卓的事件处理
- Emacs Stardict
- POJ 2431 Expedition(贪心+优先队列)
- php字幕格式,如何给视频添加字幕 快速添加视频字幕|可设置文字样式、位置等...
- vue使用v-for循环ABC...英文字母
- python画图柱状图修改相邻两个柱之间的间隔
- SiO2/罗丹明B荧光杂化纳米微球/硅钼比核壳结构二氧化硅微球钼酸钙荧光粉的性能
- 【ESP32_8266_WiFi (十五)】ESP8266 OTA 操作说明
- 12v电量显示制作方法_由分立器件设计的汽车12V电池电量指示器(上) | 电子懒人的基础硬件电路图讲解...