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

一、注册账号,获取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.soliblocSDK3.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" /><EditTextandroid: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" /><EditTextandroid: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;//@Overrideprotected 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());}@Overridepublic 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);elsemMapView.setSatellite(false);break;default:break;}}        };                mBtnSearch.setOnClickListener(clickListener);         mBtnAlt.setOnClickListener(clickListener); }@Overrideprotected 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());}}@Overrideprotected void onPause(){        mMapView.onPause();        if(mBMapMan!=null){                mBMapMan.stop();        }        super.onPause();}@Overrideprotected 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 }

单击开始搜索,如下:

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

单击切换,又回到以前

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

更多相关文章

  1. Android周学习Step By Step(3)--应用工程文件组成
  2. 高德地图的调试版SHA1与发布版SHA1分别的获取,申请到KEY
  3. Android应用程序整合第三方API(以高德Map API为例)
  4. r.java文件没有生成
  5. 关于谷歌地图的问题:requires unavailable shared library com.go
  6. Android集成百度地图-----显示地图、定位、长按显示地址信息
  7. Android(安卓)Studio问题收集
  8. 【Android(安卓)Native Code开发系列】四 编译自己的Native Code
  9. 【已解决】Android(安卓)Studio 加载自定义properties文件出错ja

随机推荐

  1. PHP CLI模式开发
  2. 海图没有显示任何东西,只是空白的html页面
  3. 关注:PHP文件目录和文件本身的操作
  4. 确定脚本所在的服务器以及PHP中的配置的
  5. APMServ 在 Win7 下出现“APMServ-Apache
  6. PHP会话不能使用JQuery Ajax?
  7. Nginx 配置 thinkphp 的 pathinfo 及 隐
  8. php switch判断一个数所在的范围
  9. PHP+MySQL+Zend+phhMyAdmin教程
  10. 电商网站项目总结(面向对象编程篇)