百度地图API Android SDK开发笔记二实现公交车查询

在上次正常显示百度地图的基础上,这次添加了搜索公交车功能,显示交通路线,以及卫星地图切换功能。整个过程如下

一、注册账号,获取key

这个和google有点类似,不过要简单的多,并且也没有使用限次,据说是免费的。

进入百度开发者中心http://developer.baidu.com/,注册个账号,安要求做OK。在主页点百度地图API,接着在下面些点Android SDK,开始百度地图Android SDK开发。获取密钥,申请key简单描述哈,就可以生成API密钥,记下这个以后程序会用到。

二、新建AVD模拟器

启动eclipse。选择Window/Android Virtual Device Manager,弹出Android Virtual Device Manager选择New,新建AVD信息如下:

接着选择新建的AVD,start接着Launch就开启AVD了,开启时间有点长,一般开了就不关。不管它下面新建Android工程

三、新建Android Application Project

File/New/Android Application Project,创建自己的工程,我的如下:

Application Name:mapsearch
Porject Name:mapsearch
Package Name: com.example.mapsearch

Minimum Required SDK:API 10:Android 2.3.3(Gingerbread)
Target SDK:API 14:Android 4.0 (IceCreamSandwich)
Compile With:API 14:Android 4.0 (IceCreamSandwich)
Theme:None

剩下的Next保持默认不变,Finish就OK。下面仿照官方编写代码http://developer.baidu.com/map/sdkandev-2.htm ,我完全按官方的来发现编译通不过,就仿照给的例子修改。其中用到的库在官方网站上都有下的,在相关下载下BaiduMap_AndroidSDK_v2.1.1_Lib.zip、BaiduMap_AndroidSDK_v2.1.1_Sample.zip即可。

1.添加库、设置工程属性

将下载的库添加到新建工程中。在左边Package Explore,mapsbase工程libs目录下新建armeabi文件夹。接着把下载的baidumapapi_v2_1_1.jar、locSDK_3.1.jar拖到libs目录,libapp_BaiduMapApplib_v2_1_1.so、libvi_voslib.so 和liblocSDK3.so拖到刚刚建的armeabi目录。接着在工程属性->Java Build Path->Libraries中选择“Add External JARs”,选定baidumapapi_v2_1_1.jar,确定后返回。通过以上两步操作后,您就可以正常使用百度地图SDK为您提供的全部功能了

2.编写代码

在前面正常显示地图基础上,增加搜索功能及地图图层显示·,我的代码如下:

根目录下AndroidMainfest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.mapsearch"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="10"
        android:targetSdkVersion="14" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
 
		<activity android:name=".MapDemo"
        android:screenOrientation="sensor"
        android:configChanges="orientation|keyboardHidden">
		</activity>
        <activity
            android:name="com.example.mapsearch.MainActivity"
            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>
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.USE_CREDENTIALS" />
    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
    <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />

    <permission android:name="android.permission.BAIDU_LOCATION_SERVICE" >
    </permission>

    <uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE" >
    </uses-permission>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
    </uses-permission>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" >
    </uses-permission>
    <uses-permission android:name="android.permission.INTERNET" >
    </uses-permission>
    <uses-permission android:name="android.permission.ACCES_MOCK_LOCATION" >
    </uses-permission>
    <!-- <uses-permission android:name="android.permission.WRITE_APN_SETTINGS"></uses-permission> -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >
    </uses-permission>
    <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
    <uses-permission android:name="android.permission.WAKE_LOCK" >
    </uses-permission>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_GPS" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.SEND_SMS" />
    <!-- SDK1.5需要android.permission.GET_TASKS权限判断本程序是否为当前运行的应用? -->
    <uses-permission android:name="android.permission.GET_TASKS" />
    <uses-permission android:name="android.permission.CAMERA" >
    </uses-permission>
    <uses-permission android:name="android.permission.RECORD_AUDIO" >
    </uses-permission>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
    </uses-permission>
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.BROADCAST_STICKY" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <!-- 来电消音 -->
    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" >
    </uses-permission>
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

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

</manifest>

文件

res/layout/activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">

    <LinearLayout 
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">
    
    <TextView android:text="在"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" />

	<EditText
		android:id="@+id/city"
	    android:layout_width="wrap_content" 
	    android:layout_height="wrap_content" 
	    android:text="成都" />

    <TextView android:text="市内找"
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" />

	<EditText
		android:id="@+id/searchkey"
	    android:layout_width="wrap_content" 
	    android:layout_height="wrap_content" 
	    android:text="96" />

	<TextView
	    android:layout_width="wrap_content" 
	    android:layout_height="wrap_content" 
	    android:text="公交车" />

    <Button
        android:id="@+id/search"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="开始" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="切换" />

    </LinearLayout>

    <com.baidu.mapapi.map.MapView
        android:id="@+id/bmapsView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:clickable="true" >
    </com.baidu.mapapi.map.MapView>

</LinearLayout>

文件src/com.example.mapsearch/MainActivity.java:

package com.example.mapsearch;

import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
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.mapapi.map.RouteOverlay;
import com.baidu.mapapi.search.MKAddrInfo;
import com.baidu.mapapi.search.MKBusLineResult;
import com.baidu.mapapi.search.MKDrivingRouteResult;
import com.baidu.mapapi.search.MKPoiInfo;
import com.baidu.mapapi.search.MKPoiResult;
import com.baidu.mapapi.search.MKSearch;
import com.baidu.mapapi.search.MKSearchListener;
import com.baidu.mapapi.search.MKSuggestionResult;
import com.baidu.mapapi.search.MKTransitRouteResult;
import com.baidu.mapapi.search.MKWalkingRouteResult;
import com.baidu.platform.comapi.basestruct.GeoPoint;

public class MainActivity extends Activity {
	BMapManager mBMapMan = null;
	MapView mMapView = null;
	Button mBtnSearch = null;	// 搜索按钮
	Button mBtnAlt = null;	//  切换按钮
	MKSearch mSearch = null;	// 搜索模块,也可去掉地图模块独立使用
	String  mCityName = null;
	int i = 1;

	//@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		mBMapMan=new BMapManager(getApplication());
		mBMapMan.init("填你申请的key", null);  
		//注意:请在试用setContentView前初始化BMapManager对象,否则会报错
		setContentView(R.layout.activity_main);
		mMapView=(MapView)findViewById(R.id.bmapsView);
		mMapView.setBuiltInZoomControls(true);
		mMapView.setTraffic(true);
		//mMapView.setSatellite(true);
		//设置启用内置的缩放控件
		MapController mMapController=mMapView.getController();
		// 得到mMapView的控制权,可以用它控制和驱动平移和缩放
		GeoPoint point =new GeoPoint((int)(30.664* 1E6),(int)(104.071* 1E6));
		//用给定的经纬度构造一个GeoPoint,单位是微度 (度 * 1E6)
		mMapController.setCenter(point);//设置地图中心点
		mMapController.setZoom(12);//设置地图zoom级别
		
        // 初始化搜索模块,注册事件监听
        mSearch = new MKSearch();
        mSearch.init(mBMapMan, new MKSearchListener(){

            @Override
            public void onGetPoiDetailSearchResult(int type, int error) {
            }
            
			public void onGetPoiResult(MKPoiResult res, int type, int error) {
				// 错误号可参考MKEvent中的定义
				if (error != 0 || res == null) {
					Toast.makeText(MainActivity.this, "抱歉,未找到结果", Toast.LENGTH_LONG).show();
					return;
		        }
				
				// 找到公交路线poi node
                MKPoiInfo curPoi = null;
                int totalPoiNum  = res.getCurrentNumPois();
				for( int idx = 0; idx < totalPoiNum; idx++ ) {
                    if ( 2 == res.getPoi(idx).ePoiType ) {
                        // poi类型,0:普通点,1:公交站,2:公交线路,3:地铁站,4:地铁线路
                        curPoi = res.getPoi(idx);
                        mSearch.busLineSearch(mCityName, curPoi.uid);
                    	break;
                    }
				}
				
				// 没有找到公交信息
                if (curPoi == null) {
                    Toast.makeText(MainActivity.this, "抱歉,未找到结果", Toast.LENGTH_LONG).show();
                    return;
                }
				
			}
			public void onGetDrivingRouteResult(MKDrivingRouteResult res,
					int error) {
			}
			public void onGetTransitRouteResult(MKTransitRouteResult res,
					int error) {
			}
			public void onGetWalkingRouteResult(MKWalkingRouteResult res,
					int error) {
			}
			public void onGetAddrResult(MKAddrInfo res, int error) {
			}
			public void onGetBusDetailResult(MKBusLineResult result, int iError) {
				if (iError != 0 || result == null) {
					Toast.makeText(MainActivity.this, "抱歉,未找到结果", Toast.LENGTH_LONG).show();
					return;
		        }

				RouteOverlay routeOverlay = new RouteOverlay(MainActivity.this, mMapView);
			    // 此处仅展示一个方案作为示例
			    routeOverlay.setData(result.getBusRoute());
			    mMapView.getOverlays().clear();
			    mMapView.getOverlays().add(routeOverlay);
			    mMapView.refresh();
			    mMapView.getController().animateTo(result.getBusRoute().getStart());
			}
			@Override
			public void onGetSuggestionResult(MKSuggestionResult res, int arg1) {
			}

        });
        
        // 设定搜索按钮的响应
        mBtnSearch = (Button)findViewById(R.id.search);
        mBtnAlt = (Button)findViewById(R.id.button1);
        OnClickListener clickListener = new OnClickListener(){
			public void onClick(View v) {
				switch (v.getId()) {
				case R.id.search:
					SearchButtonProcess(v);
					break;
				case R.id.button1:
					i++;
					//SearchButtonProcess(v);
					if (i%2 == 0)
						mMapView.setSatellite(true);
					else
						mMapView.setSatellite(false);
					break;
				default:
					break;
				}
					
			}
        };
        
        mBtnSearch.setOnClickListener(clickListener); 
        mBtnAlt.setOnClickListener(clickListener); 
	}
	@Override
	protected void onDestroy(){
	        mMapView.destroy();
	        if(mBMapMan!=null){
	                mBMapMan.destroy();
	                mBMapMan=null;
	        }
	        super.onDestroy();
	}

	void SearchButtonProcess(View v) {
		if (mBtnSearch.equals(v)) {
			EditText editCity = (EditText)findViewById(R.id.city);
			EditText editSearchKey = (EditText)findViewById(R.id.searchkey);
			mCityName = editCity.getText().toString(); 
			mSearch.poiSearchInCity(mCityName, editSearchKey.getText().toString());
		}
	}
	@Override
	protected void onPause(){
	        mMapView.onPause();
	        if(mBMapMan!=null){
	                mBMapMan.stop();
	        }
	        super.onPause();
	}
	@Override
	protected void onResume(){
	        mMapView.onResume();
	        if(mBMapMan!=null){
	                mBMapMan.start();
	        }
	        super.onResume();
	}

}

代码就写完了,下面开始测试。

四、编译、测试

Project/Build all,修改直至无误,上面的程序在我机子上编译是OK的。开始测试吧,点DDMS看有没有发现模拟器设备,没有就Reset adb下,等发现设备后开始运行。右击工程属性选Run As/Android Application.开始运行,在Console/Android 就可以看到如下加载信息
[2013-05-17 21:01:59 - mapsearch] Android Launch!
[2013-05-17 21:01:59 - mapsearch] adb is running normally.
[2013-05-17 21:01:59 - mapsearch] Performing com.example.mapsearch.MainActivity activity launch
[2013-05-17 21:02:00 - mapsearch] Automatic Target Mode: using existing emulator 'emulator-5554' running compatible AVD 'em40'
[2013-05-17 21:02:00 - mapsearch] Uploading mapsearch.apk onto device 'emulator-5554'
[2013-05-17 21:02:11 - mapsearch] Installing mapsearch.apk...
[2013-05-17 21:02:49 - mapsearch] Success!
[2013-05-17 21:02:50 - mapsearch] Starting activity com.example.mapsearch.MainActivity on device emulator-5554
[2013-05-17 21:02:53 - mapsearch] ActivityManager: Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.example.mapsearch/.MainActivity }

单击开始搜索,如下:

查看卫星高清图,单击切换

单击切换,又回到以前

这是在模拟器的运行效果,安装到手机或平板界面也是这样,百度地图显示效果真心不错,百度地图给力

posted @ 2013-05-18 20:33  javawebsoa  Views(572)  Comments(0Edit  收藏  举报