Android百度地图使用之基本功能
jopen
11年前
本文介绍百度地图基本功能的使用,代码原型来自百度Demo:
注意需要到百度地图开放平台申请key和下载相应jar包:http://developer.baidu.com/map/sdkandev-download.htm
Activity:
package com.home; 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; import android.os.Bundle; import android.widget.Toast; import android.app.Activity; import android.graphics.Bitmap; /** * 演示MapView的基本用法 * * @author Administrator * */ public class BaseMapActivity extends Activity { /** * MapView 是地图主控件 */ 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); /** * 由于MapView在setContentView()中初始化,所以它需要在BMapManager初始化之后 */ setContentView(R.layout.main); mMapView = (MapView) findViewById(R.id.main_bmapView); /** * 获取地图控制器 */ mMapController = mMapView.getController(); /** * 设置地图是否响应点击事件 . */ mMapController.enableClick(true); /** * 设置地图缩放级别 */ mMapController.setZoom(12); /** * 将地图移动至指定点 * 使用百度经纬度坐标,可以通过http://api.map.baidu.com/lbsapi/getpoint/index * .html查询地理坐标 如果需要在百度地图上显示使用其他坐标系统的位置,请发邮件至mapapi@baidu.com申请坐标转换接口 */ double cLat = 30.67; double cLon = 104.10; // 设置中心点为成都市成华区 GeoPoint p = new GeoPoint((int) (cLat * 1E6), (int) (cLon * 1E6)); mMapController.setCenter(p); // 用于处理地图事件回调 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(BaseMapActivity.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(BaseMapActivity.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); } }
Application:
package com.home; import com.baidu.mapapi.BMapManager; import com.baidu.mapapi.MKGeneralListener; import com.baidu.mapapi.map.MKEvent; import android.app.Application; import android.content.Context; import android.widget.Toast; public class DemoApplication extends Application { private static DemoApplication mInstance = null; BMapManager mBMapManager = null; public static final String strKey = "0B0d1233eec3932c2273b4da82b27e36"; /* * 注意:为了给用户提供更安全的服务,Android SDK自v2.1.3版本开始采用了全新的Key验证体系。 * 因此,当您选择使用v2.1.3及之后版本的SDK时,需要到新的Key申请页面进行全新Key的申请, 申请及配置流程请参考开发指南的对应章节 */ @Override public void onCreate() { super.onCreate(); mInstance = this; initEngineManager(this); } public static DemoApplication getInstance() { return mInstance; } public void initEngineManager(Context context) { if (mBMapManager == null) { mBMapManager = new BMapManager(context); } if (!mBMapManager.init(strKey, new MyGeneralListener())) { Toast.makeText( DemoApplication.getInstance().getApplicationContext(), "BMapManager 初始化错误!", Toast.LENGTH_LONG).show(); } } // 常用事件监听,用来处理通常的网络错误,授权验证错误等 static class MyGeneralListener implements MKGeneralListener { @Override public void onGetNetworkState(int iError) { if (iError == MKEvent.ERROR_NETWORK_CONNECT) { Toast.makeText( DemoApplication.getInstance().getApplicationContext(), "网络出错!", Toast.LENGTH_LONG).show(); } else if (iError == MKEvent.ERROR_NETWORK_DATA) { Toast.makeText( DemoApplication.getInstance().getApplicationContext(), "输入正确的检索条件!", Toast.LENGTH_LONG).show(); } } @Override public void onGetPermissionState(int iError) { if (iError == MKEvent.ERROR_PERMISSION_DENIED) { // 授权Key错误: Toast.makeText( DemoApplication.getInstance().getApplicationContext(), "请输入正确的授权Key!", Toast.LENGTH_LONG).show(); } } } }
Manifest:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.home" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="10" /> <!-- 使用网络功能所需权限 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" > </uses-permission> <uses-permission android:name="android.permission.INTERNET" > </uses-permission> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" > </uses-permission> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" > </uses-permission> <!-- 读取手机的当前状态权限,没有的话会报错,这个是使用百度地图API必须的 --> <uses-permission android:name="android.permission.READ_PHONE_STATE" > </uses-permission> <!-- Cache功能需要读写外部存储器 ,若没这个权限,地图加载不出来 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" > </uses-permission> <!-- 添加屏幕支持 android:anyDensity="true" 这个属性指明应用程序是否包含了能够适用于任何屏幕密度的资源。 对于支持Android1.6(API Level 4)和更高版本的应用程序,这个属性的默认值是true, 并且除非绝对的确认这是应用程序正常工作所必须的,否则不应该把它设置为false。 只是在应用程序直接操作位图时才需要禁止这个属性。 android:largeScreens="true" 这个属性用于指示应用程序是否支持较大外形的屏幕。 一个large类型的屏幕被定义成一个比normal类型的手持设备的屏幕明显还要大的屏幕, 并且为了让应用程序能够良好的使用,使用这个属性时要特别小心,尽管可以依赖系统来调整尺寸, 以便能够填充屏幕。 这个属性的默认值实际上在某些版本之间是不同的,因此最好在任何时候都明确的声明这个属性。 如果设置为false,系统会启用屏幕兼容模式,这时要格外的小心。 android:normalScreens="true" 这个属性用于指示应用程序是否支持普通外形的屏幕。 典型的是HVGA中等密度的屏幕,但是WQVGA低密度和WVGA高密度屏幕也被认为是普通屏幕。 这个属性的默认值是true。 android:smallScreens="true" 这个属性用于指定应用程序是否支持较小外形的屏幕。 一个small类型的屏幕被定义成一个比normal(传统的HVGA)类型的屏幕还要小的屏幕。 外部服务(如Google Play)不会把不支持小屏的应用程序提供给小屏设备, 因为很少有能够确保该应用程序在小屏幕的设备上正常工作的平台。这个属性的默认值是true。 android:resizeable="true" 这个属性用于指示针对不同的屏幕尺寸,应用程序是否可以调整尺寸。默认值是true。 --> <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" /> <application android:name="com.home.DemoApplication" android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.home.BaseMapActivity" 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>
布局XML:
<LinearLayout 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/main_bmapView" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" /> </LinearLayout>