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

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

准备工作

引入鹰眼的SDK

SDK下载地址:http://lbsyun.baidu.com/index.php?title=android-yingyan/sdkandev-download
下载好解压之后得到如下图的文件
百度地图API基础操作--百度鹰眼篇_第1张图片
将红框中的文件和文件夹统统扔进Android工程的“libs”文件夹下

获取serviceId

进入鹰眼轨迹管理台,创建一个服务,如下图
百度地图API基础操作--百度鹰眼篇_第2张图片
第一列就是应用的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

来张成品图
百度地图API基础操作--百度鹰眼篇_第3张图片

你可能感兴趣的:(Android小笔记)