您的位置:首页 > 移动开发 > Android开发

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

2015-10-17 15:20 555 查看
转载请标明出处:/article/1336257.html

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

效果图:



好了,可以代码,为了方便,我把所有的按钮都放到了menu菜单中。
1、初次启动定位

[java] view
plaincopy





/**

* 定位的客户端

*/

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:

[java] view
plaincopy





/**

* 实现实位回调监听

*/

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一直在那定位,估计马上就被卸载了~

[java] view
plaincopy





@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

[html] view
plaincopy





<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方法。

[java] view
plaincopy





case R.id.id_menu_map_myLoc:

center2myLoc();

break;

[java] view
plaincopy





/**

* 地图移动到我的位置,此处可以重新发定位请求,然后定位;

* 直接拿最近一次经纬度,如果长时间没有定位成功,可能会显示效果不好

*/

private void center2myLoc()

{

LatLng ll = new LatLng(mCurrentLantitude, mCurrentLongitude);

MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);

mBaiduMap.animateMapStatus(u);

}

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

3、集成方向传感器

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

[java] view
plaincopy





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中初始化方向传感器

[java] view
plaincopy





/**

* 初始化方向传感器

*/

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中分别开启和关闭方向传感器。

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

[java] view
plaincopy





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主界面及消息提醒
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: