Android 百度地图 SDK v3 0 0 (二) 定位与结合方向传感器

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.****.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

转载请标明出处:http://blog.****.net/lmj623565791/article/details/37730469

在上一篇博客中,我们成功把地图导入了我们的项目。本篇我们准备为地图添加:第一,定位功能;第二,与方向传感器结合,通过旋转手机进行道路的方向确认。有了这两个功能,地图已经可以为我服务了~~~~

效果图:

Android 百度地图 SDK v3 0 0 (二) 定位与结合方向传感器

好了,可以代码,为了方便,我把所有的按钮都放到了menu菜单中。

1、初次启动定位

/**  * 定位的客户端  */ private LocationClient mLocationClient; /**  * 定位的监听器  */ public MyLocationListener mMyLocationListener; /**  * 当前定位的模式  */ private LocationMode mCurrentMode = LocationMode.NORMAL; /***  * 是否是第一次定位  */ private volatile boolean isFristLocation = true/**  * 初始化定位相关代码  */ private void initMyLocation() {  // 定位初始化  mLocationClient = new LocationClient(this);  mMyLocationListener = new MyLocationListener();  mLocationClient.registerLocationListener(mMyLocationListener);  // 设置定位的相关配置  LocationClientOption option = new LocationClientOption();  option.setOpenGps(true);// 打开gps  option.setCoorType("bd09ll"); // 设置坐标类型  option.setScanSpan(1000);  mLocationClient.setLocOption(option); }

然后是定位的监听器MyLocationListener:
/**  * 实现实位回调监听  */ public class MyLocationListener implements BDLocationListener {  @Override  public void onReceiveLocation(BDLocation location)  {   // map view 销毁后不在处理新接收的位置   if (location == null || mMapView == null)    return;   // 构造定位数据   MyLocationData locData = new MyLocationData.Builder()     .accuracy(location.getRadius())     // 此处设置开发者获取到的方向信息,顺时针0-360     .direction(mXDirection).latitude(location.getLatitude())     .longitude(location.getLongitude()).build();   mCurrentAccracy = location.getRadius();   // 设置定位数据   mBaiduMap.setMyLocationData(locData);   mCurrentLantitude = location.getLatitude();   mCurrentLongitude = location.getLongitude();   // 设置自定义图标   BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory     .fromResource(R.drawable.navi_map_gps_locked);   MyLocationConfigeration config = new MyLocationConfigeration(     mCurrentMode, true, mCurrentMarker);   mBaiduMap.setMyLocationConfigeration(config);   // 第一次定位时,将地图位置移动到当前位置   if (isFristLocation)   {    isFristLocation = false;    LatLng ll = new LatLng(location.getLatitude(),      location.getLongitude());    MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);    mBaiduMap.animateMapStatus(u);   }  } }
可以看到,我们初始化了定位的参数,设置了定位的监听器,每隔1s会进行一次定位,应用打开时,第一定位,会把地图中心设置当前用户位置。
定位也是比较耗电的,所以我们在onStart中开启定位,在onStop中关闭定位~~这样应用最小化时就不会一直在哪GPS请求定位了,用户要是看你app一直在那定位,估计马上就被卸载了~

@Override protected void onStart() {  // 开启图层定位  mBaiduMap.setMyLocationEnabled(true);  if (!mLocationClient.isStarted())  {   mLocationClient.start();  }  // 开启方向传感器  myOrientationListener.start();  super.onStart(); } @Override protected void onStop() {  // 关闭图层定位  mBaiduMap.setMyLocationEnabled(false);  mLocationClient.stop();  // 关闭方向传感器  myOrientationListener.stop();  super.onStop(); }

上面的传感器的代码,一会就会介绍~

记得在AndroidManifest.xml配一个service

  <service            android:name="com.baidu.location.f"            android:enabled="true"            android:process=":remote" >            <intent-filter>                <action android:name="com.baidu.location.service_v2.2" >                </action>            </intent-filter>        </service>

现在基本的定位功能已经实现了~不过我们还需要添加点击定位按钮和方向传感器

2、我的位置

点击我的位置菜单会调用center2myLoc方法。

 case R.id.id_menu_map_myLoc:   center2myLoc();   break;

/**  * 地图移动到我的位置,此处可以重新发定位请求,然后定位;   * 直接拿最近一次经纬度,如果长时间没有定位成功,可能会显示效果不好  */ private void center2myLoc() {  LatLng ll = new LatLng(mCurrentLantitude, mCurrentLongitude);  MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);  mBaiduMap.animateMapStatus(u); }

很简单,我们在定位的监听器中已经保存了最近一次的定位经纬度,所以只需要点击时,把地图移动到相应的位置即可。

3、集成方向传感器

首先是封装的方向传感器的类MyOrientationListener.java

package com.zhy.zhy_baidu_ditu_demo00;import android.content.Context;import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import android.hardware.SensorManager;public class MyOrientationListener implements SensorEventListenerprivate Context context; private SensorManager sensorManager; private Sensor sensor;  private float lastX ;   private OnOrientationListener onOrientationListener ;  public MyOrientationListener(Context context) {  this.context = context; } // 开始 public void start() {  // 获得传感器管理器  sensorManager = (SensorManager) context    .getSystemService(Context.SENSOR_SERVICE);  if (sensorManager != null)  {   // 获得方向传感器   sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);  }  // 注册  if (sensor != null)  {//SensorManager.SENSOR_DELAY_UI   sensorManager.registerListener(this, sensor,     SensorManager.SENSOR_DELAY_UI);  } } // 停止检测 public void stop() {  sensorManager.unregisterListener(this); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) {   } @Override public void onSensorChanged(SensorEvent event) {  // 接受方向感应器的类型          if (event.sensor.getType() == Sensor.TYPE_ORIENTATION)          {              // 这里我们可以得到数据,然后根据需要来处理              float x = event.values[SensorManager.DATA_X];                          if( Math.abs(x- lastX) > 1.0 )            {             onOrientationListener.onOrientationChanged(x);            }//            Log.e("DATA_X", x+"");            lastX = x ;                     }   }  public void setOnOrientationListener(OnOrientationListener onOrientationListener) {  this.onOrientationListener = onOrientationListener ; }   public interface OnOrientationListener  {  void onOrientationChanged(float x); }}

在onCreate中初始化方向传感器

/**  * 初始化方向传感器  */ private void initOritationListener() {  myOrientationListener = new MyOrientationListener(    getApplicationContext());  myOrientationListener    .setOnOrientationListener(new OnOrientationListener()    {     @Override     public void onOrientationChanged(float x)     {      mXDirection = (int) x;      // 构造定位数据      MyLocationData locData = new MyLocationData.Builder()        .accuracy(mCurrentAccracy)        // 此处设置开发者获取到的方向信息,顺时针0-360        .direction(mXDirection)        .latitude(mCurrentLantitude)        .longitude(mCurrentLongitude).build();      // 设置定位数据      mBaiduMap.setMyLocationData(locData);      // 设置自定义图标      BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory        .fromResource(R.drawable.navi_map_gps_locked);      MyLocationConfigeration config = new MyLocationConfigeration(        mCurrentMode, true, mCurrentMarker);      mBaiduMap.setMyLocationConfigeration(config);     }    }); }

最后在onStart和onStop中分别开启和关闭方向传感器。

对于旋转手机确定方向,实际上利用了

new MyLocationData.Builder()   //此处设置开发者获取到的方向信息,顺时针0-360                                                                                      .direction(mXDirection)
只需要把x方向的角度设置即可~~~是不是很简单~~~


好了,介绍完毕了,关闭地图样式的切换,以及跟随、罗盘等模式的切换就不介绍了,大家自己看下源码~~


源码点击下载
注:开发者key需要换成自己申请的,不清楚申请的请看第一篇博客的。


百度地图相关博客视频版本已经上线:Android中百度地图的使用期待您的支持。


博主部分视频已经上线,如果你不喜欢枯燥的文本,请猛戳(初录,期待您的支持):

1、Android 自定义控件实战 电商活动中的刮刮卡

2、Android自定义控件实战  打造Android流式布局和热门标签

3、Android智能机器人“小慕”的实现

4、高仿QQ5.0侧滑

5、高仿微信5.2.1主界面及消息提醒





百度地图相关博客视频版本已经上线:Android中百度地图的使用期待您的支持。



博主部分视频已经上线,如果你不喜欢枯燥的文本,请猛戳(初录,期待您的支持):

1、Android 自定义控件实战 电商活动中的刮刮卡

2、Android自定义控件实战  打造Android流式布局和热门标签

3、Android智能机器人“小慕”的实现

4、高仿QQ5.0侧滑

5、高仿微信5.2.1主界面及消息提醒




           

给我老师的人工智能教程打call!http://blog.****.net/jiangjunshow

Android 百度地图 SDK v3 0 0 (二) 定位与结合方向传感器