使用百度地图结合GPS进行定位

随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)

本文在上文基础上加入GPS定位功能,实现实时定位,代码如下:

Activity:

package com.home;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.Toast;

import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.map.MKMapViewListener;
import com.baidu.mapapi.map.MapController;
import com.baidu.mapapi.map.MapPoi;
import com.baidu.mapapi.map.MapView;
import com.baidu.platform.comapi.basestruct.GeoPoint;

public class LocationActivity extends Activity {
	/** 定义LocationManager对象 */
	private LocationManager locationManager;
	/** 定义当前Location对象 */
	private Location currentLocation;
	/** 显示地图的View */
	private MapView mMapView = null;
	/**
	 * 用MapController完成地图控制
	 */
	private MapController mMapController = null;
	/**
	 * MKMapViewListener 用于处理地图事件回调
	 */
	MKMapViewListener mMapListener = null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		/**
		 * 使用地图sdk前需先初始化BMapManager. BMapManager是全局的,可为多个MapView共用,它需要地图模块创建前创建,
		 * 并在地图地图模块销毁后销毁,只要还有地图模块在使用,BMapManager就不应该销毁
		 */
		DemoApplication app = (DemoApplication) this.getApplication();
		if (app.mBMapManager == null) {
			app.mBMapManager = new BMapManager(this);
			/**
			 * 如果BMapManager没有初始化则初始化BMapManager
			 */
			app.mBMapManager.init(DemoApplication.strKey,
					new DemoApplication.MyGeneralListener());
		}
		setContentView(R.layout.main);
		init();
	}

	/**
	 * 初始化
	 */
	private void init() {
		// 获取系统LocationManager服务
		locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
		// // 从GPS获取最近的定位信息
		currentLocation = locationManager
				.getLastKnownLocation(LocationManager.GPS_PROVIDER);
		// 绑定监听,有4个参数
		// 参数1,设备:有GPS_PROVIDER和NETWORK_PROVIDER两种
		// 参数2,位置信息更新周期,单位毫秒
		// 参数3,位置变化最小距离:当位置距离变化超过此值时,将更新位置信息
		// 参数4,监听
		// 备注:对于参数2和3:若参数3不为0,则以参数3为准;若参数3为0,则通过时间来定时更新;两者为0,则随时刷新
		locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2,
				1, new LocationListener() {

					@Override
					public void onLocationChanged(Location location) {
						updateMap(location);
					}

					@Override
					public void onProviderDisabled(String provider) {
						updateMap(null);
					}

					@Override
					public void onProviderEnabled(String provider) {
						updateMap(locationManager
								.getLastKnownLocation(provider));

					}

					@Override
					public void onStatusChanged(String provider, int status,
							Bundle extras) {
					}
				});
		initMap();
	}

	/**
	 * 初始化地图
	 */
	private void initMap() {
		mMapView = (MapView) findViewById(R.id.main_bmapView);
		/**
		 * 获取地图控制器
		 */
		mMapController = mMapView.getController();
		/**
		 * 设置地图是否响应点击事件 .
		 */
		mMapController.enableClick(true);
		/**
		 * 设置地图缩放级别
		 */
		mMapController.setZoom(12);
		double cLat = 39.945;
		double cLon = 116.404;
		// 如果未能定位则设置默认中心点为天安门
		GeoPoint p = new GeoPoint((int) (cLat * 1E6), (int) (cLon * 1E6));
		mMapController.setCenter(p);
		updateMap(currentLocation);
		mMapListener = new MKMapViewListener() {
			@Override
			public void onMapMoveFinish() {
				/**
				 * 在此处理地图移动完成回调 缩放,平移等操作完成后,此回调被触发
				 */
			}

			@Override
			public void onClickMapPoi(MapPoi mapPoiInfo) {
				/**
				 * 在此处理底图poi点击事件 显示底图poi名称并移动至该点 设置过:
				 * mMapController.enableClick(true); 时,此回调才能被触发
				 * 
				 */
				String title = "";
				if (mapPoiInfo != null) {
					title = mapPoiInfo.strText;
					Toast.makeText(LocationActivity.this, title,
							Toast.LENGTH_SHORT).show();
					mMapController.animateTo(mapPoiInfo.geoPt);
				}
			}

			@Override
			public void onGetCurrentMap(Bitmap b) {
				/**
				 * 当调用过 mMapView.getCurrentMap()后,此回调会被触发 可在此保存截图至存储设备
				 */
			}

			@Override
			public void onMapAnimationFinish() {
				/**
				 * 地图完成带动画的操作(如: animationTo())后,此回调被触发
				 */
			}

			/**
			 * 在此处理地图加载完成事件
			 */
			@Override
			public void onMapLoadFinish() {
				Toast.makeText(LocationActivity.this, "地图加载完成",
						Toast.LENGTH_SHORT).show();

			}
		};
		mMapView.regMapViewListener(DemoApplication.getInstance().mBMapManager,
				mMapListener);
	}

	@Override
	protected void onPause() {
		/**
		 * MapView的生命周期与Activity同步,当activity挂起时需调用MapView.onPause()
		 */
		mMapView.onPause();
		super.onPause();
	}

	@Override
	protected void onResume() {
		/**
		 * MapView的生命周期与Activity同步,当activity恢复时需调用MapView.onResume()
		 */
		mMapView.onResume();
		super.onResume();
	}

	@Override
	protected void onDestroy() {
		/**
		 * MapView的生命周期与Activity同步,当activity销毁时需调用MapView.destroy()
		 */
		mMapView.destroy();
		super.onDestroy();
	}

	@Override
	protected void onSaveInstanceState(Bundle outState) {
		super.onSaveInstanceState(outState);
		mMapView.onSaveInstanceState(outState);

	}

	@Override
	protected void onRestoreInstanceState(Bundle savedInstanceState) {
		super.onRestoreInstanceState(savedInstanceState);
		mMapView.onRestoreInstanceState(savedInstanceState);
	}

	/**
	 * 更新地图
	 */
	private void updateMap(Location location) {
		if (location != null) {
			// 纬度
			double latitude = location.getLatitude();
			// 经度
			double longitude = location.getLongitude();
			GeoPoint p = new GeoPoint((int) (latitude * 1E6),
					(int) (longitude * 1E6));
			mMapController.setCenter(p);
		}
	}
}

Application类与上文完全一样。

Manifest里面比上文多加一个如下权限:

 <!-- 使用GPS需要的权限 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

布局文件也和上文完全一样。
附上图片效果:

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

u010142437

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值