Android 百度地图 SDK v3.0.0 定位与结合方向传感器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 百度地图 SDK v3.0.0 定位与结合方向传感器相关的知识,希望对你有一定的参考价值。

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

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

效果图:

技术分享

好了,能够代码,为了方便,我把全部的button都放到了menu菜单中。

1、初次启动定位

/**
	 * 定位的client
	 */
	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>

如今主要的定位功能已经实现了~只是我们还须要加入点击定位button和方向传感器

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);
	}

非常easy。我们在定位的监听器中已经保存了近期一次的定位经纬度,所以仅仅须要点击时,把地图移动到对应的位置就可以。

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 SensorEventListener
{

	private 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方向的角度设置就可以~~~是不是非常easy~~~


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


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


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


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

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

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

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

4、高仿QQ5.0側滑

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





以上是关于Android 百度地图 SDK v3.0.0 定位与结合方向传感器的主要内容,如果未能解决你的问题,请参考以下文章

Android 百度地图 SDK v3.0.0

Android 百度地图 SDK v3.0.0 定位与结合方向传感器

什么是百度地图android sdk

百度地图 android sdk 怎么 setZoom

android studio下百度地图sdk的初体验

android使用百度地图SDK获取定位信息