Android使用百度地圖結合GPS進行定位

jopen 11年前發布 | 106K 次閱讀 百度地圖 Android開發 移動開發

本文在上文基礎上加入GPS定位功能,實現實時定位,代碼如下:

Activity:

package com.home;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.Toast;

import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.map.MKMapViewListener;
import com.baidu.mapapi.map.MapController;
import com.baidu.mapapi.map.MapPoi;
import com.baidu.mapapi.map.MapView;
import com.baidu.platform.comapi.basestruct.GeoPoint;

public class LocationActivity extends Activity {
    /** 定義LocationManager對象 */
    private LocationManager locationManager;
    /** 定義當前Location對象 */
    private Location currentLocation;
    /** 顯示地圖的View */
    private MapView mMapView = null;
    /**
     * 用MapController完成地圖控制
     */
    private MapController mMapController = null;
    /**
     * MKMapViewListener 用于處理地圖事件回調
     */
    MKMapViewListener mMapListener = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        /**
         * 使用地圖sdk前需先初始化BMapManager. BMapManager是全局的,可為多個MapView共用,它需要地圖模塊創建前創建,
         * 并在地圖地圖模塊銷毀后銷毀,只要還有地圖模塊在使用,BMapManager就不應該銷毀
         */
        DemoApplication app = (DemoApplication) this.getApplication();
        if (app.mBMapManager == null) {
            app.mBMapManager = new BMapManager(this);
            /**
             * 如果BMapManager沒有初始化則初始化BMapManager
             */
            app.mBMapManager.init(DemoApplication.strKey,
                    new DemoApplication.MyGeneralListener());
        }
        setContentView(R.layout.main);
        init();
    }

    /**
     * 初始化
     */
    private void init() {
        // 獲取系統LocationManager服務
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        // // 從GPS獲取最近的定位信息
        currentLocation = locationManager
                .getLastKnownLocation(LocationManager.GPS_PROVIDER);
        // 綁定監聽,有4個參數
        // 參數1,設備:有GPS_PROVIDER和NETWORK_PROVIDER兩種
        // 參數2,位置信息更新周期,單位毫秒
        // 參數3,位置變化最小距離:當位置距離變化超過此值時,將更新位置信息
        // 參數4,監聽
        // 備注:對于參數2和3:若參數3不為0,則以參數3為準;若參數3為0,則通過時間來定時更新;兩者為0,則隨時刷新
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2,
                1, new LocationListener() {

                    @Override
                    public void onLocationChanged(Location location) {
                        updateMap(location);
                    }

                    @Override
                    public void onProviderDisabled(String provider) {
                        updateMap(null);
                    }

                    @Override
                    public void onProviderEnabled(String provider) {
                        updateMap(locationManager
                                .getLastKnownLocation(provider));

                    }

                    @Override
                    public void onStatusChanged(String provider, int status,
                            Bundle extras) {
                    }
                });
        initMap();
    }

    /**
     * 初始化地圖
     */
    private void initMap() {
        mMapView = (MapView) findViewById(R.id.main_bmapView);
        /**
         * 獲取地圖控制器
         */
        mMapController = mMapView.getController();
        /**
         * 設置地圖是否響應點擊事件 .
         */
        mMapController.enableClick(true);
        /**
         * 設置地圖縮放級別
         */
        mMapController.setZoom(12);
        double cLat = 39.945;
        double cLon = 116.404;
        // 如果未能定位則設置默認中心點為天安門
        GeoPoint p = new GeoPoint((int) (cLat * 1E6), (int) (cLon * 1E6));
        mMapController.setCenter(p);
        updateMap(currentLocation);
        mMapListener = new MKMapViewListener() {
            @Override
            public void onMapMoveFinish() {
                /**
                 * 在此處理地圖移動完成回調 縮放,平移等操作完成后,此回調被觸發
                 */
            }

            @Override
            public void onClickMapPoi(MapPoi mapPoiInfo) {
                /**
                 * 在此處理底圖poi點擊事件 顯示底圖poi名稱并移動至該點 設置過:
                 * mMapController.enableClick(true); 時,此回調才能被觸發
                 * 
                 */
                String title = "";
                if (mapPoiInfo != null) {
                    title = mapPoiInfo.strText;
                    Toast.makeText(LocationActivity.this, title,
                            Toast.LENGTH_SHORT).show();
                    mMapController.animateTo(mapPoiInfo.geoPt);
                }
            }

            @Override
            public void onGetCurrentMap(Bitmap b) {
                /**
                 * 當調用過 mMapView.getCurrentMap()后,此回調會被觸發 可在此保存截圖至存儲設備
                 */
            }

            @Override
            public void onMapAnimationFinish() {
                /**
                 * 地圖完成帶動畫的操作(如: animationTo())后,此回調被觸發
                 */
            }

            /**
             * 在此處理地圖加載完成事件
             */
            @Override
            public void onMapLoadFinish() {
                Toast.makeText(LocationActivity.this, "地圖加載完成",
                        Toast.LENGTH_SHORT).show();

            }
        };
        mMapView.regMapViewListener(DemoApplication.getInstance().mBMapManager,
                mMapListener);
    }

    @Override
    protected void onPause() {
        /**
         * MapView的生命周期與Activity同步,當activity掛起時需調用MapView.onPause()
         */
        mMapView.onPause();
        super.onPause();
    }

    @Override
    protected void onResume() {
        /**
         * MapView的生命周期與Activity同步,當activity恢復時需調用MapView.onResume()
         */
        mMapView.onResume();
        super.onResume();
    }

    @Override
    protected void onDestroy() {
        /**
         * MapView的生命周期與Activity同步,當activity銷毀時需調用MapView.destroy()
         */
        mMapView.destroy();
        super.onDestroy();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mMapView.onSaveInstanceState(outState);

    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        mMapView.onRestoreInstanceState(savedInstanceState);
    }

    /**
     * 更新地圖
     */
    private void updateMap(Location location) {
        if (location != null) {
            // 緯度
            double latitude = location.getLatitude();
            // 經度
            double longitude = location.getLongitude();
            GeoPoint p = new GeoPoint((int) (latitude * 1E6),
                    (int) (longitude * 1E6));
            mMapController.setCenter(p);
        }
    }
}

 

Application類與上文完全一樣。

Manifest里面比上文多加一個如下權限:

 <!-- 使用GPS需要的權限 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

布局文件也和上文完全一樣。
附上圖片效果:

d2.jpeg

來自:http://blog.csdn.net/u010142437/article/details/10567667

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!