1. 程式人生 > >百度地圖API基礎操作--百度鷹眼篇

百度地圖API基礎操作--百度鷹眼篇

久等了,鷹眼教程差點忘了寫,嘿嘿,現在補上,其實鷹眼在深度運用時還是挺難搞的,會遇到很多坑,這次由於時間有限,忙裡偷閒只出了一個基本功能,包含軌跡上傳、歷史軌跡獲取及繪製,深度運用的話,如果大家有需要,我就抽時間出,沒評論那就這一篇了,現在開始!

準備工作

引入鷹眼的SDK

獲取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);
    }

完畢!繪製的軌跡是否正確,直接去軌跡管理臺查一下相應日期官方繪製的軌跡一對應就行了,當然啦,我這個是沒有設定糾偏的,糾偏之後又是另一種形態

來張成品圖
這裡寫圖片描述