Android定位&地圖&導航——基於百度地圖移動獲取位置和自動定位

来源:http://www.cnblogs.com/jerehedu/archive/2016/01/29/5167996.html
-Advertisement-
Play Games

一、問題描述 使用百度地圖實現如圖所示應用,首先自動定位當前我起始位置(小圓點位置),並跟隨移動不斷自動定位我的當前位置 百度Api不同版本使用會有些差異,本例中加入lib如下: 二、編寫MyApplication類 public class MyApplication extends Applic


一、問題描述

使用百度地圖實現如圖所示應用,首先自動定位當前我起始位置(小圓點位置),並跟隨移動不斷自動定位我的當前位置

百度Api不同版本使用會有些差異,本例中加入lib如下:

二、編寫MyApplication類
public class MyApplication extends Application {
    static MyApplication myApplication;
    BMapManager mBMapManager = null;
    String mStrKey = "7ZfuRcOx1G3oZ8TKuTNGm4sO";
    boolean m_bKeyRight = true; // 授權Key正確,驗證通過
    private List<Activity> activityList = new LinkedList<Activity>();
    @Override
    public void onCreate() {
        myApplication = this;
        initEngineManager(this);
        super.onCreate();
    }
    public void initEngineManager(Context context) {
        if (mBMapManager == null) {
            mBMapManager = new BMapManager(context);
            Toast.makeText(MyApplication.getInstance().getApplicationContext(),
                    "BMapManager  初始化SUCSUC!", Toast.LENGTH_LONG).show();
        }
        if (!mBMapManager.init(mStrKey, new MyGeneralListener())) {
            Toast.makeText(MyApplication.getInstance().getApplicationContext(),
                    "BMapManager  初始化錯誤!", Toast.LENGTH_LONG).show();
        }
    }

    public static MyApplication getInstance() {
        if (myApplication == null) {
            myApplication = new MyApplication();
        }
        return myApplication;
    }
    public void addActivity(Activity activity) {
        activityList.add(activity);
    }
    public void exit() {
        for (Activity activity : activityList) {
            activity.finish();
        }
        System.exit(0);
    }
    // 常用事件監聽,用來處理通常的網路錯誤,授權驗證錯誤等
    static class MyGeneralListener implements MKGeneralListener {
        public void onGetNetworkState(int iError) {
            if (iError == MKEvent.ERROR_NETWORK_CONNECT) {
                Toast.makeText(
                        MyApplication.getInstance().getApplicationContext(),
                        "您的網路出錯啦!", Toast.LENGTH_LONG).show();
            } else if (iError == MKEvent.ERROR_NETWORK_DATA) {
                Toast.makeText(
                        MyApplication.getInstance().getApplicationContext(),
                        "輸入正確的檢索條件!", Toast.LENGTH_LONG).show();
            }
            // ...
        }
        public void onGetPermissionState(int iError) {
            if (iError == MKEvent.ERROR_PERMISSION_DENIED) {
                // 授權Key錯誤:
                Toast.makeText(
                        MyApplication.getInstance().getApplicationContext(),
                        "請輸入正確的授權Key!",
                        Toast.LENGTH_LONG).show();
                MyApplication.getInstance().m_bKeyRight = false;
            }
        }

    }
}
三、編寫主程式MainActivity,顯示當前所處位置

 主程式MainActity:

public class MainActivity extends Activity {
    public MyApplication app;
    static MapView mMapView = null;
    public MKMapViewListener mMapListener = null;
    MyLocationOverlay myLocationOverlay = null;
    // 定位相關
    LocationClient mLocClient;
    public NotifyLister mNotifyer = null;
    public MyLocationListenner myListener = new MyLocationListenner();
    LocationData locData = null;
    private MapController mMapController = null;
    
    static MKSearch mkSerach;

    Handler mHandler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            Toast.makeText(MainActivity.this, "msg:" + msg.what,
                    Toast.LENGTH_SHORT).show();
        };
    };
    static TextView showAddr;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        showAddr = (TextView) findViewById(R.id.showAddr);
        MyIcon mi = new MyIcon(this);
        //在屏幕中心點添加接我圖標
        getWindow().addContentView(
                mi,
                new LayoutParams(LayoutParams.FILL_PARENT,
                        LayoutParams.FILL_PARENT));
        MyIcon2 m2 = new MyIcon2(this);
        getWindow().addContentView(
                m2,
                new LayoutParams(LayoutParams.FILL_PARENT,
                        LayoutParams.FILL_PARENT));

        mMapView = (MapView) findViewById(R.id.bmapsView);
        mMapController = mMapView.getController();
        initMapView();
        app = MyApplication.getInstance();
        mLocClient = new LocationClient(this);
        mLocClient.registerLocationListener(myListener);
        
        //搜索初始化
        mkSerach = new MKSearch();
        mkSerach.init(app.mBMapManager, new MKSearchListener() {

            @Override
            public void onGetWalkingRouteResult(MKWalkingRouteResult arg0,
                    int arg1) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onGetTransitRouteResult(MKTransitRouteResult arg0,
                    int arg1) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onGetPoiResult(MKPoiResult arg0, int arg1, int arg2) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onGetPoiDetailSearchResult(int arg0, int arg1) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onGetDrivingRouteResult(MKDrivingRouteResult arg0,
                    int arg1) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onGetAddrResult(MKAddrInfo info, int arg1) {
                showAddr.setText(info.strAddr);
            }
        });

        
        //設置地圖相關
        LocationClientOption option = new LocationClientOption();
        option.setOpenGps(true);
        option.setCoorType("bd09ll");
        option.setScanSpan(300000);
        mLocClient.setLocOption(option);
        mLocClient.start();
        mMapView.getController().setZoom(16);
        mMapView.getController().enableClick(true);
        mMapView.displayZoomControls(true);
        mMapListener = new MKMapViewListener() {

            public void onMapMoveFinish() {

            }

            public void onClickMapPoi(MapPoi mapPoiInfo) {
                // TODO Auto-generated method stub
                String title = "";
                if (mapPoiInfo != null) {
                    title = mapPoiInfo.strText;
                    Toast.makeText(MainActivity.this, title, Toast.LENGTH_SHORT)
                            .show();
                }
            }
        };
        mMapView.regMapViewListener(MyApplication.getInstance().mBMapManager,
                mMapListener);
        myLocationOverlay = new MyLocationOverlay(mMapView);
        locData = new LocationData();
        myLocationOverlay.setData(locData);
        mMapView.getOverlays().add(myLocationOverlay);
        myLocationOverlay.enableCompass();
        mMapView.refresh();
    }

    private void initMapView() {
        mMapView.setLongClickable(true);
    }

    /**
     * 監聽函數,又新位置的時候,格式化成字元串,輸出到屏幕中
     */
    public class MyLocationListenner implements BDLocationListener {
        public void onReceiveLocation(BDLocation location) {
            if (location == null)
                return;
            locData.latitude = location.getLatitude();
            locData.longitude = location.getLongitude();
            locData.direction = 2.0f;
            locData.accuracy = location.getRadius();
            locData.direction = location.getDerect();
            Log.d("loctest",
                    String.format("before: lat: %f lon: %f",
                            location.getLatitude(), location.getLongitude()));
            myLocationOverlay.setData(locData);
            mMapView.refresh();
            mMapController
                    .animateTo(new GeoPoint((int) (locData.latitude * 1e6),
                            (int) (locData.longitude * 1e6)), mHandler
                            .obtainMessage(1));
        }
        public void onReceivePoi(BDLocation poiLocation) {
            if (poiLocation == null) {
                return;
            }
        }
    }
    public class NotifyLister extends BDNotifyListener {
        public void onNotify(BDLocation mlocation, float distance) {
        }
    }

    @Override
    protected void onPause() {
        mMapView.onPause();
        super.onPause();
    }

    @Override
    protected void onResume() {
        mMapView.onResume();
        super.onResume();
    }

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

    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        mMapView.onRestoreInstanceState(savedInstanceState);
    }
    public static void getPosition(GeoPoint g) {
        mkSerach.reverseGeocode(g);
        showAddr.setText("獲取位置中...");
    }

}

Xml佈局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
  
     >
    <TextView 
        android:id="@+id/showAddr"
          android:gravity="center"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="選擇地點"
        android:textSize="20dp"
        /> 
 <com.baidu.mapapi.map.MapView
        android:id="@+id/bmapsView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:clickable="true" />     
</LinearLayout>
三、繪製圖形

 MyIcon 的onDraw實現繪製中心點的圖標,MyIcon2繪製指示器圖標,如圖所示

 

public class MyIcon extends View {
    public static int w;
    public static int h;
    public static  Bitmap mBitmap;

    public MyIcon(Context context) {
        super(context);
        mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.me);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        w = this.getWidth() / 2 - mBitmap.getWidth() / 2;
        h = this.getHeight() / 2 - mBitmap.getHeight() / 2;
        canvas.drawBitmap(mBitmap, w, h, null);
    }

}
public class MyIcon2 extends View{
    public static int w;
    public static int h;
    private Bitmap mBitmap;

    public MyIcon2(Context context) {
        super(context);
        mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.jiewo);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        w = this.getWidth() / 2 - mBitmap.getWidth() / 2;
        h = (this.getHeight() / 2 - mBitmap.getHeight() / 2) - (    MyIcon.mBitmap.getHeight()/2);
        canvas.drawBitmap(mBitmap, w, h, null);
    }
}

 

作者:傑瑞教育
出處:http://www.cnblogs.com/jerehedu/ 
版權聲明:本文版權歸傑瑞教育技有限公司和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
技術咨詢:JRedu技術交流
 
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 對HTML5以下描述中錯誤的是() 以下關於video元素描述錯誤的是() 若要在網頁中插入樣式表style.css,以下用法中,正確的是( )。 以下可以在html頁面中顯示“<”的是( )。 A. It;B. &Lt;C. &ItD. < 請使用HTML解碼工具:http://tool.hove
  • 點擊enter回車鍵實現表單元素切換焦點效果:現在網站都比較追求人性化,比如填寫表單的時候,能夠實現點擊回車就可以切換表單元素的焦點,這樣比使用滑鼠進行切換更能讓人接受,下麵就通過代碼實例介紹一下如何實現此功能。代碼如下: <!DOCTYPE html> <html> <head> <meta ch
  • javascript截取字元串代碼實例:截取字元串是常見的操作,例如新聞列表對新聞標題長度的控制就是如此,下麵分享一段這樣的代碼實例,也不多做介紹了,因為代碼很簡單,很多朋友需要的僅僅是一個例子而已,因為只要看到例子就知道該怎麼用了。代碼如下: var str="螞蟻部落歡迎您,只有努力才會有美好的
  • css如何實現讓文字沉到元素的底部:在實際應用中可能有這樣的需求,那就是將指定的文本沉降到元素的底部。下麵就通過代碼實例介紹以下如何實現此效果。代碼如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author
  • 1.介面部分:對外聲明類的行為和特征(類的定義分為:介面部分和實現部分) ① @interface 介面關鍵字:用於表示這是一個類的介面部分 介面部分功能:是定義類的靜態特征和聲明動態行為 @end 作為結束標誌 對外介面:通過介面就可以在不知道實現的情況下,瞭解這個類有什麼 Person:類名,每
  • 在web頁面中,有a標簽的超鏈接實現跳轉,同樣在Android當中,用TextView控制項來顯示文字,實現它的事件來跳轉。 核心代碼如下: //以下代碼寫在onCreate()方法當中 textView1=(TextView)findViewById(R.id.sound_help); String
  • Remote Displayer for Android V1.0.
  • 代碼: #import "RootViewController.h" //為判斷手機的型號 -(NSString*)deviceString添加頭文件 #import "sys/utsname.h" @interface RootViewController () @end @implementat
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...