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

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

2016-02-04 21:34 956 查看
转载请标明出处:/article/1336257.html

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

效果图:



好了,能够代码,为了方便,我把全部的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中百度地图的使用期待您的支持。

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

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

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

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

4、高仿QQ5.0側滑

5、高仿微信5.2.1主界面及消息提醒
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: