百度地图_配合方向感应器的定位功能的实现
前言
从小白一步步开始,很多资源是很久以前的,而且没有操作配套截图和资源分享。现在本踩过了很多坑,现在开发完成后决定重新写一份教程,希望能借此帮助到许多其他有这方面需求的人。
精力有限,会尽可能详细。
本文同项目同步完成,已经是做过好几个类似项目工程,但还是出了一些小问题,已经附上解决方法,本文中所用到资源文件已经附上下载链接,也可以自行去百度地图开发者官网去下载,不过由于版本更新很快,若使用本文开发还是强烈推荐使用本文提供链接进行下载,尤其是SDK,如果在构建项目中出一些问题很可能是SDK已经被官方更新导致,本文的操作步骤只在本人开发时保证有效,随着时间推移可能已经不适合,本人也不可能一直维护更新操作步骤。
另外,源码已在文末给出下载地址,若导入源码出现问题很大程度上可以考虑是Android Studio(AS)和Gradle版本的问题,请自行百度去解决。
还想说的是,若可以编译生成了APK,在虚拟机或实体设备运行中出现问题,给大家分享的一些本人开发百度地图调试的主要思路:
1.首先请自行百度学习一下AS的BUG调试,同其他的IDE程序一样,AS也可以标识代码运行到哪一步出现问题
2.找到出问题的代码,BUG调试里会有报错原因提示,可以直接复制报错原因,百度查找解决方法,大概率会有类似的解决帖子
相信按照本文可以解决绝大数问题,每个人的开发运行环境不同,不可避免会出一些其他问题,若还有其他问题,本人只能提供一些建议,具体措施可能还是需要你自己去解决,若分享链接失效,文末附上了**联系方式(会及时查看好友申请,同时请注明添加理由,否则不通过申请)**或者评论区冒泡。
于2020.3.7 19:16更新了失效链接,重新编辑了前言
参考官方文档(定位)步骤:
开发包中在一开始配置已经包含基本定位功能,略过;
直接下一步:
配置AndroidManifest.xml文件:
<!-- 这个权限用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 这个权限用于访问GPS定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
在Application标签中声明定位的service组件:
<service android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote"/>
添加方向传感器的类,代码如下:
public class MyOrientationListener implements SensorEventListener
{
private SensorManager mSensorManager;
private Context mContext;
private Sensor mSensor;
private float lastX;
public MyOrientationListener(Context context)
{
this.mContext = context;
}
@SuppressWarnings("deprecation")
public void start()
{
mSensorManager = (SensorManager) mContext
.getSystemService(Context.SENSOR_SERVICE);
if (mSensorManager != null)
{
// 获得方向传感器
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
}
if (mSensor != null)
{
mSensorManager.registerListener(this, mSensor,
SensorManager.SENSOR_DELAY_UI);
}
}
public void stop()
{
mSensorManager.unregisterListener(this);
}
@Override
public void onAccuracyChanged(Sensor arg0, int arg1)
{
// TODO Auto-generated method stub
}
@SuppressWarnings(
{ "deprecation" })
@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)
{
if (mOnOrientationListener != null)
{
mOnOrientationListener.onOrientationChanged(x);
}
}
lastX = x;
}
}
private OnOrientationListener mOnOrientationListener;
public void setOnOrientationListener(
OnOrientationListener mOnOrientationListener)
{
this.mOnOrientationListener = mOnOrientationListener;
}
public interface OnOrientationListener
{
void onOrientationChanged(float x);
}
}
在自己的包下新建java文件命名为:MyOrientationListener,复制上述代码即可:
布局文件修改:
<Button
android:id="@+id/but_Loc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="定位"
android:layout_marginLeft="0dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="127dp"/>
如图;
资源文件添加:
在工程res文件夹下进行如下操作:
已上传百度网盘,自行下载(链接:图标资源 提取码:toe9 )
MainActivity文件更新(类包会自动导入):
注意:MainActivity 继承了View.OnClickListener接口,注意代码第一行implements View.OnClickListener
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private MapView mMapView = null;
private BaiduMap mBaiduMap = null;
private Context context;
//定位相关
private double mLatitude;
private double mLongtitude;
//方向传感器
private MyOrientationListener mMyOrientationListener;
private float mCurrentX;
//自定义图标
private BitmapDescriptor mIconLocation;
private LocationClient mLocationClient;
public BDAbstractLocationListener myListener;
private LatLng mLastLocationData;
private boolean isFirstin = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
SDKInitializer.setCoordType(CoordType.BD09LL);
this.context = this;
mMapView = (MapView) findViewById(R.id.bmapView);
//获取地图控件引用
mBaiduMap = mMapView.getMap();
initMyLocation();
button();
}
protected void onStart() {
super.onStart();
//开启定位
mBaiduMap.setMyLocationEnabled(true);
if (!mLocationClient.isStarted())
mLocationClient.start();
//开启方向传感器
mMyOrientationListener.start();
}
@Override
protected void onResume() {
super.onResume();
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mMapView.onPause();
}
@Override
protected void onStop() {
super.onStop();
//停止定位
mBaiduMap.setMyLocationEnabled(false);
mLocationClient.stop();
//停止方向传感器
mMyOrientationListener.stop();
}
@Override
protected void onDestroy() {
super.onDestroy();
mBaiduMap.setMyLocationEnabled(false);
mMapView.onDestroy();
mMapView = null;
}
@Override
public void onClick(View v) {
SDKInitializer.initialize(getApplicationContext());
switch (v.getId()) {
case R.id.but_Loc: {
centerToMyLocation(mLatitude, mLongtitude);
break;
}
}
}
//按钮响应
private void button() {
//按钮
Button mbut_Loc = (Button) findViewById(R.id.but_Loc);
//按钮处理
mbut_Loc.setOnClickListener(this);
}
//定位
private class MyLocationListener extends BDAbstractLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
//mapView 销毁后不在处理新接收的位置
if (location == null || mMapView == null){
return;
}
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(mCurrentX).latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
mBaiduMap.setMyLocationData(locData);
//设置自定义图标
MyLocationConfiguration config = new
MyLocationConfiguration(
MyLocationConfiguration.LocationMode.NORMAL, true, mIconLocation);
mBaiduMap.setMyLocationConfiguration(config);
//更新经纬度
mLatitude = location.getLatitude();
mLongtitude = location.getLongitude();
//设置起点
mLastLocationData = new LatLng(mLatitude, mLongtitude);
if (isFirstin) {
centerToMyLocation(location.getLatitude(), location.getLongitude());
if (location.getLocType() == BDLocation.TypeGpsLocation) {
// GPS定位结果
Toast.makeText(context, "定位:"+location.getAddrStr(), Toast.LENGTH_SHORT).show();
} else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {
// 网络定位结果
Toast.makeText(context, "定位:"+location.getAddrStr(), Toast.LENGTH_SHORT).show();
} else if (location.getLocType() == BDLocation.TypeOffLineLocation) {
// 离线定位结果
Toast.makeText(context, "定位:"+location.getAddrStr(), Toast.LENGTH_SHORT).show();
} else if (location.getLocType() == BDLocation.TypeServerError) {
Toast.makeText(context, "定位:服务器错误", Toast.LENGTH_SHORT).show();
} else if (location.getLocType() == BDLocation.TypeNetWorkException) {
Toast.makeText(context, "定位:网络错误", Toast.LENGTH_SHORT).show();
} else if (location.getLocType() == BDLocation.TypeCriteriaException) {
Toast.makeText(context, "定位:手机模式错误,请检查是否飞行", Toast.LENGTH_SHORT).show();
}
isFirstin = false;
}
}
}
//初始化定位
private void initMyLocation() {
//缩放地图
MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15.0f);
mBaiduMap.setMapStatus(msu);
//开启定位
mBaiduMap.setMyLocationEnabled(true);
//声明LocationClient类
mLocationClient = new LocationClient(this);
//通过LocationClientOption设置LocationClient相关参数
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true); // 打开gps
option.setCoorType("bd09ll"); // 设置坐标类型
option.setIsNeedAddress(true);//设置是否需要地址信息
option.setScanSpan(1000);
//设置locationClientOption
mLocationClient.setLocOption(option);
myListener = new MyLocationListener();
//注册监听函数
mLocationClient.registerLocationListener(myListener);
//初始化图标
mIconLocation = BitmapDescriptorFactory.fromResource(R.drawable.navi_map_gps);
initOrientation();
//开始定位
mLocationClient.start();
}
//回到定位中心
private void centerToMyLocation(double latitude, double longtitude) {
mBaiduMap.clear();
mLastLocationData = new LatLng(latitude, longtitude);
MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(mLastLocationData);
mBaiduMap.animateMapStatus(msu);
}
//传感器
private void initOrientation() {
//传感器
mMyOrientationListener = new MyOrientationListener(context);
mMyOrientationListener.setOnOrientationListener(new MyOrientationListener.OnOrientationListener() {
@Override
public void onOrientationChanged(float x) {
mCurrentX = x;
}
});
}
}
至此,定位功能也已经引入,运行效果如图:
图中定位图标会随着手机方向的转动而转动,真机测试可以验证结果。
工程按照步骤是能自己建好自己工程项目的
工程开发,文章撰写耗费不少精力,很多资源收集不易。若需要源码,给出源码下载链接(按需下载,前一节功能被后一节包含,需要全部功能的朋友直接下载最后一节【导航和TTS】的源码即可):
源码
生成的可运行apk:app-debug.apk 提取码:dy7h