Layout中添加MapView控件用于展示地图
布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<!-- 地图的布局 -->
<com.baidu.mapapi.map.MapView
android:id="@+id/mapview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</RelativeLayout>
是setContentView之前创建管理工具,并初使化SDKInitializer在initialize时校验key(permission check error)和网络状态(network error),关于状态码信息我们可以在SDKInitializer查询。
需要注意的是:
1.控制MapView的onResume、onPause、onDestroy ;百度地图的生命周期方法
2.SDKInitializer对象创建一个就可以;
3.必须校验key,并且key值不能为空;
4.Initialize方法接受的参数必须是global Application,不能传递Activity
IntentFilter filter = new IntentFilter();
filter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR);
filter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR);
registerReceiver(receiver, filter);
public void onReceive(Context context, Intent intent) {
String result = intent.getAction();
// 判断网络
if (result
.equals(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR)) {
Toast.makeText(getApplicationContext(), "无网络", 0).show();
}
// 授权验证
else if (result
.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR)) {
Toast.makeText(getApplicationContext(), "授权失败", 0).show();
}
}
百度地图的控制管理
通过MapView设置缩放控件showZoomControls(false),默认显示
缩放级别:V2.0之前支持(3-18),V2.0之后多一级(3-19)
默认的缩放级别 12
设置地图的中心位置
BaiduMap baiduMap = mapView.getMap();
double latitude = 123.0432;//纬度
double longitude = 34.438;//经度
LatLng hmPos = new LatLng(latitude, longitude);
BaiduMap:控制地图移动、缩放、旋转
动画形式移动 :animateMapStatus(MapStatusUpdate)
缩放:MapStatusUpdateFactory:
zoomOut()—缩小;zoomIn()—放大;zoomTo (float)—指 定缩放级别;zoomBy(float) —按增量缩放级别;
旋转:MapStatus
水平方向:rotate(float),旋转角范围: 0 ~ 360 , 单位:度 默认值为0度,逆时针旋转为角度增大方向,通过BaiduMap的getMapStatus() .rotate获取当前角度
俯视: overlook(float) ,俯角范围: -45 ~ 0 , 单位: 度
指南针设置:UiSettings().setCompassPosition(new Point(x, y)),坐标系原点为MapView左上顶点 ,指南针在3D模式下自动显现,隐藏指南针UiSettings().setCompassEnabled(false)
BaiduMap :处理地图事件
setOnMapClickListener(BaiduMap.OnMapClickListener listener)设置地图单击事件监听者
setOnMarkerClickListener(BaiduMap.OnMarkerClickListener listener)设置地图 Marker 覆盖物点击事件监听者
setOnMapDoubleClickListener(BaiduMap.OnMapDoubleClickListener listener)设置地图双击事件监听者
snapshot(BaiduMap.SnapshotReadyCallback callback)发起截图请求
需要引入包
需要添加权限
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ldw.zbqq"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<!-- 这个权限用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" >
</uses-permission>
<!-- 这个权限用于访问GPS定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >
</uses-permission>
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
</uses-permission>
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
</uses-permission>
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 -->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
</uses-permission>
<!-- 用于读取手机当前的状态 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" >
</uses-permission>
<!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
</uses-permission>
<!-- 访问网络,网络定位需要上网 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- SD卡读取权限,用户写入离线定位数据 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" >
</uses-permission>
<!-- 允许应用读取低级别的系统日志文件 -->
<uses-permission android:name="android.permission.READ_LOGS" >
</uses-permission>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="HmmKW1mdCYxAqGTzZVjwFov3wjaw5jwt" />
<activity
android:name="com.ldw.zbqq.HelloWord"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Hello.java
package com.ldw.zbqq;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.model.LatLng;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.widget.Toast;
public class HelloWord extends Activity {
private MyBaduSdkReceiver baduSdkReceiver;
private MapView mapview;
private BaiduMap baiduMap;
private double latitude = 23;// 纬度
private double longitude = 114;// 经度
private LatLng hmPos = new LatLng(latitude, longitude);//创建一个经纬度
private static final String TAG = "HelloWorld";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 初始化地图
initManager();
setContentView(R.layout.common);
init();
}
//使用MapStatusUpdate修改地图的状态
private void init() {
// 设置地图级别(V2.X 3-19级 V1.X 3-18)
// ① 修改了文件的格式 优化了空间的使用(北京 110M 15M)
// ② 增加了级别 3D效果(18 19级的时候可以显示)
mapview = (MapView) findViewById(R.id.mapview);
//获取到地图控制器
baiduMap = mapview.getMap();
// BaiduMap: 管理具体的某一个MapView : 旋转,移动,缩放,事件。。
// 描述地图状态将要发生的变化 使用工厂类MapStatusUpdateFactory创建
MapStatusUpdate mapstatusUpdate = MapStatusUpdateFactory.zoomTo(19);// 默认的级别12
// 设置缩放级别
baiduMap.setMapStatus(mapstatusUpdate);
//LatLng latlng = new LatLng(arg0, arg1);// 坐标 经纬度 参数1 纬度 参数2 经度
MapStatusUpdate mapstatusUpdatePoint = MapStatusUpdateFactory
.newLatLng(hmPos);
// 设置中心点 默认是天安门
baiduMap.setMapStatus(mapstatusUpdatePoint);
// mapview.showZoomControls(false);// 默认是true 显示缩放按钮
//
// mapview.showScaleControl(false);// 默认是true 显示比例尺
}
//按不同的按键调用不同的方法,都使用MapStatusUpdate修改地图的状态
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// 旋转,移动,缩放
switch (keyCode) {
case KeyEvent.KEYCODE_1:
// 放大
// 放大地图缩放级别 每次放大一个级别
MapStatusUpdate zoomInStatus = MapStatusUpdateFactory.zoomIn();
baiduMap.setMapStatus(zoomInStatus);
break;
case KeyEvent.KEYCODE_2:
// 缩小
// 缩小地图缩放级别 每次缩小一个级别
MapStatusUpdate zooOutStatus = MapStatusUpdateFactory.zoomOut();
baiduMap.setMapStatus(zooOutStatus);
break;
case KeyEvent.KEYCODE_3:
// 以一个点为中心 旋转
MapStatus mapStatus = baiduMap.getMapStatus();// 获取地图的当前状态
float rotate = mapStatus.rotate;
Log.d(TAG, "rotate:" + rotate);
// 旋转 范围0~360
MapStatus rotateStatus = new MapStatus.Builder().rotate(rotate+30).build();
// 创建新的MapStatus
MapStatusUpdate rotateStatusUpdate = MapStatusUpdateFactory.newMapStatus(rotateStatus);
baiduMap.setMapStatus(rotateStatusUpdate);
break;
case KeyEvent.KEYCODE_4:
// 已一条直线 为轴 旋转 Overlooking 俯角
MapStatus mapStatusOver = baiduMap.getMapStatus();// 获取地图的当前状态
float overlook = mapStatusOver.overlook;
Log.d(TAG, "overlook:" + overlook);
// 0~45
MapStatus overStatus = new MapStatus.Builder().overlook(overlook-5).build();
//创建新的MapStatus
MapStatusUpdate overStatusUpdate = MapStatusUpdateFactory.newMapStatus(overStatus);
baiduMap.setMapStatus(overStatusUpdate);
break;
case KeyEvent.KEYCODE_5:
// 移动
MapStatusUpdate moveStatusUpdate = MapStatusUpdateFactory.newLatLng(new LatLng(40.065796,116.349868));
// 带动画的更新地图状态 耗时300毫秒
baiduMap.animateMapStatus(moveStatusUpdate);
break;
default:
break;
}
return super.onKeyDown(keyCode, event);
}
private void initManager() {
//必须先初始化
SDKInitializer.initialize(getApplicationContext()); // 不能传递Activity,必须是全局Context
baduSdkReceiver = new MyBaduSdkReceiver();
//添加filter
IntentFilter filter = new IntentFilter();
filter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR);// 注册网络错误
filter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR); // 注册key校验结果
registerReceiver(baduSdkReceiver, filter);
}
//调用百度地图的生命周期方法
@Override
protected void onResume() {
mapview.onResume();
super.onResume();
}
//调用百度地图的生命周期方法
@Override
protected void onPause() {
mapview.onPause();
super.onPause();
}
//销毁广播并调用百度地图的生命周期方法
@Override
protected void onDestroy() {
unregisterReceiver(baduSdkReceiver);
mapview.onDestroy();
super.onDestroy();
}
//注册一个广播
class MyBaduSdkReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String result = intent.getAction();
if (result.equals(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR)) {
// 网络错误
Toast.makeText(getApplicationContext(), "无网络", 0).show();
} else if (result.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR)) {
// key校验失败
Toast.makeText(getApplicationContext(), "校验失败", 0).show();
}
}
}
}