1.创建鹰眼服务

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

2.下载demo

http://lbsyun.baidu.com/index.php?title=android-yingyan/sdkandev-download
1)Androidmanifest.xml权限,ak

<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/><uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/><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"/><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"/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/><application ><meta-data
                android:name="com.baidu.lbsapi.API_KEY"android:value="tGb2SGaEsKcG2MzxQ9jTzRxl2ZGgGTGb"/><service
                android:name="com.baidu.trace.LBSTraceService"android:enabled="true"android:exported="true"android:process=":remote"/>
</application>

2)加入库jar和so
把so库libBaiduMapSDK_base_v4_2_1.so,libBaiduMapSDK_map_v4_2_1.so
libBaiduTraceSDK_v3_0_7.so放入libs/armeabi目录下
jar包BaiduLBS_Android.jar,BaiduTraceSDK_V3_0_7.jar
bos-android-sdk-1.0.3.jar,okhttp-3.8.1.jar,okio-1.13.0.jar放入libs目录下
在build.gradle里添加

 sourceSets {main {jniLibs.srcDir 'libs'}}

3)TrackApplication.java
添加service_id
com.baidu.track目录下的TrackApplication.java

    /*** 轨迹服务ID*/public long serviceId = 158542;// 初始化轨迹服务客户端LBSTraceClient mClient = new LBSTraceClient(mContext);// 初始化轨迹服务Trace mTrace mTrace = new Trace(serviceId, entityName);

4)TracingActivity.java轨迹追踪
com.baidu.track.activity
//开启鹰眼服务,启动鹰眼 service
trackApp.mClient.startTrace(trackApp.mTrace, traceListener);
开启轨迹采集,启动轨迹追踪。至此,正式开启轨迹追踪
trackApp.mClient.startGather(traceListener)
5)结束轨迹追踪
停止轨迹服务:此方法将同时停止轨迹服务和轨迹采集,完全结束鹰眼轨迹服务。
若需再次启动轨迹追踪,需重新启动服务和轨迹采集
trackApp.mClient.stopTrace(trackApp.mTrace, traceListener);
停止轨迹采集:此方法将停止轨迹采集,但不停止轨迹服务(即,不再采集轨迹点了,但鹰眼 service 还存活)。
若需再次启动轨迹追踪,直接调用mTraceClient.startGather()方法开启轨迹采集即可,无需再次启动轨迹服务。此方式可应用于频繁中断轨迹追踪的场景,可避免频繁启动服务
trackApp.mClient.stopGather(traceListener);

3.服务保活

Android系统对应用长时间运行的要求日趋严格,轨迹追踪应用可能会被系统杀死,导致轨迹上传不完整
参考:http://lbsyun.baidu.com/index.php?title=android-yingyan/guide/tracelive

4.Android 鹰眼 后台启动轨迹追踪采集

直接通过Service后台运行采集gps数据

public class TrackService extends Service {/*** 轨迹客户端*/public LBSTraceClient mClient = null;/*** 轨迹服务*/public Trace mTrace = null;/*** 轨迹服务ID*/public long serviceId = 158542;/*** Entity标识*/public String entityName = "LYY";//定位周期单位秒int gatherInterval = 5;//打包回传周期,单位秒int packInterval = 10;/*** 轨迹服务监听器*/private OnTraceListener traceListener = null;private LocRequest locRequest = null;private PowerManager.WakeLock wakeLock = null;private TrackReceiver trackReceiver = null;private PowerManager powerManager = null;static class RealTimeHandler extends Handler {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);}}public TrackService() {}@Overridepublic IBinder onBind(Intent intent) {throw new UnsupportedOperationException("Not yet implemented");}@Overridepublic void onCreate() {super.onCreate();Log.i("bshui","service---onCreate-------");//1.初始化轨迹服务// 初始化轨迹服务客户端mClient = new LBSTraceClient(getApplicationContext());// 初始化轨迹服务mTrace  = new Trace(serviceId, entityName);//2.设置定位和回传周期//自定义定位频率和打包回传频率,频率可设置范围为:2~300秒。// 例如:定位频率为5s,打包回传频率为10s,则2次定位后打包回传一次mClient.setInterval(gatherInterval,packInterval);//3)开启轨迹追踪//开启鹰眼服务,启动鹰眼 servicemClient.startTrace(mTrace,traceListener);//开启轨迹采集,启动轨迹追踪。至此,正式开启轨迹追踪mClient.startGather(traceListener);powerManager = (PowerManager)this.getSystemService(Context.POWER_SERVICE);traceListener = new OnTraceListener(){/*** 绑定服务回调接口* @param i 状态码* @param s 消息0,成功,1失败*/@Overridepublic void onBindServiceCallback(int i, String s) {Log.i("bshui","onBindServiceCallback errorNo:"+i+" message"+s);}/*** 开启服务回调接口* @param i 状态码* @param s 消息*                <pre>10000:请求发送失败</pre>*                <pre>10001:服务开启失败</pre>*                <pre>10002:参数错误</pre>*                <pre>10003:网络连接失败</pre>*                <pre>10004:网络未开启</pre>*                <pre>10005:服务正在开启</pre>*                <pre>10006:服务已开启</pre>*/@Overridepublic void onStartTraceCallback(int i, String s) {if(i==0 || i>=10003){//注册广播(电源锁,GPS状态)if (null == wakeLock) {wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "track upload");}if (null == trackReceiver) {trackReceiver = new TrackReceiver(wakeLock);}IntentFilter filter = new IntentFilter();filter.addAction(Intent.ACTION_SCREEN_OFF);filter.addAction(Intent.ACTION_SCREEN_ON);filter.addAction(Intent.ACTION_USER_PRESENT);filter.addAction(StatusCodes.GPS_STATUS_ACTION);getApplication().registerReceiver(trackReceiver, filter);}Log.i("bshui","onStartTraceCallback errorNo:"+i+" message"+s);}/*** 停止服务回调接口* @param i 状态码* @param s 消息*                <p>*                <pre>0:成功</pre>*                <pre>11000:请求发送失败</pre>*                <pre>11001:服务停止失败</pre>*                <pre>11002:服务未开启</pre>*                <pre>11003:服务正在停止</pre>*/@Overridepublic void onStopTraceCallback(int i, String s) {if(i==0 || i==11004){getApplication().unregisterReceiver(trackReceiver);}Log.i("bshui","onStopTraceCallback errorNo:"+i+" message"+s);}@Overridepublic void onStartGatherCallback(int i, String s) {Log.i("bshui","onStartGatherCallback errorNo:"+i+" message"+s);}@Overridepublic void onStopGatherCallback(int i, String s) {Log.i("bshui","onStopGatherCallback errorNo:"+i+" message"+s);}@Overridepublic void onInitBOSCallback(int i, String s) {Log.i("bshui","onInitBOSCallback:errorNo:"+i+" message:"+s);}@Overridepublic void onPushCallback(byte b, PushMessage pushMessage) {}};// 在Android 6.0及以上系统,若定制手机使用到doze模式,请求将应用添加到白名单。if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {String packageName = getApplicationContext().getPackageName();boolean isIgnoring = powerManager.isIgnoringBatteryOptimizations(packageName);if (!isIgnoring) {Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);intent.setData(Uri.parse("package:" + packageName));try {startActivity(intent);} catch (Exception ex) {ex.printStackTrace();}}}}@Overridepublic void onDestroy() {super.onDestroy();//开启鹰眼服务,启动鹰眼 servicemClient.startTrace(mTrace,traceListener);//开启轨迹采集,启动轨迹追踪。至此,正式开启轨迹追踪mClient.startGather(traceListener);}
}

5.轨迹查询和实时监控

public class MainActivity extends AppCompatActivity {private MapView mapView = null;private BaiduMap mBaiduMap = null;private MapStatus mapStatus = null;private Marker mMoveMarker = null;private Button btSearch;private Button btTrack;private boolean isTrack=true;/*** 路线覆盖物*/public Overlay polylineOverlay = null;private AtomicInteger mSequenceGenerator = new AtomicInteger();/*** 轨迹点集合*/private List<LatLng> trackPoints = new ArrayList<>();/*** 历史轨迹请求*/private HistoryTrackRequest historyTrackRequest = new HistoryTrackRequest();/*** 轨迹客户端*/public LBSTraceClient mClient = null;/*** 轨迹服务*/public Trace mTrace = null;/*** 轨迹服务ID*/public long serviceId = 158542;/*** Entity标识*/public String entityName = "LYY"; //LYY/*** 轨迹监听器(用于接收历史轨迹回调)*/private OnTrackListener mTrackListener = null;//定位周期单位秒int gatherInterval = 5;//打包回传周期,单位秒int packInterval = 10;//开始时间(Unix时间戳)int startTime = (int) (System.currentTimeMillis() / 1000 - 12 * 60 * 60);//结束时间(Unix时间戳)int endTime = (int) (System.currentTimeMillis() / 1000);//分页大小int pageSize = 1000;//分页索引int pageIndex = 1;private LocRequest locRequest = null;static class RealTimeHandler extends Handler {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);}}/*** 实时定位任务*/private RealTimeHandler realTimeHandler = new RealTimeHandler();private RealTimeLocRunnable realTimeLocRunnable = null;//Entity 监听器OnEntityListener entityListener = new OnEntityListener() {@Overridepublic void onReceiveLocation(TraceLocation traceLocation) {super.onReceiveLocation(traceLocation);if(isTrack) {double latitude = traceLocation.getLatitude();double longitude = traceLocation.getLongitude();LatLng currentLatLng = new LatLng(latitude, longitude);setMapStatus(currentLatLng, 17.0f);addMarker(currentLatLng);}}};class RealTimeLocRunnable implements Runnable {private int interval = 0;public RealTimeLocRunnable(int interval) {this.interval = interval;}@Overridepublic void run() {mClient.queryRealTimeLoc(locRequest, entityListener);realTimeHandler.postDelayed(this, interval * 1000);}}/*** 实时定位任务*/public void startRealTimeLoc(int interval){realTimeLocRunnable = new RealTimeLocRunnable(interval);realTimeHandler.post(realTimeLocRunnable);}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);SDKInitializer.initialize(getApplicationContext());setContentView(R.layout.activity_main);btSearch = (Button)findViewById(R.id.btSearch);btTrack  = (Button)findViewById(R.id.btTrack);mapView = (MapView)findViewById(R.id.track_query_mapView);mBaiduMap = mapView.getMap();mBaiduMap.setMyLocationEnabled(true);//1.初始化轨迹服务// 初始化轨迹服务客户端mClient = new LBSTraceClient(getApplicationContext());// 初始化轨迹服务mTrace  = new Trace(serviceId, entityName);locRequest = new LocRequest(serviceId);//查询实时定位位置startRealTimeLoc(packInterval);//隐藏左下角的logoView child = mapView.getChildAt(1);if(child !=null){child.setVisibility(View.INVISIBLE);}//查询轨迹,时间设置为最近12小时btSearch.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {isTrack = false;queryHistoryTrack();}});btTrack.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {mBaiduMap.clear();mMoveMarker=null;isTrack = true;}});mTrackListener = new OnTrackListener(){@Overridepublic void onHistoryTrackCallback(HistoryTrackResponse response) {int total = response.getTotal();if(total == 0){Toast.makeText(getApplicationContext(),"没有查到轨迹",Toast.LENGTH_LONG).show();}else{List<TrackPoint> points = response.getTrackPoints();if(null != points){for(TrackPoint trackPoint : points){double latitude = trackPoint.getLocation().getLatitude();//采集点集合trackPoints.add(convertTrace2Map(trackPoint.getLocation()));}}if(total > pageSize*pageIndex ){historyTrackRequest.setPageIndex(++pageIndex);queryHistoryTrack();}else{//SortType:轨迹排序规则drawHistoryTrack(trackPoints,SortType.asc);}}}};}/*** 将轨迹坐标对象转换为地图坐标对象** @param traceLatLng** @return*/public static LatLng convertTrace2Map(com.baidu.trace.model.LatLng traceLatLng) {return new LatLng(traceLatLng.latitude, traceLatLng.longitude);}/*** 获取请求标识** @return*/public int getTag() {return mSequenceGenerator.incrementAndGet();}/*** 初始化请求公共参数** @param request*/public void initRequest(BaseRequest request) {request.setTag(getTag());request.setServiceId(serviceId);}/*** 查询历史轨迹*/private void queryHistoryTrack() {initRequest(historyTrackRequest);historyTrackRequest.setEntityName(entityName);historyTrackRequest.setStartTime(startTime);historyTrackRequest.setEndTime(endTime);historyTrackRequest.setPageIndex(pageIndex);historyTrackRequest.setPageSize(pageSize);// 设置需要纠偏historyTrackRequest.setProcessed(true);// 创建纠偏选项实例ProcessOption processOption = new ProcessOption();// 设置需要去噪processOption.setNeedDenoise(true);// 设置需要抽稀processOption.setNeedVacuate(true);// 设置需要绑路processOption.setNeedMapMatch(true);// 设置精度过滤值(定位精度大于100米的过滤掉)processOption.setRadiusThreshold(100);// 设置交通方式为驾车processOption.setTransportMode(TransportMode.driving);// 设置纠偏选项historyTrackRequest.setProcessOption(processOption);// 设置里程填充方式为驾车historyTrackRequest.setSupplementMode(SupplementMode.driving);mClient.queryHistoryTrack(historyTrackRequest, mTrackListener);}public void setMapStatus(LatLng point, float zoom) {MapStatus.Builder builder = new MapStatus.Builder();mapStatus = builder.target(point).zoom(zoom).build();mBaiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(mapStatus));}/*** 添加地图覆盖物*/public void addMarker(LatLng currentPoint) {if (null == mMoveMarker) {OverlayOptions overlayOptions = new MarkerOptions().position(currentPoint).icon(BitmapDescriptorFactory.fromResource(R.mipmap.icon_point)).draggable(true);mMoveMarker = (Marker) mBaiduMap.addOverlay(overlayOptions);return;}mMoveMarker.setPosition(currentPoint);}public void animateMapStatus(List<LatLng> points) {if (null == points || points.isEmpty()) {return;}LatLngBounds.Builder builder = new LatLngBounds.Builder();for (LatLng point : points) {builder.include(point);}MapStatusUpdate msUpdate = MapStatusUpdateFactory.newLatLngBounds(builder.build());mBaiduMap.animateMapStatus(msUpdate);}public void animateMapStatus(LatLng point, float zoom) {MapStatus.Builder builder = new MapStatus.Builder();mapStatus = builder.target(point).zoom(zoom).build();mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(mapStatus));}/*** 绘制历史轨迹*/public void drawHistoryTrack(List<LatLng> points, SortType sortType) {// 绘制新覆盖物前,清空之前的覆盖物mBaiduMap.clear();if (points == null || points.size() == 0) {if (null != polylineOverlay) {polylineOverlay.remove();polylineOverlay = null;}return;}if (points.size() == 1) {OverlayOptions startOptions = new MarkerOptions().position(points.get(0)).icon(BitmapDescriptorFactory.fromResource(R.mipmap.icon_start)).zIndex(9).draggable(true);mBaiduMap.addOverlay(startOptions);animateMapStatus(points.get(0), 16.0f);return;}LatLng startPoint;LatLng endPoint;if (sortType == SortType.asc) {startPoint = points.get(0);endPoint = points.get(points.size() - 1);} else {startPoint = points.get(points.size() - 1);endPoint = points.get(0);}// 添加起点图标OverlayOptions startOptions = new MarkerOptions().position(startPoint).icon(BitmapDescriptorFactory.fromResource(R.mipmap.icon_start)).zIndex(9).draggable(true);// 添加终点图标OverlayOptions endOptions = new MarkerOptions().position(endPoint).icon(BitmapDescriptorFactory.fromResource(R.mipmap.icon_end)).zIndex(9).draggable(true);// 添加路线(轨迹)OverlayOptions polylineOptions = new PolylineOptions().width(10).color(Color.BLUE).points(points);mBaiduMap.addOverlay(startOptions);mBaiduMap.addOverlay(endOptions);polylineOverlay = mBaiduMap.addOverlay(polylineOptions);OverlayOptions markerOptions =new MarkerOptions().flat(true).anchor(0.5f, 0.5f).icon(BitmapDescriptorFactory.fromResource(R.mipmap.icon_point)).position(points.get(points.size() - 1));// .rotate((float) CommonUtil.getAngle(points.get(0), points.get(1)));mMoveMarker = (Marker) mBaiduMap.addOverlay(markerOptions);animateMapStatus(points);}
}

6.Demo

http://download.csdn.net/download/shui1025701856/10217396

Android 百度鹰眼 SDK相关推荐

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

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

  2. android 百度地图 在线建议查询,Android 百度地图 SDK v3_3_0 (五) ---POI搜索和在线建议查询功能...

    目前百度地图SDK所集成的检索服务包括:POI检索.公交信息查询.线路规划.地理编码.在线建议查询.短串分享. 本篇博客将先介绍POI检索和在线建议查询(在地图地位功能基础上实现的,还不知道定位的童靴 ...

  3. Android百度地图SDK:隐藏比例尺,隐藏百度LOGO,隐藏缩放控件

     Android百度地图SDK:隐藏(不显示)比例尺,隐藏(不显示)百度LOGO,隐藏(不显示)缩放控件 在自己的Android应用开发中使用百度地图SDK,百度会自动在MapView上添加百度的 ...

  4. baidumaptrace.php,GitHub - SignalLine/BaiduMapTrace: 百度地图运动轨迹纠偏、去噪、绑路之百度鹰眼sdk服务...

    BaiduMapTrace 百度地图运动轨迹纠偏.去噪.绑路之百度鹰眼sdk服务 轨迹大致能反应用户所经过的路劲,效果还是不错的,说明gps信号较好,精度较高. 但是除了西边的轨迹较为平滑之外,其他方 ...

  5. Android 百度地图 SDK v3.0.0 (四) 引入离线地图功能

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37758097 一直觉得地图应用支持离线地图很重要啊,我等移动2G屌丝,流量不易, ...

  6. Android百度地图SDK—地图标记

    Android百度地图SDK-地图标记 概述 正文 概述 记录Android百度地图开发过程中的一些细节 正文 /*** lat:圆心纬度* lng:圆心经度* radius:半径/米*/privat ...

  7. Android百度鹰眼轨迹

    作者:短工邦技术部 - 陈文超 百度地图之百度鹰眼轨迹使用 拿外卖配送为例,配送员从接单开始上传行驶轨迹,用户端可以实时查看配送员的行驶轨迹,对于点外卖的用户来说可以更直接地观察到自己的订单是否在配送 ...

  8. Android 百度地图 SDK v3.0.0 (一)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37729091 最近公司要把百度地图集成的项目中,于是我就研究了一天百度地图的SD ...

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

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

最新文章

  1. Python魔法函数
  2. (chap9 基于HTTP的功能追加协议) 期盼已久的http 2.0
  3. php curl rst,CURL错误:Recv失败:通过对等方重置连接 - PHP Curl
  4. java中怎样定义实数_Java Math 类中的新功能,第 1 部分: 实数
  5. python atm作业详解_python day4 作业 ATM
  6. com 对象与其基础 rcw 分开后就不能再使用_如何使用 Kubeflow 机器学习流水线
  7. 【转】ABP源码分析六:依赖注入的实现
  8. 脚踏实地,才能顶天立地!
  9. C++11范围for循环
  10. uml类图工具_三款超级轻量化制图工具!每个不超过2MB,堪称神器!
  11. CSS-Box模型--理解与整理
  12. sklearn学习笔记之开始
  13. Windows常用密码的破解方法
  14. Google Play 支付流程参考
  15. yar php使用,php的轻量级rpc框架yar
  16. matlab从无到有系列(五):基本图形图像处理功能
  17. 鸿蒙os拍摄功能,华为5G巅峰之作:屏下摄像头+鸿蒙OS+徕卡镜头 这才是华为的实力...
  18. 一个牛逼的程序员是什么样的?
  19. C# 发送邮件之QQ邮箱
  20. 5种方法计算均方位移MSD

热门文章

  1. SpringBoot实现每天给对象发送情话
  2. CSS固定格式-小垒
  3. 商城口碑颜值双高蓝牙耳机推荐,双11蓝牙耳机选购品牌排行榜
  4. matlab中 spm,使用SPM批处理在MATLAB中运行预处理
  5. 应用系统数据对接几种方案
  6. 类似于 qq发说说动态 基于原生servlet 后台方案
  7. 第三届国际金融科技论坛开幕,神州信息专家参与蓉城“论道”
  8. XLS调色面板HSSFPalette
  9. 回溯法解决n皇后问题
  10. Java求1-100的质数和