百度地图API基础操作--百度鹰眼篇

来源:互联网 发布:网络教育统考时间报名 编辑:程序博客网 时间:2024/06/05 17:03

久等了,鹰眼教程差点忘了写,嘿嘿,现在补上,其实鹰眼在深度运用时还是挺难搞的,会遇到很多坑,这次由于时间有限,忙里偷闲只出了一个基本功能,包含轨迹上传、历史轨迹获取及绘制,深度运用的话,如果大家有需要,我就抽时间出,没评论那就这一篇了,现在开始!

准备工作

引入鹰眼的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() {            @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<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()));        }        // 构造对象 设置折线的宽度和颜色以及points        OverlayOptions 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,用于在地图上添加Marker        OverlayOptions option = new MarkerOptions().position(latlng).icon(                bitmap);        // 在地图上添加Marker,并显示        mBaiduMap.addOverlay(option);    }

完毕!绘制的轨迹是否正确,直接去轨迹管理台查一下相应日期官方绘制的轨迹一对应就行了,当然啦,我这个是没有设置纠偏的,纠偏之后又是另一种形态

源码地址:http://download.csdn.net/download/qq_23931287/9956534

来张成品图
这里写图片描述

原创粉丝点击