天天看點

Android 百度地圖 SDK v3.0.0 (二) 定位與結合方向傳感器

轉載請标明出處:http://blog.csdn.net/lmj623565791/article/details/37730469

在上一篇部落格中,我們成功把地圖導入了我們的項目。本篇我們準備為地圖添加:第一,定位功能;第二,與方向傳感器結合,通過旋轉手機進行道路的方向确認。有了這兩個功能,地圖已經可以為我服務了~~~~

效果圖:

Android 百度地圖 SDK v3.0.0 (二) 定位與結合方向傳感器

好了,可以代碼,為了友善,我把所有的按鈕都放到了menu菜單中。

1、初次啟動定位

[java]  view plain copy

Android 百度地圖 SDK v3.0.0 (二) 定位與結合方向傳感器
Android 百度地圖 SDK v3.0.0 (二) 定位與結合方向傳感器
  1.     private LocationClient mLocationClient;  
  2.     public MyLocationListener mMyLocationListener;  
  3.     private LocationMode mCurrentMode = LocationMode.NORMAL;  
  4.     private volatile boolean isFristLocation = true;  
  5.     private void initMyLocation()  
  6.     {  
  7.         // 定位初始化  
  8.         mLocationClient = new LocationClient(this);  
  9.         mMyLocationListener = new MyLocationListener();  
  10.         mLocationClient.registerLocationListener(mMyLocationListener);  
  11.         // 設定定位的相關配置  
  12.         LocationClientOption option = new LocationClientOption();  
  13.         option.setOpenGps(true);// 打開gps  
  14.         option.setCoorType("bd09ll"); // 設定坐标類型  
  15.         option.setScanSpan(1000);  
  16.         mLocationClient.setLocOption(option);  
  17.     }  

然後是定位的監聽器MyLocationListener:

[java]  view plain copy

Android 百度地圖 SDK v3.0.0 (二) 定位與結合方向傳感器
Android 百度地圖 SDK v3.0.0 (二) 定位與結合方向傳感器
  1.     public class MyLocationListener implements BDLocationListener  
  2.     {  
  3.         @Override  
  4.         public void onReceiveLocation(BDLocation location)  
  5.         {  
  6.             // map view 銷毀後不在處理新接收的位置  
  7.             if (location == null || mMapView == null)  
  8.                 return;  
  9.             // 構造定位資料  
  10.             MyLocationData locData = new MyLocationData.Builder()  
  11.                     .accuracy(location.getRadius())  
  12.                     // 此處設定開發者擷取到的方向資訊,順時針0-360  
  13.                     .direction(mXDirection).latitude(location.getLatitude())  
  14.                     .longitude(location.getLongitude()).build();  
  15.             mCurrentAccracy = location.getRadius();  
  16.             // 設定定位資料  
  17.             mBaiduMap.setMyLocationData(locData);  
  18.             mCurrentLantitude = location.getLatitude();  
  19.             mCurrentLongitude = location.getLongitude();  
  20.             // 設定自定義圖示  
  21.             BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory  
  22.                     .fromResource(R.drawable.navi_map_gps_locked);  
  23.             MyLocationConfigeration config = new MyLocationConfigeration(  
  24.                     mCurrentMode, true, mCurrentMarker);  
  25.             mBaiduMap.setMyLocationConfigeration(config);  
  26.             // 第一次定位時,将地圖位置移動到目前位置  
  27.             if (isFristLocation)  
  28.             {  
  29.                 isFristLocation = false;  
  30.                 LatLng ll = new LatLng(location.getLatitude(),  
  31.                         location.getLongitude());  
  32.                 MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);  
  33.                 mBaiduMap.animateMapStatus(u);  
  34.             }  
  35.         }  
  36.     }  

可以看到,我們初始化了定位的參數,設定了定位的監聽器,每隔1s會進行一次定位,應用打開時,第一定位,會把地圖中心設定目前使用者位置。

定位也是比較耗電的,是以我們在onStart中開啟定位,在onStop中關閉定位~~這樣應用最小化時就不會一直在哪GPS請求定位了,使用者要是看你app一直在那定位,估計馬上就被解除安裝了~

[java]  view plain copy

Android 百度地圖 SDK v3.0.0 (二) 定位與結合方向傳感器
Android 百度地圖 SDK v3.0.0 (二) 定位與結合方向傳感器
  1. @Override  
  2.     protected void onStart()  
  3.     {  
  4.         // 開啟圖層定位  
  5.         mBaiduMap.setMyLocationEnabled(true);  
  6.         if (!mLocationClient.isStarted())  
  7.         {  
  8.             mLocationClient.start();  
  9.         }  
  10.         // 開啟方向傳感器  
  11.         myOrientationListener.start();  
  12.         super.onStart();  
  13.     }  
  14.     @Override  
  15.     protected void onStop()  
  16.     {  
  17.         // 關閉圖層定位  
  18.         mBaiduMap.setMyLocationEnabled(false);  
  19.         mLocationClient.stop();  
  20.         // 關閉方向傳感器  
  21.         myOrientationListener.stop();  
  22.         super.onStop();  
  23.     }  

上面的傳感器的代碼,一會就會介紹~

記得在AndroidManifest.xml配一個service

[html]  view plain copy

Android 百度地圖 SDK v3.0.0 (二) 定位與結合方向傳感器
Android 百度地圖 SDK v3.0.0 (二) 定位與結合方向傳感器
  1. <service  
  2.           android:name="com.baidu.location.f"  
  3.           android:enabled="true"  
  4.           android:process=":remote" >  
  5.           <intent-filter>  
  6.               <action android:name="com.baidu.location.service_v2.2" >  
  7.               </action>  
  8.           </intent-filter>  
  9.       </service>  

現在基本的定位功能已經實作了~不過我們還需要添加點選定位按鈕和方向傳感器

2、我的位置

點選我的位置菜單會調用center2myLoc方法。

[java]  view plain copy

Android 百度地圖 SDK v3.0.0 (二) 定位與結合方向傳感器
Android 百度地圖 SDK v3.0.0 (二) 定位與結合方向傳感器
  1. case R.id.id_menu_map_myLoc:  
  2.         center2myLoc();  
  3.         break;  

[java]  view plain copy

Android 百度地圖 SDK v3.0.0 (二) 定位與結合方向傳感器
Android 百度地圖 SDK v3.0.0 (二) 定位與結合方向傳感器
  1.     private void center2myLoc()  
  2.     {  
  3.         LatLng ll = new LatLng(mCurrentLantitude, mCurrentLongitude);  
  4.         MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);  
  5.         mBaiduMap.animateMapStatus(u);  
  6.     }  

很簡單,我們在定位的監聽器中已經儲存了最近一次的定位經緯度,是以隻需要點選時,把地圖移動到相應的位置即可。

3、內建方向傳感器

首先是封裝的方向傳感器的類MyOrientationListener.java

[java]  view plain copy

Android 百度地圖 SDK v3.0.0 (二) 定位與結合方向傳感器
Android 百度地圖 SDK v3.0.0 (二) 定位與結合方向傳感器
  1. package com.zhy.zhy_baidu_ditu_demo00;  
  2. import android.content.Context;  
  3. import android.hardware.Sensor;  
  4. import android.hardware.SensorEvent;  
  5. import android.hardware.SensorEventListener;  
  6. import android.hardware.SensorManager;  
  7. public class MyOrientationListener implements SensorEventListener  
  8. {  
  9.     private Context context;  
  10.     private SensorManager sensorManager;  
  11.     private Sensor sensor;  
  12.     private float lastX ;   
  13.     private OnOrientationListener onOrientationListener ;   
  14.     public MyOrientationListener(Context context)  
  15.     {  
  16.         this.context = context;  
  17.     }  
  18.     // 開始  
  19.     public void start()  
  20.     {  
  21.         // 獲得傳感器管理器  
  22.         sensorManager = (SensorManager) context  
  23.                 .getSystemService(Context.SENSOR_SERVICE);  
  24.         if (sensorManager != null)  
  25.         {  
  26.             // 獲得方向傳感器  
  27.             sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);  
  28.         }  
  29.         // 注冊  
  30.         if (sensor != null)  
  31.         {//SensorManager.SENSOR_DELAY_UI  
  32.             sensorManager.registerListener(this, sensor,  
  33.                     SensorManager.SENSOR_DELAY_UI);  
  34.         }  
  35.     }  
  36.     // 停止檢測  
  37.     public void stop()  
  38.     {  
  39.         sensorManager.unregisterListener(this);  
  40.     }  
  41.     @Override  
  42.     public void onAccuracyChanged(Sensor sensor, int accuracy)  
  43.     {  
  44.     }  
  45.     @Override  
  46.     public void onSensorChanged(SensorEvent event)  
  47.     {  
  48.         // 接受方向感應器的類型    
  49.         if (event.sensor.getType() == Sensor.TYPE_ORIENTATION)    
  50.         {    
  51.             // 這裡我們可以得到資料,然後根據需要來處理    
  52.             float x = event.values[SensorManager.DATA_X];    
  53.             if( Math.abs(x- lastX) > 1.0 )  
  54.             {  
  55.                 onOrientationListener.onOrientationChanged(x);  
  56.             }  
  57. //            Log.e("DATA_X", x+"");  
  58.             lastX = x ;   
  59.         }    
  60.     }  
  61.     public void setOnOrientationListener(OnOrientationListener onOrientationListener)  
  62.     {  
  63.         this.onOrientationListener = onOrientationListener ;  
  64.     }  
  65.     public interface OnOrientationListener   
  66.     {  
  67.         void onOrientationChanged(float x);  
  68.     }  
  69. }  

在onCreate中初始化方向傳感器

[java]  view plain copy

Android 百度地圖 SDK v3.0.0 (二) 定位與結合方向傳感器
Android 百度地圖 SDK v3.0.0 (二) 定位與結合方向傳感器
  1.     private void initOritationListener()  
  2.     {  
  3.         myOrientationListener = new MyOrientationListener(  
  4.                 getApplicationContext());  
  5.         myOrientationListener  
  6.                 .setOnOrientationListener(new OnOrientationListener()  
  7.                 {  
  8.                     @Override  
  9.                     public void onOrientationChanged(float x)  
  10.                     {  
  11.                         mXDirection = (int) x;  
  12.                         // 構造定位資料  
  13.                         MyLocationData locData = new MyLocationData.Builder()  
  14.                                 .accuracy(mCurrentAccracy)  
  15.                                 // 此處設定開發者擷取到的方向資訊,順時針0-360  
  16.                                 .direction(mXDirection)  
  17.                                 .latitude(mCurrentLantitude)  
  18.                                 .longitude(mCurrentLongitude).build();  
  19.                         // 設定定位資料  
  20.                         mBaiduMap.setMyLocationData(locData);  
  21.                         // 設定自定義圖示  
  22.                         BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory  
  23.                                 .fromResource(R.drawable.navi_map_gps_locked);  
  24.                         MyLocationConfigeration config = new MyLocationConfigeration(  
  25.                                 mCurrentMode, true, mCurrentMarker);  
  26.                         mBaiduMap.setMyLocationConfigeration(config);  
  27.                     }  
  28.                 });  
  29.     }  

最後在onStart和onStop中分别開啟和關閉方向傳感器。

對于旋轉手機确定方向,實際上利用了

[java]  view plain copy

Android 百度地圖 SDK v3.0.0 (二) 定位與結合方向傳感器
Android 百度地圖 SDK v3.0.0 (二) 定位與結合方向傳感器
  1. new MyLocationData.Builder()              
  2. //此處設定開發者擷取到的方向資訊,順時針0-360                                                                                                .direction(mXDirection)  

隻需要把x方向的角度設定即可~~~是不是很簡單~~~

好了,介紹完畢了,關閉地圖樣式的切換,以及跟随、羅盤等模式的切換就不介紹了,大家自己看下源碼~~

源碼點選下載下傳

注:開發者key需要換成自己申請的,不清楚申請的請看第一篇部落格的。