`
iaiai
  • 浏览: 2195863 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

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

效果图:


好了,可以代码,为了方便,我把所有的按钮都放到了menu菜单中。
(压缩包中我改成支持android百度地址3.4.0)

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

只需要把x方向的角度设置即可~~~是不是很简单~~~


好了,介绍完毕了,关闭地图样式的切换,以及跟随、罗盘等模式的切换就不介绍了,大家自己看下源码~~
  • 大小: 848.8 KB
分享到:
评论
1 楼 huanghonhpeng 2015-07-24  
请问怎么把地图导入到我们项目中去呢!

相关推荐

    Android 百度地图 最新SDK v3.4.0 基础地图加标记点图层和信息图层

    总之,Android百度地图SDK v3.4.0提供了一套全面的工具,使开发者能够轻松地在应用中集成地图功能,包括显示地图、添加标记点、创建信息图层以及处理用户交互。通过深入理解和实践,开发者可以构建出功能丰富的地图...

    百度地图API_V3.4.0demo

    【百度地图API_V3.4.0 demo】是一款基于安卓平台的应用示例,它展示了如何有效地集成和使用百度地图服务。这个demo包含了多个关键功能的实现,如基础地图展示、定位服务、路径规划以及调用百度地图客户端进行导航。...

    android 百度地图sdk v3.4 绘制历史轨迹

    在Android平台上,使用百度地图SDK V3.4绘制历史轨迹是一项常见的需求,这涉及到地理坐标处理、地图渲染以及数据可视化等多个技术领域。本教程将详细讲解如何利用百度地图SDK实现这一功能。 首先,你需要在你的...

    android 百度地图V3.4.0demo

    百度地图的官方demo各种坑,这里把地图的单个功能做了切割,包含的功能有 location ,overlay ,geocode,poisearch,navigation 等功能。该代码用android studio 编辑。

    Android Studio最新版本3.4.0

    Android Studio最新版本3.4.0 Android Studio最新版本3.4.0 下载txt文件里面有下载链接和提取码。

    opencv-3.4.0-android-sdk.zip

    "opencv-3.4.0-android-sdk.zip" 是OpenCV针对Android平台的一个SDK包,版本号为3.4.0。这个版本发布于2018年,它包含了Android开发所需的全部资源和文档,使得开发者能够将计算机视觉功能集成到自己的Android应用中...

    百度地图应用列表

    2. **BaiduMap_AndroidSDK_v3.4.0_Lib.zip**:这个文件很可能是百度地图的库文件,包含了所有必要的类库和资源,开发者需要将这些库导入到Android Studio项目中,才能使用SDK提供的功能。 3. **BaiduMap_AndroidSDK_...

    eclipse插件 GEF-SDK-3.4.0.zip

    本压缩包"GEF-SDK-3.4.0.zip"提供了GEF的软件开发工具包,帮助开发者在Eclipse环境中创建功能丰富的图形编辑工具。 1. **GEF介绍** GEF是Eclipse平台的一个核心部分,它提供了一套框架和服务,用于构建基于模型的...

    ltp_data_v3.4.0.zip

    LTP数据模型提供了一系列中文自然语言处理...使用流水线方式将各个分析工具结合起来,形成一套统一的中文自然语言处理系统\ 系统可调用的,用于中文语言处理的模型文件 针对单一自然语言处理任务,基于云端的编程接口

    腾达 W311R 固件 H1_V3.4.0a

    腾达 W311R 固件 H1_V3.4.0a 官网找不到了,留着备用吧 腾达 W311R 固件 H1_V3.4.0a 官网找不到了,留着备用吧 腾达 W311R 固件 H1_V3.4.0a 官网找不到了,留着备用吧

    Olate Download v3.4.0 简体中文版

    **Olate Download v3.4.0 简体中文版** Olate Download是一款功能强大的下载管理程序,专为用户提供高效、便捷的文件下载服务。该版本为v3.4.0,支持简体中文,使得中国用户在使用过程中能够更加方便地理解和操作。...

    腾达W311R固件全集 H1_V3.2.5d V3.3.5r V3.3.5y V3.3.6b V3.3.6g V3.4.0a

    腾达W311R H1版固件全集: V3.2.5d V3.3.5r V3.3.5y V3.3.6b V3.3.6g V3.4.0a

    雷柏鼠标配对程序(老版程序v3.4.0-2014.12.04),针对2014年前的老鼠标配对

    本资源是雷柏的老款配对程序,版本号V3.4.0,更新日期2014.12.04,主要针对2014年前的老款雷柏鼠标,如果你使用2023年最新的雷柏配对程序不能配对的话,可以试试这个配对软件,具体使用方法我写了一个教程在我的博客...

    CRC计算工具V3.4.0-64.zip

    CRC计算工具,如“CRC计算工具V3.4.0-64”,就是用于生成和验证CRC校验码的软件,它提供了CRC16和CRC32两种常见的校验码计算方式,以满足不同场景下的需求。 CRC的工作原理基于二进制多项式除法,通过一个预先定义...

    aliyun-java-sdk-core-3.4.0.jar

    aliyun-java-sdk-core-3.4.0.jar

    STM32F10x_StdPeriph_Lib_V3.4.0

    STM32F10x_StdPeriph_Lib的使用通常与IDE(集成开发环境)如Keil uVision、IAR Embedded Workbench或GCC编译器结合,开发者可以编写C或C++代码,并通过库函数调用来实现对STM32F10x芯片的编程。 总的来说,STM32F10...

    TENDA,W311R,H1_V3.4.0a固件

    升级前固件版本为当前版本为H1_V3.3.5r,在网上查了下,可升级的版本为H1_V3.3.5y,也可以直接升级为H1_V3.4.0a;据说后者是H1的最新版本了,所以就在网上下载了,然后顺利升级,得使用一段时间才知道才无线网不...

    opencv-3.4.4-android-sdk/sdk/native/其他文件.zip

    opencv-3.4.4-android-sdk/sdk/native/3rdparty opencv-3.4.4-android-sdk/sdk/native/jni opencv-3.4.4-android-sdk/sdk/native/staticlibs

Global site tag (gtag.js) - Google Analytics