• 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主界面及消息提醒





  • 相关阅读:
    mysql 触发器 插入
    【经验】STL的list vector在iterator迭代器的循环中 使用erase 造成的BUG
    C/C++ 关于 for循环 的第二个表达式右侧非常量的时候
    MySQL C API的一个让我头疼的问题,获得一行记录中包括NULL
    vim粘贴代码的时候,恶心的缩进.
    [转]分析MySQL数据类型的长度【mysql数据字段 中length和decimals的作用!熟悉mysql必看】
    [转]对于孩子:旅行的意义何在?
    libc中的标准函数 localtime和localtime_r 的用法
    【腾讯面试题目】非循环方式 计算一个32位整数中被置1的位数
    C++对带有分隔符的字符串 分割为数字的通用解决方案
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5182355.html
Copyright © 2020-2023  润新知