我想大家可能都有過這樣的經(jīng)歷:兜里揣著一張銀行卡,在街上到處找自動(dòng)取款機(jī)(ATM)。在這個(gè)場景中,ATM就是的興趣點(diǎn),我們想做的事情就是找到離自己較近的一些ATM然后取款,此時(shí)我們并不關(guān)心附近有哪些超市、酒吧,因?yàn)檫@些地方?jīng)]辦法取錢!
說了這么多,一方面是加深大家對(duì)POI這個(gè)詞的認(rèn)識(shí),另一方面也是為了讓大家明白我們接下來要做的事情。理論性的東西就不再多講了,直接來看例子。
先給大家展示下效果圖:

詳細(xì)界面:

該示例主要介紹關(guān)鍵詞查詢、suggestion查詢和查看餐飲類Place詳情頁功能,尤其搜索某個(gè)地方的餐廳、理發(fā)店等等比較有實(shí)際意義,百度Demo代碼如下:
Activity:
package com.home;import android.app.Activity;import android.os.Bundle;import android.text.Editable;import android.text.TextWatcher;import android.view.View;import android.widget.ArrayAdapter;import android.widget.AutoCompleteTextView;import android.widget.EditText;import android.widget.Toast;import com.baidu.mapapi.BMapManager;import com.baidu.mapapi.map.MapView;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.MKShareUrlResult;import com.baidu.mapapi.search.MKSuggestionInfo;import com.baidu.mapapi.search.MKSuggestionResult;import com.baidu.mapapi.search.MKTransitRouteResult;import com.baidu.mapapi.search.MKWalkingRouteResult;/*** 演示poi搜索功能*/public class PoiSearchActivity extends Activity {private MapView mMapView = null;private MKSearch mSearch = null; // 搜索模塊,也可去掉地圖模塊獨(dú)立使用/*** 搜索關(guān)鍵字輸入窗口*/private AutoCompleteTextView keyWorldsView = null;private ArrayAdapter<String> sugAdapter = null;private int load_Index;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);DemoApplication app = (DemoApplication) this.getApplication();if (app.mBMapManager == null) {app.mBMapManager = new BMapManager(this);app.mBMapManager.init(DemoApplication.strKey,new DemoApplication.MyGeneralListener());}setContentView(R.layout.activity_poisearch);mMapView = (MapView) findViewById(R.id.bmapView);mMapView.getController().enableClick(true);mMapView.getController().setZoom(12);// 初始化搜索模塊,注冊(cè)搜索事件監(jiān)聽mSearch = new MKSearch();mSearch.init(app.mBMapManager, new MKSearchListener() {// 在此處理詳情頁結(jié)果@Overridepublic void onGetPoiDetailSearchResult(int type, int error) {if (error != 0) {Toast.makeText(PoiSearchActivity.this, "抱歉,未找到結(jié)果",Toast.LENGTH_SHORT).show();} else {Toast.makeText(PoiSearchActivity.this, "成功,查看詳情頁面",Toast.LENGTH_SHORT).show();}}/*** 在此處理poi搜索結(jié)果*/public void onGetPoiResult(MKPoiResult res, int type, int error) {// 錯(cuò)誤號(hào)可參考MKEvent中的定義if (error != 0 || res == null) {Toast.makeText(PoiSearchActivity.this, "抱歉,未找到結(jié)果",Toast.LENGTH_LONG).show();return;}// 將地圖移動(dòng)到第一個(gè)POI中心點(diǎn)if (res.getCurrentNumPois() > 0) {// 將poi結(jié)果顯示到地圖上MyPoiOverlay poiOverlay = new MyPoiOverlay(PoiSearchActivity.this, mMapView, mSearch);poiOverlay.setData(res.getAllPoi());mMapView.getOverlays().clear();mMapView.getOverlays().add(poiOverlay);mMapView.refresh();// 當(dāng)ePoiType為2(公交線路)或4(地鐵線路)時(shí), poi坐標(biāo)為空for (MKPoiInfo info : res.getAllPoi()) {if (info.pt != null) {mMapView.getController().animateTo(info.pt);break;}}} else if (res.getCityListNum() > 0) {// 當(dāng)輸入關(guān)鍵字在本市沒有找到,但在其他城市找到時(shí),返回包含該關(guān)鍵字信息的城市列表String strInfo = "在";for (int i = 0; i < res.getCityListNum(); i++) {strInfo += res.getCityListInfo(i).city;strInfo += ",";}strInfo += "找到結(jié)果";Toast.makeText(PoiSearchActivity.this, strInfo,Toast.LENGTH_LONG).show();}}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) {}/*** 更新建議列表*/@Overridepublic void onGetSuggestionResult(MKSuggestionResult res, int arg1) {if (res == null || res.getAllSuggestions() == null) {return;}sugAdapter.clear();for (MKSuggestionInfo info : res.getAllSuggestions()) {if (info.key != null)sugAdapter.add(info.key);}sugAdapter.notifyDataSetChanged();}@Overridepublic void onGetShareUrlResult(MKShareUrlResult result, int type,int error) {}});keyWorldsView = (AutoCompleteTextView) findViewById(R.id.searchkey);sugAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line);keyWorldsView.setAdapter(sugAdapter);/*** 當(dāng)輸入關(guān)鍵字變化時(shí),動(dòng)態(tài)更新建議列表*/keyWorldsView.addTextChangedListener(new TextWatcher() {@Overridepublic void afterTextChanged(Editable arg0) {}@Overridepublic void beforeTextChanged(CharSequence arg0, int arg1,int arg2, int arg3) {}@Overridepublic void onTextChanged(CharSequence cs, int arg1, int arg2,int arg3) {if (cs.length() <= 0) {return;}String city = ((EditText) findViewById(R.id.city)).getText().toString();/*** 使用建議搜索服務(wù)獲取建議列表,結(jié)果在onSuggestionResult()中更新*/mSearch.suggestionSearch(cs.toString(), city);}});}@Overrideprotected void onPause() {mMapView.onPause();super.onPause();}@Overrideprotected void onResume() {mMapView.onResume();super.onResume();}@Overrideprotected void onDestroy() {mMapView.destroy();super.onDestroy();}@Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);mMapView.onSaveInstanceState(outState);}@Overrideprotected void onRestoreInstanceState(Bundle savedInstanceState) {super.onRestoreInstanceState(savedInstanceState);mMapView.onRestoreInstanceState(savedInstanceState);}/*** 影響搜索按鈕點(diǎn)擊事件** @param v*/public void searchButtonProcess(View v) {EditText editCity = (EditText) findViewById(R.id.city);EditText editSearchKey = (EditText) findViewById(R.id.searchkey);mSearch.poiSearchInCity(editCity.getText().toString(), editSearchKey.getText().toString());}public void goToNextPage(View v) {// 搜索下一組poiint flag = mSearch.goToPoiPage(++load_Index);if (flag != 0) {Toast.makeText(PoiSearchActivity.this, "先搜索開始,然后再搜索下一組數(shù)據(jù)",Toast.LENGTH_SHORT).show();}}}布局XML(activity_poisearch):
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical" ><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="50dip"android:orientation="horizontal" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="在" ></TextView><EditTextandroid:id="@+id/city"android:layout_width="wrap_content"android:layout_height="match_parent"android:text="北京" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="市內(nèi)找" ></TextView><AutoCompleteTextViewandroid:id="@+id/searchkey"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="0.88"android:text="餐廳" /></LinearLayout><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="50dip"android:orientation="horizontal" ><Buttonandroid:id="@+id/search"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_weight="12"android:background="@drawable/button_style"android:onClick="searchButtonProcess"android:padding="10dip"android:text="開始" /><Buttonandroid:id="@+id/map_next_data"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_weight="12"android:background="@drawable/button_style"android:onClick="goToNextPage"android:padding="10dip"android:text="下一組數(shù)據(jù)" /></LinearLayout><com.baidu.mapapi.map.MapViewandroid:id="@+id/bmapView"android:layout_width="fill_parent"android:layout_height="fill_parent"android:clickable="true" /></LinearLayout>
MyPoiOverlay類
package com.home;import android.app.Activity;import com.baidu.mapapi.map.MapView;import com.baidu.mapapi.map.PoiOverlay;import com.baidu.mapapi.search.MKPoiInfo;import com.baidu.mapapi.search.MKSearch;public class MyPoiOverlay extends PoiOverlay {MKSearch mSearch;public MyPoiOverlay(Activity activity, MapView mapView, MKSearch search) {super(activity, mapView);mSearch = search;}@Overrideprotected boolean onTap(int i) {super.onTap(i);MKPoiInfo info = getPoi(i);if (info.hasCaterDetails) {mSearch.poiDetailSearch(info.uid);}return true;}}在配置文件中要比之前多配置一個(gè)activity,不然沒法查看詳細(xì)界面,這是百度SDK jar中提供的類:
<activityandroid:name="com.baidu.mapapi.search.PlaceCaterActivity"android:configChanges="orientation|keyboardHidden"android:theme="@android:style/Theme.NoTitleBar" ></activity>
Application類同之前。
新聞熱點(diǎn)
疑難解答
圖片精選