zoukankan      html  css  js  c++  java
  • 百度地图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 }

    单击开始搜索,如下:

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

    单击切换,又回到以前

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

  • 相关阅读:
    归并排序
    msp430的时钟源设计
    插入排序
    msp430F5438A 的中断初步
    算法导论,第一节第二节课总结
    MSP430F5438A的时钟系统
    msp430F5438A 的ADC 研究
    图像处理基本原理(转载)
    C++标准库简介
    C# 接口 抽象类
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3086070.html
Copyright © 2011-2022 走看看