1. 程式人生 > >Android百度地圖的搜尋及附近地址的檢索

Android百度地圖的搜尋及附近地址的檢索

import java.util.List;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BaiduMap.OnMapStatusChangeListener
; import com.baidu.mapapi.map.MapStatus; import com.baidu.mapapi.map.MapStatusUpdate; import com.baidu.mapapi.map.MapStatusUpdateFactory; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.map.MyLocationConfiguration; import com.baidu.mapapi.map.MyLocationData; import com.baidu.mapapi.model.LatLng
; import com.baidu.mapapi.search.core.PoiInfo; import com.baidu.mapapi.search.core.SearchResult; import com.baidu.mapapi.search.geocode.GeoCodeResult; import com.baidu.mapapi.search.geocode.GeoCoder; import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener; import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption
; import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult; import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener; import com.baidu.mapapi.search.poi.PoiCitySearchOption; import com.baidu.mapapi.search.poi.PoiDetailResult; import com.baidu.mapapi.search.poi.PoiResult; import com.baidu.mapapi.search.poi.PoiSearch; import com.baidu.mapapi.search.sug.OnGetSuggestionResultListener; import com.baidu.mapapi.search.sug.SuggestionResult; import com.baidu.mapapi.search.sug.SuggestionSearch; import com.baidu.mapapi.search.sug.SuggestionSearchOption; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.graphics.Color; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.Window; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView; import android.widget.BaseAdapter; import android.widget.EditText; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; public class MoreAddressActivity extends Activity implements OnClickListener, OnGetSuggestionResultListener, OnMapStatusChangeListener, BDLocationListener, OnGetGeoCoderResultListener, TextWatcher { private ImageView iv_left; protected static final String TAG = "MoreAddressActivity"; protected static final int REQUEST_OK = 0; private ListView lv_near_address; private SuggestionSearch mSuggestionSearch = null; private BaiduMap mBaiduMap = null; private double latitude; private double longitude; /** * 搜尋關鍵字輸入視窗 */ private AutoCompleteTextView keyWorldsView = null; private ArrayAdapter<String> sugAdapter = null; private int load_Index = 0; private PoiSearchAdapter adapter; private MapView map; private MyLocationConfiguration.LocationMode mCurrentMode; private LocationClient mLocClient; private GeoCoder geoCoder; private String city; private boolean isFirstLoc = true; private LatLng locationLatLng; private EditText searchAddress; private List<PoiInfo> poiInfos; private ListView searchPois; private ImageView mImg_load_animation; private long startTime; private long stopTome; private TextView mTv_net; private RelativeLayout mRl_gps; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_more_address); initData(); startTime = System.currentTimeMillis(); // setStatusBarColor(); } private void initData() { ///XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX searchAddress = (EditText) findViewById(R.id.main_search_address); searchPois = (ListView) findViewById(R.id.main_search_pois); mImg_load_animation = (ImageView) findViewById(R.id.img_load_animation); mTv_net = (TextView) findViewById(R.id.tv_net); mRl_gps = (RelativeLayout) findViewById(R.id.rl_gps); mRl_gps.setClickable(true); searchAddress.addTextChangedListener(this); searchPois.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { searchPois.setVisibility(View.GONE); if (poiInfos != null) { if (poiInfos.get(position) != null) { LatLng location = poiInfos.get(position).location; if (location != null) { MapStatusUpdate msu = MapStatusUpdateFactory.newLatLngZoom(location, 18); mBaiduMap.animateMapStatus(msu); } } } } }); ///XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX map = (MapView) findViewById(R.id.map); mBaiduMap = map.getMap(); MapStatus mapStatus = new MapStatus.Builder().zoom(15).build(); MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mapStatus); mBaiduMap.setMapStatus(mMapStatusUpdate); // 地圖狀態改變相關監聽 mBaiduMap.setOnMapStatusChangeListener(this); // 開啟定點陣圖層 mBaiduMap.setMyLocationEnabled(true); // 定點陣圖層顯示方式 mCurrentMode = MyLocationConfiguration.LocationMode.NORMAL; mBaiduMap.setMyLocationConfigeration(new MyLocationConfiguration(mCurrentMode, true, null)); mLocClient = new LocationClient(this); // 註冊定位監聽 mLocClient.registerLocationListener(this); // 定位選項 LocationClientOption option = new LocationClientOption(); /** * coorType - 取值有3個: 返回國測局經緯度座標系:gcj02 返回百度墨卡託座標系 :bd09 返回百度經緯度座標系 * :bd09ll */ option.setCoorType("bd09ll"); // 設定是否需要地址資訊,預設為無地址 option.setIsNeedAddress(true); // 設定是否需要返回位置語義化資訊,可以在BDLocation.getLocationDescribe()中得到資料,ex:"在天安門附近", // 可以用作地址資訊的補充 option.setIsNeedLocationDescribe(true); // 設定是否需要返回位置POI資訊,可以在BDLocation.getPoiList()中得到資料 option.setIsNeedLocationPoiList(true); /** * 設定定位模式 Battery_Saving 低功耗模式 Device_Sensors 僅裝置(Gps)模式 Hight_Accuracy * 高精度模式 / */ option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy); // 設定是否開啟gps進行定位 option.setOpenGps(true); // 設定掃描間隔,單位是毫秒 當<1000(1s)時,定時定位無效 option.setScanSpan(1000); // 設定 LocationClientOption mLocClient.setLocOption(option); // 開始定位 mLocClient.start(); lv_near_address = (ListView) findViewById(R.id.lv_near_address); // // 初始化搜尋模組,註冊搜尋事件監聽 // mSuggestionSearch = SuggestionSearch.newInstance(); // mSuggestionSearch.setOnGetSuggestionResultListener(this); // keyWorldsView = (AutoCompleteTextView) findViewById(R.id.et_search); // sugAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line); // keyWorldsView.setAdapter(sugAdapter); // /** // * 當輸入關鍵字變化時,動態更新建議列表 // */ // keyWorldsView.addTextChangedListener(new TextWatcher() { // // @Override // public void afterTextChanged(Editable arg0) { // } // // @Override // public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { // // } // // @Override // public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { // if (cs.length() <= 0) { // return; // } // String city = "杭州"; // String cityone = "安徽省"; // /** // * 使用建議搜尋服務獲取建議列表,結果在onSuggestionResult()中更新 // */ // mSuggestionSearch.requestSuggestion((new SuggestionSearchOption()).keyword(cs.toString()).city(city)); // mSuggestionSearch.requestSuggestion((new SuggestionSearchOption()).keyword(cs.toString()).city(cityone)); // } // }); // // keyWorldsView.setOnItemClickListener(new OnItemClickListener() { // // @Override // public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // String address = arg0.getItemAtPosition(arg2).toString(); // Log.i(TAG, "address.toString()" + address.toString()); // Intent intentAddress = new Intent(); // intentAddress.putExtra("selectAddress", keyWorldsView.getText().toString()); // setResult(RESULT_OK, intentAddress); // // finish(); // } // }); iv_left = (ImageView) findViewById(R.id.iv_left); iv_left.setOnClickListener(this); } /* * 接受周邊地理位置結果 * * @param poiResult */ @Override protected void onDestroy() { super.onDestroy(); mBaiduMap.setMyLocationEnabled(false); map.onDestroy(); if (geoCoder != null) { geoCoder.destroy(); } map = null; if (mSuggestionSearch != null) { mSuggestionSearch.destroy(); mSuggestionSearch = null; } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.iv_left: finish(); break; default: break; } } public void onResume() { super.onResume(); map.onResume(); // if (getIntent().getStringExtra("latitude") != null && // (!"".equals(getIntent().getStringExtra("latitude")))) { // latitude = Double.parseDouble(getIntent().getStringExtra("latitude")); // longitude = Double.parseDouble(getIntent().getStringExtra("longitude")); // TtelifeLog.i(TAG, "latitude" + latitude); // } // MobclickAgent.onResume(this); } public void onPause() { super.onPause(); map.onPause(); } // private void setStatusBarColor() { // Window window = getWindow(); // WindowManager.LayoutParams params = getWindow().getAttributes(); // params.flags |= WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS; // window.setAttributes(params); // SystemBarTintManager tintManager = new SystemBarTintManager(this); // tintManager.setStatusBarTintEnabled(true); // tintManager.setTintColor(getResources().getColor(R.color.tab)); // } // // public void onGetPoiDetailResult(PoiDetailResult result) { // if (result.error != SearchResult.ERRORNO.NO_ERROR) { // Toast.makeText(MoreAddressActivity.this, "抱歉,未找到結果", Toast.LENGTH_SHORT).show(); // } else { // Toast.makeText(MoreAddressActivity.this, result.getName() + ": " + result.getAddress(), Toast.LENGTH_SHORT) // .show(); // } // } @Override public void onGetSuggestionResult(SuggestionResult res) { if (res == null || res.getAllSuggestions() == null) { return; } sugAdapter.clear(); for (SuggestionResult.SuggestionInfo info : res.getAllSuggestions()) { if (info.key != null) sugAdapter.add(info.key + " " + info.city + info.district); } sugAdapter.notifyDataSetChanged(); } ///XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable s) { // String s1 = searchAddress.getText().toString(); // boolean empty = s1.isEmpty(); // if (empty) { // searchPois.setVisibility(View.GONE); // } if (s.length() == 0 || "".equals(s.toString())) { searchPois.setVisibility(View.GONE); } else { searchPois.setVisibility(View.VISIBLE); // 建立PoiSearch例項 PoiSearch poiSearch = PoiSearch.newInstance(); // 城市內檢索 PoiCitySearchOption poiCitySearchOption = new PoiCitySearchOption(); // 關鍵字 poiCitySearchOption.keyword(s.toString()); // 城市 poiCitySearchOption.city(city); // 設定每頁容量,預設為每頁10條 poiCitySearchOption.pageCapacity(5); // 分頁編號 poiCitySearchOption.pageNum(3); poiSearch.searchInCity(poiCitySearchOption); // 設定poi檢索監聽者 poiSearch .setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() { // poi 查詢結果回撥 @Override public void onGetPoiResult(PoiResult poiResult) { poiInfos = poiResult.getAllPoi(); if (poiInfos != null) { PoiSearchAdapter poiSearchAdapter = new PoiSearchAdapter( MoreAddressActivity.this, poiInfos, locationLatLng); // searchPois.setVisibility(View.VISIBLE); searchPois.setAdapter(poiSearchAdapter); } } // poi 詳情查詢結果回撥 @Override public void onGetPoiDetailResult( PoiDetailResult poiDetailResult) { } }); } } ///XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX class PoiSearchAdapter extends BaseAdapter { private Context context; private List<PoiInfo> list; private ViewHolder holder; public PoiSearchAdapter(Context context, List<PoiInfo> appGroup, LatLng locationLatLng) { this.context = context; this.list = appGroup; } @Override public int getCount() { return list.size(); } @Override public Object getItem(int location) { return list.get(location); } @Override public long getItemId(int arg0) { return arg0; } public void addObject(List<PoiInfo> mAppGroup) { this.list = mAppGroup; notifyDataSetChanged(); } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { holder = new ViewHolder(); convertView = LayoutInflater.from(context).inflate(R.layout.activity_poi_search_item, null); holder.mpoi_name = (TextView) convertView.findViewById(R.id.mpoiNameT); holder.mpoi_address = (TextView) convertView.findViewById(R.id.mpoiAddressT); convertView.setTag(holder); } else { holder =