随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(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" />
布局文件也和上文完全一样。
附上图片效果: