天天看點

Android 百度地圖簡單定位百度地圖

百度地圖

    首先按官方文檔上的步驟做:

  1. 下載下傳官方的文檔,導jar包,我是用的eclipse做的,
  2. 在AndroidManifest中添加開發密鑰、所需權限等資訊;

    (1)在application中添加開發密鑰

    <application>  
        <meta-data  
            android:name="com.baidu.lbsapi.API_KEY"  
            android:value="開發者 key" />  
    </application>      
    2)添加所需權限
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.GET_TASKS" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />      
    第三步,在布局xml檔案中添加地圖控件;
    <com.baidu.mapapi.map.MapView  
        android:id="@+id/bmapView"  
        android:layout_width="fill_parent"  
        android:layout_height="fill_parent"  
        android:clickable="true" />      
  3. 第五步,建立地圖Activity,管理地圖生命周期;
    public class MainActivity extends Activity {  
        MapView mMapView = null;  
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);   
            //在使用SDK各元件之前初始化context資訊,傳入ApplicationContext  
            //注意該方法要再setContentView方法之前實作  
            SDKInitializer.initialize(getApplicationContext());  
            setContentView(R.layout.activity_main);  
            //擷取地圖控件引用  
            mMapView = (MapView) findViewById(R.id.bmapView);  
        }  
        @Override  
        protected void onDestroy() {  
            super.onDestroy();  
            //在activity執行onDestroy時執行mMapView.onDestroy(),實作地圖生命周期管理  
            mMapView.onDestroy();  
        }  
        @Override  
        protected void onResume() {  
            super.onResume();  
            //在activity執行onResume時執行mMapView. onResume (),實作地圖生命周期管理  
            mMapView.onResume();  
            }  
        @Override  
        protected void onPause() {  
            super.onPause();  
            //在activity執行onPause時執行mMapView. onPause (),實作地圖生命周期管理  
            mMapView.onPause();  
            }  
        }      
    這些都是官方文檔上面的東西,這樣是會出來一個地圖的
  4. 下面來看我的Demo  

        [java]  view plain  copy

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent" >  
  5.     <com.baidu.mapapi.map.MapView  
  6.         android:id="@+id/bmapView"  
  7.         android:layout_width="fill_parent"  
  8.         android:layout_height="fill_parent"  
  9.         android:clickable="true" />  
  10.     <Button  
  11.         android:id="@+id/btn"  
  12.         android:layout_width="wrap_content"  
  13.         android:layout_height="wrap_content"  
  14.         android:text="普通" />  
  15.     <RadioGroup  
  16.         android:id="@+id/group"  
  17.         android:layout_width="wrap_content"  
  18.         android:layout_height="wrap_content"  
  19.         android:layout_alignParentRight="true"  
  20.         android:background="#eee"  
  21.         android:orientation="vertical" >  
  22.         <RadioButton  
  23.             android:id="@+id/r1"  
  24.             android:layout_width="wrap_content"  
  25.             android:layout_height="wrap_content"  
  26.             android:text="預設圖示" />  
  27.         <RadioButton  
  28.             android:id="@+id/r2"  
  29.             android:layout_width="wrap_content"  
  30.             android:layout_height="wrap_content"  
  31.             android:text="自定義圖示" />  
  32.     </RadioGroup>  
  33. </RelativeLayout>  

這是主界面代碼    [java]  view plain  copy

  1. package com.example.map__;  
  2. import java.util.List;  
  3. import android.app.Activity;  
  4. import android.graphics.Color;  
  5. import android.os.Bundle;  
  6. import android.util.Log;  
  7. import android.view.View;  
  8. import android.view.View.OnClickListener;  
  9. import android.widget.Button;  
  10. import android.widget.CompoundButton;  
  11. import android.widget.RadioButton;  
  12. import android.widget.RadioGroup;  
  13. import android.widget.RadioGroup.OnCheckedChangeListener;  
  14. import com.baidu.location.BDLocation;  
  15. import com.baidu.location.BDLocationListener;  
  16. import com.baidu.location.LocationClient;  
  17. import com.baidu.location.LocationClientOption;  
  18. import com.baidu.location.Poi;  
  19. import com.baidu.mapapi.SDKInitializer;  
  20. import com.baidu.mapapi.map.BaiduMap;  
  21. import com.baidu.mapapi.map.BitmapDescriptor;  
  22. import com.baidu.mapapi.map.BitmapDescriptorFactory;  
  23. import com.baidu.mapapi.map.MapStatus;  
  24. import com.baidu.mapapi.map.MapStatusUpdateFactory;  
  25. import com.baidu.mapapi.map.MapView;  
  26. import com.baidu.mapapi.map.MyLocationConfiguration;  
  27. import com.baidu.mapapi.map.MyLocationConfiguration.LocationMode;  
  28. import com.baidu.mapapi.map.MyLocationData;  
  29. import com.baidu.mapapi.model.LatLng;  
  30. public class MainActivity extends Activity {  
  31.     private MapView mMapView;  
  32.     private BaiduMap mBaiduMap;  
  33.     private LocationClient mLocationClient;  
  34.     private Button requestLocButton;  
  35.     private RadioGroup group;  
  36.     private RadioButton r1;  
  37.     private RadioButton r2;  
  38.     private LocationMode mCurrentMode;  
  39.     private LocationClient mLocClient;  
  40.     public MyLocationListenner myListener = new MyLocationListenner();  
  41.     private BitmapDescriptor mCurrentMarker;  
  42.     @Override  
  43.     protected void onCreate(Bundle savedInstanceState) {  
  44.         super.onCreate(savedInstanceState);  
  45.         // 在使用SDK各元件之前初始化context資訊,傳入ApplicationContext  
  46.         // 注意該方法要再setContentView方法之前實作  
  47.         SDKInitializer.initialize(getApplicationContext());  
  48.         setContentView(R.layout.activity_main);  
  49.         requestLocButton = (Button) findViewById(R.id.btn);  
  50.         group = (RadioGroup) findViewById(R.id.group);  
  51.         r1 = (RadioButton) findViewById(R.id.r1);r1.setChecked(true);  
  52.         r2 = (RadioButton) findViewById(R.id.r2);  
  53.         mCurrentMode = LocationMode.NORMAL;  
  54.         requestLocButton.setText("普通");  
  55.         //按鈕的一個監聽,改變改變定位圖示的模式  
  56.         OnClickListener btnClickListener=new OnClickListener() {  
  57.             @Override  
  58.             public void onClick(View v) {  
  59.                 switch (mCurrentMode) {  
  60.                 case NORMAL: //正常模式  
  61.                     requestLocButton.setText("跟随");  
  62.                     mCurrentMode=LocationMode.FOLLOWING;  
  63.                     mBaiduMap  
  64.                     .setMyLocationConfigeration(new MyLocationConfiguration(  
  65.                             mCurrentMode, true, mCurrentMarker));  
  66.                     break;  
  67.                 case COMPASS:  //羅盤模式  
  68.                     requestLocButton.setText("普通");  
  69.                     mCurrentMode = LocationMode.NORMAL;  
  70.                     mBaiduMap  
  71.                             .setMyLocationConfigeration(new MyLocationConfiguration(  
  72.                                     mCurrentMode, true, mCurrentMarker));  
  73.                     break;  
  74.                 case FOLLOWING: //跟随模式  
  75.                     requestLocButton.setText("羅盤");  
  76.                     mCurrentMode = LocationMode.COMPASS;  
  77.                     mBaiduMap  
  78.                             .setMyLocationConfigeration(new MyLocationConfiguration(  
  79.                                     mCurrentMode, true, mCurrentMarker));  
  80.                     break;  
  81.                 default:  
  82.                     break;  
  83.                 }  
  84.             }  
  85.         };  
  86.          requestLocButton.setOnClickListener(btnClickListener);  
  87.         OnCheckedChangeListener radioButtonListener = new OnCheckedChangeListener() {  
  88.             @Override  
  89.             public void onCheckedChanged(RadioGroup group, int checkedId) {  
  90.                 if (checkedId==R.id.r1) {  
  91.                     // 傳入null則,恢複預設圖示  
  92.                     mCurrentMarker = null;  
  93.                     mBaiduMap  
  94.                     .setMyLocationConfigeration(new MyLocationConfiguration(  
  95.                             mCurrentMode, true, null));  
  96.                 }else if (checkedId==R.id.r2) {  
  97.                     // 修改為自定義marker,即自定義圖示  
  98.                     mCurrentMarker = BitmapDescriptorFactory  
  99.                             .fromResource(R.drawable.ic_launcher);  
  100.                     mBaiduMap  
  101.                             .setMyLocationConfigeration(new MyLocationConfiguration(  
  102.                                     mCurrentMode, true, mCurrentMarker,  
  103.                                                     Color.RED,Color.YELLOW ));  
  104.                 }  
  105.             }  
  106.         };  
  107.          group.setOnCheckedChangeListener(radioButtonListener);  
  108.         mMapView = (MapView) findViewById(R.id.bmapView); //找到我們的地圖控件  
  109.         mBaiduMap = mMapView.getMap(); //獲得地圖  
  110.         mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL); //設定為普通模式的地圖  
  111.         // 開啟定位圖層  
  112.         mBaiduMap.setMyLocationEnabled(true);   
  113.         mLocClient = new LocationClient(this);  //定位用到的一個類  
  114.         mLocClient.registerLocationListener(myListener); //注冊監聽  
  115.         ///LocationClientOption類用來設定定位SDK的定位方式,  
  116.         LocationClientOption option = new LocationClientOption(); //以下是給定位設定參數  
  117.         option.setOpenGps(true); // 打開gps  
  118.         option.setCoorType("bd09ll"); // 設定坐标類型  
  119.         option.setScanSpan(1000);  
  120.         mLocClient.setLocOption(option);  
  121.         mLocClient.start();  
  122.     }  
  123.     boolean isFirstLoc = true; // 是否首次定位  
  124.     public class MyLocationListenner implements BDLocationListener {  
  125.         @Override  
  126.         public void onReceiveLocation(BDLocation location) {  
  127.             // map view 銷毀後不在處理新接收的位置  
  128.             if (location == null || mMapView == null) {  
  129.                 return;  
  130.             }  
  131.             MyLocationData locData = new MyLocationData.Builder()  
  132.                     .accuracy(location.getRadius())  
  133.                             // 此處設定開發者擷取到的方向資訊,順時針0-360  
  134.                     .direction(100).latitude(location.getLatitude())  
  135.                     .longitude(location.getLongitude()).build();  
  136.             mBaiduMap.setMyLocationData(locData);  
  137.             if (isFirstLoc) {  
  138.                 isFirstLoc = false;  
  139.                 LatLng ll = new LatLng(location.getLatitude(),  
  140.                         location.getLongitude());  
  141.                 MapStatus.Builder builder = new MapStatus.Builder();  
  142.                 builder.target(ll).zoom(18.0f);  
  143.                 mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));  
  144.             }  
  145.         }  
  146.         public void onReceivePoi(BDLocation poiLocation) {  
  147.         }  
  148.     }  
  149.     @Override  
  150.     protected void onDestroy() {  
  151.         super.onDestroy();  
  152.         // 退出時銷毀定位  
  153.         mLocClient.stop();  
  154.         // 關閉定位圖層  
  155.         mBaiduMap.setMyLocationEnabled(false);  
  156.         mMapView.onDestroy();  
  157.         mMapView = null;  
  158.     }  
  159.     @Override  
  160.     protected void onResume() {  
  161.         super.onResume();  
  162.         // 在activity執行onResume時執行mMapView. onResume (),實作地圖生命周期管理  
  163.         mMapView.onResume();  
  164.     }  
  165.     @Override  
  166.     protected void onPause() {  
  167.         super.onPause();  
  168.         // 在activity執行onPause時執行mMapView. onPause (),實作地圖生命周期管理  
  169.         mMapView.onPause();  
  170.     }  
  171. }