官方文檔 http://lbsyun.baidu.com/index.php?title=androidsdk/guide/key
先去官方文檔申請秘鑰下載壓縮文件等操作,參考
公交,步行,駕車路線查詢,附近POI查詢
參考文檔導入所需jar包和so文件


標注點,覆蓋物的實現見官方文檔
poi檢索:
1.首先獲取地圖,創建poi檢索實例:
private void initView() { //輸入框 etPoi = (EditText) inflate.findViewById(R.id.fragment_detailpage_search_et_poi); //檢索圖標 ivSearch = (ImageView) inflate.findViewById(R.id.fragment_detailpage_search_iv_search); //設置點擊監聽 ivSearch.setOnClickListener(this); //獲取地圖控件引用 mMapView = (MapView)inflate.findViewById(R.id.bmapView); mBaiduMap = mMapView.getMap(); //普通地圖 mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL); //創建POI檢索實例 mPoiSearch = PoiSearch.newInstance();
//詳細信息布局 mMarkerInfoLayout = (RelativeLayout)inflate. findViewById(R.id.layout_map_rl_layout); }
2.為poi檢索設置監聽,監聽回調了兩個方法,第一個是poi檢索結果的監聽,當用戶進行poi檢索后,會回調該方法,第二個方法,是對檢索后顯示的標注點(marker)進行點擊后回調的方法,會傳入該點的詳情結果對象,我們可以通過該對象得到名字,地址,url地址等
//設置監聽 mPoiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() { /* 1.獲得poi檢索結果的監聽*/ @Override public void onGetPoiResult(PoiResult poiResult) {
//創建覆蓋物對象 myPoiOverlay = new MyPoiOverlay(mBaiduMap); myPoiOverlay.setData(poiResult); myPoiOverlay.addToMap(); myPoiOverlay.zoomToSpan(); //給poi的結果設置點擊事件,點擊marker后彈出詳情頁 mBaiduMap.setOnMarkerClickListener(myPoiOverlay); Log.i("tag", "獲得poi檢索結果的監聽 "); } /* 3. poi的詳情頁結果*/ @Override public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) { if (poiDetailResult.error != SearchResult.ERRORNO.NO_ERROR) { Toast.makeText(getActivity(), "抱歉,未找到結果", Toast.LENGTH_SHORT).show(); etPoi.setText(""); } else {// 正常返回結果的時候,此處可以獲得很多相關信息 //獲取詳情頁的請求結果 String detailUrl = poiDetailResult.getDetailUrl(); //得到當前經緯度 Log.i("tag", "獲取詳情頁的請求結果: detailUrl -" + poiDetailResult.getName() + ": " + poiDetailResult.getAddress()); Toast.makeText(getActivity(), detailUrl, Toast.LENGTH_SHORT).show(); //彈出窗體 // 設置詳細信息布局為可見 mMarkerInfoLayout.setVisibility(View.VISIBLE); //根據商家信息為詳細信息布局設置信息 popupInfo(mMarkerInfoLayout, poiDetailResult); }} @Override public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) { } });
上面創建的MyPoiOverlay是繼承了PoiOverLay的,需要重寫onPoiClick,當poi檢索的結果被點擊的時候回調該方法,然后通過獲得該標注點的uid得到詳情結果然后將詳情結果,傳入檢索監聽中的onGetPoiDetailResult(PoiDetailResult poiDetailResult),
注意:需要為marker設置點擊監聽,
mBaiduMap.setOnMarkerClickListener(myPoiOverlay);
class MyPoiOverlay extends PoiOverlay { /** * 構造函數 * * @param baiduMap 該 PoiOverlay 引用的 BaiduMap 對象 */ public MyPoiOverlay(BaiduMap baiduMap) { super(baiduMap); } /*2.當poi的結果點被點擊的時候調用*/ @Override public boolean onPoiClick(int i) { //獲取i對應的點的uid String uid = getPoiResult().getAllPoi().get(i).uid; Log.i("tag", "當poi的結果點被點擊的時候調用: "+uid); //uid是POI檢索中獲取的POI ID信息 mPoiSearch.searchPoiDetail((new PoiDetailSearchOption()).poiUid(uid)); return super.onPoiClick(i); } }
popInfo:使用viewHolder復用布局
private void popupInfo(RelativeLayout mMarkerInfoLayout,final PoiDetailResult poiDetailResult) { ViewHolder viewHolder = null; if(mMarkerInfoLayout.getTag() == null){ viewHolder = new ViewHolder(); viewHolder.poiName = (TextView) inflate.findViewById(R.id.layout_map_poiname); viewHolder.poiAddress = (TextView)inflate.findViewById(R.id.layout_map_poiaddress); viewHolder.poiSearch = (TextView) inflate.findViewById(R.id.layout_map_button); mMarkerInfoLayout.setTag(viewHolder); }else{ viewHolder = (ViewHolder) mMarkerInfoLayout.getTag(); viewHolder.poiName.setText(poiDetailResult.getName()); viewHolder.poiAddress.setText(poiDetailResult.getAddress()); viewHolder.poiSearch.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //彈出新的頁面展示poi詳情 Intent intent = new Intent(getActivity(), PoiDetailActivity.class); intent.putExtra("POI_DETAIL_URL",poiDetailResult.getDetailUrl()); startActivity(intent); } }); } } class ViewHolder{ TextView poiName; TextView poiSearch; TextView poiAddress; }
為地圖設置點擊事件,點擊隱藏布局
mBaiduMap.setOnMapClickListener(new BaiduMap.OnMapClickListener() { @Override public boolean onMapPoiClick(MapPoi arg0) { return false; } @Override public void onMapClick(LatLng arg0) { mMarkerInfoLayout.setVisibility(View.GONE); mBaiduMap.hideInfoWindow(); } });
開始搜索poi:按城市內搜索
public void onStartSearch(View view){ // String keyword = etKeyword.getText().toString().trim(); /* if (TextUtils.isEmpty(keyword)){ return; }*/ Log.i("tag", "onStartSearch: "); mPoiSearch.searchInCity(new PoiCitySearchOption().city("杭州").keyword("美食").pageNum(10)); /** * 附近檢索 */ /* PoiNearbySearchOption nearbySearchOption = new PoiNearbySearchOption(); nearbySearchOption.location(new LatLng(latitude, longitude)); nearbySearchOption.keyword(editSearchKeyEt.getText().toString()); nearbySearchOption.radius(1000);// 檢索半徑,單位是米 nearbySearchOption.pageNum(10); mPoiSearch.searchNearby(nearbySearchOption);// 發起附近檢索請求*/ }
DetailPoiActivity
public class PoiDetailActivity extends Activity { private WebView wbPoiDetail; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_poidetail); wbPoiDetail = (WebView) findViewById(R.id.wv_poidetail); Intent intent = getIntent(); String url = intent.getStringExtra("POI_DETAIL_URL"); Log.i("MainActivity", "url-" + url); //webview加載數據 wbPoiDetail.loadUrl(url); wbPoiDetail.setWebViewClient(new WebViewClient(){//解決辦法 public boolean shouldOverrideUrlLoading(WebView view, String url) { //返回true的時候網頁在webView中去打開,如果為false則是調用系統瀏覽器打開 view.loadUrl(url); return true; } }); } }
效果如下:
線路規划基本步驟:
分析:
1.創建路規划檢索實例
設置點擊事件
2.准備檢索起、終點信息
3.發起線路規划的檢索
1.公交檢索
2.駕車檢索
3.步行
4.設置檢索結果監聽器
5.實現監聽器
根據不同的結果展示不同的路線
1.公交檢索
2.駕車檢索
3.步行
public class RoutePlanActivity extends Activity { private MapView mMapView; private RoutePlanSearch mSearch; private EditText etStartName; private EditText etEndName; private BaiduMap mBaiduMap; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_routeplan); etStartName = (EditText) findViewById(R.id.et_startname); etEndName = (EditText) findViewById(R.id.et_endname); //獲取地圖控件引用 mMapView = (MapView) findViewById(R.id.bmapView); mBaiduMap = mMapView.getMap(); // 1.創建路規划檢索實例; mSearch = RoutePlanSearch.newInstance(); //設置檢索結果監聽器 mSearch.setOnGetRoutePlanResultListener(new OnGetRoutePlanResultListener() { /*步行結果監聽*/ @Override public void onGetWalkingRouteResult(WalkingRouteResult walkingRouteResult) { if(walkingRouteResult == null || walkingRouteResult.error != SearchResult.ERRORNO.NO_ERROR){ Toast.makeText(RoutePlanActivity.this, "請求結果有誤", Toast.LENGTH_SHORT).show(); } if (walkingRouteResult.error == SearchResult.ERRORNO.NO_ERROR) { //構造公交線路的圖層對象 WalkingRouteOverlay walkingRouteOverlay = new WalkingRouteOverlay(mBaiduMap); //給覆蓋物設置數據 walkingRouteOverlay.setData(walkingRouteResult.getRouteLines().get(0)); //添加到map walkingRouteOverlay.addToMap(); //設置自適應縮放 walkingRouteOverlay.zoomToSpan(); } } /*公交線路監聽*/ @Override public void onGetTransitRouteResult(TransitRouteResult transitRouteResult) { if(transitRouteResult == null || transitRouteResult.error != SearchResult.ERRORNO.NO_ERROR){ Toast.makeText(RoutePlanActivity.this, "請求結果有誤", Toast.LENGTH_SHORT).show(); } if (transitRouteResult.error == SearchResult.ERRORNO.NO_ERROR) { //構造公交線路的圖層對象 TransitRouteOverlay transitRouteOverlay = new TransitRouteOverlay(mBaiduMap); //給覆蓋物設置數據 transitRouteOverlay.setData(transitRouteResult.getRouteLines().get(0)); //添加到map transitRouteOverlay.addToMap(); //設置自適應縮放 transitRouteOverlay.zoomToSpan(); } } /*駕車線路監聽*/ @Override public void onGetDrivingRouteResult(DrivingRouteResult drivingRouteResult) { if(drivingRouteResult == null || drivingRouteResult.error != SearchResult.ERRORNO.NO_ERROR){ Toast.makeText(RoutePlanActivity.this, "請求結果有誤", Toast.LENGTH_SHORT).show(); } if (drivingRouteResult.error == SearchResult.ERRORNO.NO_ERROR) { //構造公交線路的圖層對象 DrivingRouteOverlay drivingRouteOverlay = new DrivingRouteOverlay(mBaiduMap); //給覆蓋物設置數據 drivingRouteOverlay.setData(drivingRouteResult.getRouteLines().get(0)); //添加到map drivingRouteOverlay.addToMap(); //設置自適應縮放 drivingRouteOverlay.zoomToSpan(); } } @Override public void onGetBikingRouteResult(BikingRouteResult bikingRouteResult) { } }); } public void onSearchRuote(View view) { //檢查數據是否合法 String startName = etStartName.getText().toString().trim(); String endName = etEndName.getText().toString().trim(); if (TextUtils.isEmpty(startName) || TextUtils.isEmpty(endName)) { return; } PlanNode stNode = PlanNode.withCityNameAndPlaceName("北京", startName); PlanNode enNode = PlanNode.withCityNameAndPlaceName("北京", endName); switch (view.getId()) { case R.id.btn_transit: mSearch.transitSearch(new TransitRoutePlanOption().from(stNode).to(enNode).city("北京")); break; case R.id.btn_driving: mSearch.drivingSearch(new DrivingRoutePlanOption().from(stNode).to(enNode)); break; case R.id.btn_walking: mSearch.walkingSearch(new WalkingRoutePlanOption().from(stNode).to(enNode)); break; default: break; } } @Override protected void onDestroy() { super.onDestroy(); //在activity執行onDestroy時執行mMapView.onDestroy(),實現地圖生命周期管理 mMapView.onDestroy(); } @Override protected void onResume() { super.onResume(); //在activity執行onResume時執行mMapView. onResume (),實現地圖生命周期管理 mMapView.onResume(); } @Override protected void onPause() { super.onPause(); //在activity執行onPause時執行mMapView. onPause (),實現地圖生命周期管理 mMapView.onPause(); } }
公交線路規划:
public class BusLineSearchActivity extends Activity { private MapView mMapView; private BaiduMap mBaiduMap; private EditText etKeyword; private PoiSearch mPoiSearch; private BusLineSearch mBusLineSearch; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_buslinesearch); //獲取地圖控件引用 mMapView = (MapView) findViewById(R.id.bmapView); mBaiduMap = mMapView.getMap(); etKeyword = (EditText) findViewById(R.id.et_keyword); // 創建POI檢索實例 mPoiSearch = PoiSearch.newInstance(); //創建buslineserarch的實例 mBusLineSearch = BusLineSearch.newInstance(); //設置監聽 mBusLineSearch.setOnGetBusLineSearchResultListener(new OnGetBusLineSearchResultListener() { @Override public void onGetBusLineResult(BusLineResult busLineResult) { //展示公交線路信息 BusLineOverlay busLineOverlay = new BusLineOverlay(mBaiduMap); busLineOverlay.setData(busLineResult); busLineOverlay.addToMap(); busLineOverlay.zoomToSpan(); } }); mPoiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() { @Override public void onGetPoiResult(PoiResult poiResult) { //獲得公交信息的poi檢索結果 if (poiResult == null || poiResult.error != SearchResult.ERRORNO.NO_ERROR) { return; } //只展示第一條公交信息 PoiInfo poiInfo = poiResult.getAllPoi().get(0); //重新請求 //如下代碼為發起檢索代碼,定義監聽者和設置監聽器的方法與POI中的類似 mBusLineSearch.searchBusLine((new BusLineSearchOption() .city("北京") .uid(poiInfo.uid))); } @Override public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) { } @Override public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) { } }); } public void onStartSearch(View view){ String keyword = etKeyword.getText().toString().trim(); if (TextUtils.isEmpty(keyword)){ return; } mPoiSearch.searchInCity(new PoiCitySearchOption().city("北京").keyword(keyword)); } @Override protected void onDestroy() { super.onDestroy(); //在activity執行onDestroy時執行mMapView.onDestroy(),實現地圖生命周期管理 mMapView.onDestroy(); } @Override protected void onResume() { super.onResume(); //在activity執行onResume時執行mMapView. onResume (),實現地圖生命周期管理 mMapView.onResume(); } @Override protected void onPause() { super.onPause(); //在activity執行onPause時執行mMapView. onPause (),實現地圖生命周期管理 mMapView.onPause(); } }
