作者:短工邦技术部 - 陈文超

百度地图之百度鹰眼轨迹使用
拿外卖配送为例,配送员从接单开始上传行驶轨迹,用户端可以实时查看配送员的行驶轨迹,对于点外卖的用户来说可以更直接地观察到自己的订单是否在配送过程中,不再需要一遍一遍地拨打商户电话催促。

在思考相关解决方案的时候第一个想到的是在后台不断地获取配送员的经纬度,上传到服务器,然后在用户端实时地刷新这些经纬度数据显示到地图上。这种方法虽说思路很简单,只是数据的上传与刷新,但是轨迹的准确度与定位的精准度有很大关系,如果遇到网络环境较弱等的情况,定位经纬度数据一定是东歪西扭的,显示在地图上的轨迹信息也是横七竖八的。

后台发现百度地图上线了鹰眼轨迹服务的SDK,可以实现对某个对象的轨迹追踪,并显示在百度地图上,看起来就是我们想要的功能,那我们就先来实现这个SDK的功能。

首先得在API控制台创建新的应用,应用类型为Android应用,把全部API都勾上,最近创建新的应用增加了“发布版SHA1”、“开发板SHA1”,大大方便了对于调试状态下的功能开发,以及签名上线后由于签名SHA1的改变而导致无法初始化SDK的问题。

开发版SHA1的获取:
可以在eclipse中直接查看:windows -> preferance -> android -> build

发布版SHA1的获取:
使用keytool
第1步:运行进入控制台

第2步:定位到.android文件夹下,输入cd .android

第3步:输入keytool -list -v -keystore debug.keystore,会得到三种指纹证书,选取SHA1类型的证书(密钥口令是android),例如:
其中keytool为jdk自带工具;debug.keystore为Android 签名证书文件的完整路径

创建成功后可以在控制台得到相应的AK,在工程AndroidManifest.xml需要配置该AK
使用过百度定位功能的同学就知道使用方法了

接下来到http://lbsyun.baidu.com/index.php?title=yingyan/manage
创建鹰眼服务,得到一个服务ID,用于在代码中初始化鹰眼服务

将开发包导入项目中

若使用了百度地图其他的SDK,请到http://lbsyun.baidu.com/index.php?title=androidsdk/sdkandev-download
选择下载在项目中有用到的功能,切记不要单独下载每一个SDK,否则会引起包之间的冲突,这一点被百度坑的心累。

选择下载完统一的SDK后导入相关so文件和jar,鹰眼的SDK只需要导入jar包和armeabi就可以了,x86、x86_64不需要导入,否则百度又会出现初始化失败的问题。若有使用到JPush极光推送的SDK,也只需要导入jar包和armeabi就可以了,否则也会冲突。(真感觉百度的SDK的兼容性真是让人捉急,很容易出现库与库之间的冲突(/”≡ _ ≡)/~┴┴)

接下来可以开始工程的配置了,
首页将第一步创建应用获得的AK配置到AndroidManifest.xml

<application>
<meta-data  android:name="com.baidu.lbsapi.API_KEY"  android:value="AK key" />
<serviceandroid:name="com.baidu.trace.LBSTraceService"android:enabled="true"android:exported="true" >
</service>
<service
<!-- 我们自己的轨迹服务 -->android:name="com.mcandmc.xxxxxxx.service.MyService"android:enabled="true"android:exported="false"android:process=":track" >
</service>
</application>

添加各种权限

<!-- 这个权限用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 这个权限用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!--允许程序连接到已配对的蓝牙设备-->
<uses-permission android:name="android.permission.BLUETOOTH"/>
<!--允许程序发现和配对蓝牙设备-->
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<!-- 用于读取手机当前的状态-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 访问网络,网络定位需要上网-->
<uses-permission android:name="android.permission.INTERNET" />
<!-- SD卡读取权限,用户写入离线定位数据-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!--允许应用读取低级别的系统日志文件 -->
<uses-permission android:name="android.permission.READ_LOGS" />
<!--允许访问振动设备-->
<uses-permission android:name="android.permission.VIBRATE" />
<!--屏幕保持唤醒 不锁屏-->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!--允许应用程序更改主屏幕中的设置和快捷方式-->
<uses-permission android:name="android.permission.WRITE_SETTINGS" />

核心代码

public class MyService extends Service{private static final String TAG = "MyService";// 轨迹服务protected static Trace trace = null;// 鹰眼服务ID,开发者创建的鹰眼服务对应的服务IDpublic static final long serviceId = xxxxxxxx; // 轨迹服务类型//0 : 不建立socket长连接, //1 : 建立socket长连接但不上传位置数据,//2 : 建立socket长连接并上传位置数据)private int traceType = 2;// 轨迹服务客户端public static LBSTraceClient client = null;// Entity监听器public static OnEntityListener entityListener = null;// 开启轨迹服务监听器protected OnStartTraceListener startTraceListener = null;// 停止轨迹服务监听器protected static OnStopTraceListener stopTraceListener = null;// 采集周期(单位 : 秒)private int gatherInterval = 10;// 设置打包周期(单位 : 秒)private int packInterval = 20;protected static boolean isTraceStart = false;// 手机IMEI号设置为唯一轨迹标记号,只要该值唯一,就可以作为轨迹的标识号,使用相同的标识将导致轨迹混乱private String imei;public IBinder onBind(Intent arg0) {return null;}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {if(intent != null && intent.getExtras() != null){imei= intent.getStringExtra("imei");}init();return super.onStartCommand(intent, START_STICKY, startId);}//被销毁时反注册广播接收器public void onDestroy() {super.onDestroy();stopTrace();}/*** 初始化*/private void init() {// 初始化轨迹服务客户端client = new LBSTraceClient(this);// 设置定位模式client.setLocationMode(LocationMode.High_Accuracy);// 初始化轨迹服务trace = new Trace(this, serviceId, imei, traceType);// 采集周期,上传周期client.setInterval(gatherInterval, packInterval);// 设置http请求协议类型0:http,1:httpsclient.setProtocolType(0);   // 初始化监听器initListener();// 启动轨迹上传startTrace();
}// 开启轨迹服务private void startTrace() {// 通过轨迹服务客户端client开启轨迹服务client.startTrace(trace, startTraceListener);}// 停止轨迹服务public static void stopTrace() {// 通过轨迹服务客户端client停止轨迹服务LogUtil.i(TAG, "stopTrace(), isTraceStart : " + isTraceStart);if(isTraceStart){client.stopTrace(trace, stopTraceListener);}
}// 初始化监听器private void initListener() {initOnEntityListener();// 初始化开启轨迹服务监听器initOnStartTraceListener();// 初始化停止轨迹服务监听器initOnStopTraceListener();
}/*** 初始化OnStartTraceListener*/private void initOnStartTraceListener() {// 初始化startTraceListenerstartTraceListener = new OnStartTraceListener() {// 开启轨迹服务回调接口(arg0 : 消息编码,arg1 : 消息内容,详情查看类参考)public void onTraceCallback(int arg0, String arg1) {
LogUtil.i(TAG, "开启轨迹回调接口 [消息编码 : " + arg0 + ",消息内容 : " + arg1 + "]");if (0 == arg0 || 10006 == arg0) {
isTraceStart = true;}
}// 轨迹服务推送接口(用于接收服务端推送消息,arg0 : 消息类型,arg1 : 消息内容,详情查看类参考)public void onTracePushCallback(byte arg0, String arg1) {LogUtil.i(TAG, "轨迹服务推送接口消息 [消息类型 : " + arg0 + ",消息内容 : " + arg1 + "]");}};}// 初始化OnStopTraceListenerprivate void initOnStopTraceListener() {stopTraceListener = new OnStopTraceListener() {// 轨迹服务停止成功public void onStopTraceSuccess() {LogUtil.i(TAG, "停止轨迹服务成功");isTraceStart = false;stopSelf();}// 轨迹服务停止失败(arg0 : 错误编码,arg1 : 消息内容,详情查看类参考)public void onStopTraceFailed(int arg0, String arg1) {LogUtil.i(TAG, "停止轨迹服务接口消息 [错误编码 : " + arg0 + ",消息内容 : " + arg1 + "]");}};}// 初始化OnEntityListenerprivate void initOnEntityListener() {entityListener = new OnEntityListener() {// 请求失败回调接口@Overridepublic void onRequestFailedCallback(String arg0) {method stubLooper.prepare();LogUtil.i(TAG, "entity请求失败回调接口消息 : " + arg0);Toast.makeText(getApplicationContext(), "entity请求失败回调接口消息 : " + arg0, Toast.LENGTH_SHORT).show();Looper.loop();}// 添加entity回调接口@Overridepublic void onAddEntityCallback(String arg0) {Looper.prepare();LogUtil.i(TAG, "添加entity回调接口消息 : " + arg0);Toast.makeText(getApplicationContext(), "添加entity回调接口消息 : " + arg0, Toast.LENGTH_SHORT).show();Looper.loop();}// 查询entity列表回调接口@Overridepublic void onQueryEntityListCallback(String message) {LogUtil.i(TAG, "onQueryEntityListCallback : " + message);}@Overridepublic void onReceiveLocation(TraceLocation location) {}};
}
}

在Activity中启动Servise

Intent intent = new Intent();
intent.putExtra("imei", "xxxxxx");
intent.setClass(this, MyService.class);
startService(intent);

这样APP就会在后台默默地上传轨迹啦

如果要查看轨迹是否上传成功,可以在轨迹管理台查看,至于如何实现在APP上查询配送员的轨迹将陆续在后面的文章提到。

Android百度鹰眼轨迹相关推荐

  1. Android 百度鹰眼轨迹SDK(v2.1.6)

    闲聊 看过<鹰眼追击>这部电影的读者一定对"鹰眼"这台巨无霸计算机印象深刻,如今我们能够实现自己的鹰眼. 效果图 本篇为百度地图SDK第三篇博文 第一篇实现:Andro ...

  2. 百度鹰眼轨迹后台的移植

    先来介绍下百度鹰眼轨迹吧.百度鹰眼轨迹是百度2016年开放的接口,完全免费.可实现一年内的轨迹的实时查询.当前位置查询以及驾驶行为等,给物流类的项目提供了极大的帮助.笔者在移植百度鹰眼轨迹后台时,一直 ...

  3. 百度鹰眼轨迹管理台php,百度鹰眼轨迹后台管理官方demo的web项目

    [实例简介] 百度鹰眼轨迹的官方demo,已编译成web项目 [实例截图] [核心代码] www └── www ├── LICENSE ├── README.md ├── component.jso ...

  4. php百度鹰眼,Android 百度鹰眼里程计算简单实列

    先上百度鹰眼地址http://lbsyun.baidu.com/index.php?title=android-yingyan. 基础的配置官方文档写的很清楚,但是在实际开发中却遇到很多坑.后面直接上 ...

  5. 百度鹰眼轨迹和虎鲸数据平台之浅谈

    背景 这段时间一直在研究百度地图的鹰眼轨迹平台,但是还有一个交虎鲸数据平台的东西,也是百度接口提供的,能提供海量数据存储. 那么这两者有什么区别呢? 个人见解 根据百度给出的API接口,我觉得鹰眼轨迹 ...

  6. android 百度鹰眼集成,ios 百度鹰眼集成

    百度鹰眼集成遇到的坑 下面说一下集成步骤很全 1,使用cocoapods导入百度地图的基础的SDK: pod 'BaiduMapKit' 2,登录百度地图开放平台,找到iOS的鹰眼轨迹的SDK,下载, ...

  7. Android 百度鹰眼 SDK

    1.创建鹰眼服务 进入鹰眼轨迹管理台 http://lbsyun.baidu.com/trace/admin/service 创建服务 获取到服务ID158542 2.下载demo http://lb ...

  8. Java百度鹰眼轨迹批量上传

    背景 这里,就先讲讲如何批量上传轨迹到鹰眼管理平台.我看CSDN里面很多博客都是使用移动端实时上传轨迹(前提是你有硬件设备),也有的是直接上传CVS文件到数据平台上. 而我这里,是直接使用Java代码 ...

  9. android百度地图轨迹实现,android 获取GPS经纬度在百度地图上绘制轨迹

    实现将一组GPS模块获取的经纬度数据在百度地图上绘制轨迹 1.将经纬度转换成百度地图坐标 /** * 标准的GPS经纬度坐标直接在地图上绘制会有偏移,这是测绘局和地图商设置的加密,要转换成百度地图坐标 ...

最新文章

  1. 基于 MTCNN/TensorFlow 实现人脸检测
  2. JavaScript笔记 基础知识总结2
  3. PMBOK项目管理思维导图梳理
  4. 平板电脑连接投影仪_苹果电脑如何连接投影仪 苹果Mac连接投影仪方法【详解】...
  5. python经典书籍:Python编程实战 运用设计模式、并发和程序库创建高质量程序
  6. MongoDB的C#驱动基本使用
  7. 使用php下载的文件打不开,自己用着没问题,客户用就不行?
  8. SpringBoot启动类自动包扫描 三种方式
  9. HeadFirstJava——5_编写程序
  10. 科目三: 济南章丘五号线
  11. 风云四(FY-4)气象卫星 tif文件解析成txt
  12. 信息化15年规划推动中国信息化步入深水区
  13. matlab 死区,matlab中怎么产生死区
  14. JQuery 日期选择框,精确到时分秒类型。
  15. docker搭建zabbix服务
  16. 英语口语六级模拟测试软件,2017英语六级口语考试试题及答案_英语六级口语试题及答案 doc完整版...
  17. 使用pytorch获取bert词向量
  18. VBA 关于for循环和变量的测试, for 循环的自变量i会停留在i+1,自变量会基于最新变化改变
  19. wintogo与多PE合盘
  20. 拯救iphone 6 :无法下载应用解决办法

热门文章

  1. JDO学习笔记之Sun JDO参考实现篇
  2. windows redis 后台启动
  3. dmc matlab程序,DMC信道容量迭代算法(Matalab实现)
  4. 【免费诊断】网站SEO诊断分析服务说明 - 姜成SEO博客
  5. 7-25 念数字(15 分)Java与C++
  6. 基于Singer混沌映射的麻雀搜索算法-附代码
  7. ubuntu18美化(完整版)
  8. Java学习 (基础语法)day1 前言、入门程序、常量、变量
  9. 神奇的水滴效果导航栏-BezierIndicator
  10. 5年经验Java程序员面试20天,拿下数个offer,总结出的经验感想!