Android如何使用百度地图

   刚学完android,决定来个小小应用。做什么呢?之前在公司看人家用ios做的地图不错,干脆我就做个android版吧。

   百度了一下它的api,很简单。花了半天解决。首先新建一个工程,然后把baidumapapi.jar拷贝到工程下的lib文件夹里,同时在里面建一个文件夹armeabi,再把libBMapApiEngine_v1_3_3.so动态库文件拷进去,打开eclipse,右键点击工程的Properties,进入Java Build Path,打开Libraries,点击Add External JARS,把baidumapapi.jar添加进去,ok,配置好了。

   自定义一个Aplication类,WhereMapApplication,继承自Application(拷贝自官方百度):

public class WhereMapApplication extends Application {
	
	static WhereMapApplication mDemoApp;
	
	//百度MapAPI的管理类
	BMapManager mBMapMan = null;
	
	// 授权Key
	// TODO: 请输入您的Key,
	// 申请地址:http://dev.baidu.com/wiki/static/imap/key/
	String mStrKey = "申请的KEY值";
	boolean m_bKeyRight = true;	// 授权Key正确,验证通过
	
	// 常用事件监听,用来处理通常的网络错误,授权验证错误等
	static class MyGeneralListener implements MKGeneralListener {
		@Override
		public void onGetNetworkState(int iError) {
			Log.d("MyGeneralListener", "onGetNetworkState error is "+ iError);
			Toast.makeText(WhereMapApplication.mDemoApp.getApplicationContext(), "您的网络出错啦!",
					Toast.LENGTH_LONG).show();
		}

		@Override
		public void onGetPermissionState(int iError) {
			Log.d("MyGeneralListener", "onGetPermissionState error is "+ iError);
			if (iError ==  MKEvent.ERROR_PERMISSION_DENIED) {
				// 授权Key错误:
				Toast.makeText(WhereMapApplication.mDemoApp.getApplicationContext(), 
						"请在BMapApiDemoApp.java文件输入正确的授权Key!",
						Toast.LENGTH_LONG).show();
				WhereMapApplication.mDemoApp.m_bKeyRight = false;
			}
		}
	}

	@Override
    public void onCreate() {
		Log.v("BMapApiDemoApp", "onCreate");
		mDemoApp = this;
		mBMapMan = new BMapManager(this);
		mBMapMan.init(this.mStrKey, new MyGeneralListener());
		mBMapMan.getLocationManager().setNotifyInternal(10, 5);
//		if (mBMapMan != null) {
//			mBMapMan.destroy();
//			mBMapMan = null;
//		}
		
		super.onCreate();
	}

	@Override
	//建议在您app的退出之前调用mapadpi的destroy()函数,避免重复初始化带来的时间消耗
	public void onTerminate() {
		// TODO Auto-generated method stub
		if (mBMapMan != null) {
			mBMapMan.destroy();
			mBMapMan = null;
		}
		super.onTerminate();
	}
}

百度API地址: http://dev.baidu.com/wiki/static/index.htm

百度申请key地址:http://dev.baidu.com/wiki/static/imap/key/
注册百度用户,再申请key值,把key值替换以上代码中的"申请的KEY值"。

修改AndroidManifest.xml文件中application的属性,添加android:name=".WhereMapApplication"如下:

<application
        android:name=".WhereMapApplication"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >

并且在之前添加,如果加在最后有可能会有警告产生:

<uses-sdk
        android:minSdkVersion="3" />

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
    </uses-permission>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >
    </uses-permission>
    <uses-permission android:name="android.permission.INTERNET" >
    </uses-permission>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
    </uses-permission>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
    </uses-permission>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
    </uses-permission>
    <uses-permission android:name="android.permission.READ_PHONE_STATE" >
    </uses-permission>

    <supports-screens
        android:anyDensity="true"
        android:largeScreens="true"
        android:normalScreens="true"
        android:resizeable="true"
        android:smallScreens="true" />


如果想使用在activity里面,就需要新建一个自定义的activity继承自MapActivity。我创建了一个MainActivity,如下:

public class MainActivity extends MapActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        WhereMapApplication app = (WhereMapApplication)this.getApplication();
		if (app.mBMapMan == null) {
			app.mBMapMan = new BMapManager(getApplication());
			app.mBMapMan.init(app.mStrKey, new WhereMapApplication.MyGeneralListener());
		}
		app.mBMapMan.start();
		
		// 如果使用地图SDK,请初始化地图Activity
//		long iTime = System.nanoTime();
        super.initMapActivity(app.mBMapMan);
//        iTime = System.nanoTime() - iTime;
//        Log.d("MapViewDemo", "the init time is  " + iTime);
        MapView mapView = (MapView)findViewById(R.id.bmapView);
        mapView.setBuiltInZoomControls(true);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

	@Override
	protected boolean isRouteDisplayed() {
		// TODO Auto-generated method stub
		return false;
	}
	
	@Override
	protected void onPause() {
		WhereMapApplication app = (WhereMapApplication)this.getApplication();
		if(app.mBMapMan != null )
			app.mBMapMan.stop();
		super.onPause();
	}
	@Override
	protected void onResume() {
		WhereMapApplication app = (WhereMapApplication)this.getApplication();
		app.mBMapMan.start();
		super.onResume();
	}
}

BMapManager在application中new之后,使用init初始化之后,在需要的activity里面使用start,stop就可以控制map的显示和关闭:

public class MainActivity extends MapActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        WhereMapApplication app = (WhereMapApplication)this.getApplication();
		if (app.mBMapMan == null) {
			app.mBMapMan = new BMapManager(getApplication());
			app.mBMapMan.init(app.mStrKey, new WhereMapApplication.MyGeneralListener());
		}
		app.mBMapMan.start();
		
		// 如果使用地图SDK,请初始化地图Activity
//		long iTime = System.nanoTime();
        super.initMapActivity(app.mBMapMan);
//        iTime = System.nanoTime() - iTime;
//        Log.d("MapViewDemo", "the init time is  " + iTime);
        MapView mapView = (MapView)findViewById(R.id.bmapView);
        mapView.setBuiltInZoomControls(true);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

	@Override
	protected boolean isRouteDisplayed() {
		// TODO Auto-generated method stub
		return false;
	}
	
	@Override
	protected void onPause() {
		WhereMapApplication app = (WhereMapApplication)this.getApplication();
		if(app.mBMapMan != null )
			app.mBMapMan.stop();
		super.onPause();
	}
	@Override
	protected void onResume() {
		WhereMapApplication app = (WhereMapApplication)this.getApplication();
		app.mBMapMan.start();
		super.onResume();
	}
}

这个时候已经能显示出地图了,不过是在模拟器上测试的,没有真机,只能先写在这里了。其余如打点,搜索等功能在官方代码中均有详细说明,就不一一描述了。


猜你喜欢

转载自blog.csdn.net/rsp19801226/article/details/7860087