content: package com.amapv2.apis.poisearch;
  
  import java.util.ArrayList;
  import java.util.List;
  
  import android.app.ProgressDialog;
  import android.content.Intent;
  import android.content.pm.ApplicationInfo;
  import android.content.pm.PackageInfo;
  import android.content.pm.PackageManager;
  import android.content.pm.PackageManager.NameNotFoundException;
  import android.net.Uri;
  import android.os.Bundle;
  import android.support.v4.app.FragmentActivity;
  import android.text.Editable;
  import android.text.TextWatcher;
  import android.view.View;
  import android.view.View.OnClickListener;
  import android.widget.ArrayAdapter;
  import android.widget.AutoCompleteTextView;
  import android.widget.Button;
  import android.widget.EditText;
  import android.widget.ImageButton;
  import android.widget.TextView;
  
  import com.amap.api.maps.AMap;
  import com.amap.api.maps.AMap.InfoWindowAdapter;
  import com.amap.api.maps.AMap.OnMarkerClickListener;
  import com.amap.api.maps.SupportMapFragment;
  import com.amap.api.maps.model.Marker;
  import com.amap.api.maps.overlay.PoiOverlay;
  import com.amap.api.services.core.AMapException;
  import com.amap.api.services.core.PoiItem;
  import com.amap.api.services.core.SuggestionCity;
  import com.amap.api.services.help.Inputtips;
  import com.amap.api.services.help.Inputtips.InputtipsListener;
  import com.amap.api.services.help.Tip;
  import com.amap.api.services.poisearch.PoiItemDetail;
  import com.amap.api.services.poisearch.PoiResult;
  import com.amap.api.services.poisearch.PoiSearch;
  import com.amap.api.services.poisearch.PoiSearch.OnPoiSearchListener;
  import com.amapv2.apis.R;
  import com.amapv2.apis.util.AMapUtil;
  import com.amapv2.apis.util.ToastUtil;
  
  /**
   * AMapV2地图中简单介绍poisearch搜索
   */
  public class PoiKeywordSearchActivity extends FragmentActivity implements
  		OnMarkerClickListener, InfoWindowAdapter, TextWatcher,
  		OnPoiSearchListener, OnClickListener {
  	private AMap aMap;
  	private AutoCompleteTextView searchText;// 输入搜索关键字
  	private String keyWord = "";// 要输入的poi搜索关键字
  	private ProgressDialog progDialog = null;// 搜索时进度条
  	private EditText editCity;// 要输入的城市名字或者城市区号
  	private PoiResult poiResult; // poi返回的结果
  	private int currentPage = 0;// 当前页面，从0开始计数
  	private PoiSearch.Query query;// Poi查询条件类
  	private PoiSearch poiSearch;// POI搜索
  
  	@Override
  	protected void onCreate(Bundle savedInstanceState) {
  		super.onCreate(savedInstanceState);
  		setContentView(R.layout.poikeywordsearch_activity);
          /*
           * 设置离线地图存储目录，在下载离线地图或初始化地图设置;
           * 使用过程中可自行设置, 若自行设置了离线地图存储的路径，
           * 则需要在离线地图下载和使用地图页面都进行路径设置
           * */
  	    //Demo中为了其他界面可以使用下载的离线地图，使用默认位置存储，屏蔽了自定义设置
  //        MapsInitializer.sdcardDir =OffLineMapUtils.getSdCacheDir(this);
  		init();
  	}
  
  	/**
  	 * 初始化AMap对象
  	 */
  	private void init() {
  		if (aMap == null) {
  			aMap = ((SupportMapFragment) getSupportFragmentManager()
  					.findFragmentById(R.id.map)).getMap();
  			setUpMap();
  		}
  	}
  
  	/**
  	 * 设置页面监听
  	 */
  	private void setUpMap() {
  		Button searButton = (Button) findViewById(R.id.searchButton);
  		searButton.setOnClickListener(this);
  		Button nextButton = (Button) findViewById(R.id.nextButton);
  		nextButton.setOnClickListener(this);
  		searchText = (AutoCompleteTextView) findViewById(R.id.keyWord);
  		searchText.addTextChangedListener(this);// 添加文本输入框监听事件
  		editCity = (EditText) findViewById(R.id.city);
  		aMap.setOnMarkerClickListener(this);// 添加点击marker监听事件
  		aMap.setInfoWindowAdapter(this);// 添加显示infowindow监听事件
  	}
  
  	/**
  	 * 点击搜索按钮
  	 */
  	public void searchButton() {
  		keyWord = AMapUtil.checkEditText(searchText);
  		if ("".equals(keyWord)) {
  			ToastUtil.show(PoiKeywordSearchActivity.this, "请输入搜索关键字");
  			return;
  		} else {
  			doSearchQuery();
  		}
  	}
  
  	/**
  	 * 点击下一页按钮
  	 */
  	public void nextButton() {
  		if (query != null && poiSearch != null && poiResult != null) {
  			if (poiResult.getPageCount() - 1 > currentPage) {
  				currentPage++;
  				query.setPageNum(currentPage);// 设置查后一页
  				poiSearch.searchPOIAsyn();
  			} else {
  				ToastUtil.show(PoiKeywordSearchActivity.this,
  						R.string.no_result);
  			}
  		}
  	}
  
  	/**
  	 * 显示进度框
  	 */
  	private void showProgressDialog() {
  		if (progDialog == null)
  			progDialog = new ProgressDialog(this);
  		progDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
  		progDialog.setIndeterminate(false);
  		progDialog.setCancelable(false);
  		progDialog.setMessage("正在搜索:\n" + keyWord);
  		progDialog.show();
  	}
  
  	/**
  	 * 隐藏进度框
  	 */
  	private void dissmissProgressDialog() {
  		if (progDialog != null) {
  			progDialog.dismiss();
  		}
  	}
  
  	/**
  	 * 开始进行poi搜索
  	 */
  	protected void doSearchQuery() {
  		showProgressDialog();// 显示进度框
  		currentPage = 0;
  		query = new PoiSearch.Query(keyWord, "", editCity.getText().toString());// 第一个参数表示搜索字符串，第二个参数表示poi搜索类型，第三个参数表示poi搜索区域（空字符串代表全国）
  		query.setPageSize(10);// 设置每页最多返回多少条poiitem
  		query.setPageNum(currentPage);// 设置查第一页
  
  		poiSearch = new PoiSearch(this, query);
  		poiSearch.setOnPoiSearchListener(this);
  		poiSearch.searchPOIAsyn();
  	}
  
  	@Override
  	public boolean onMarkerClick(Marker marker) {
  		marker.showInfoWindow();
  		return false;
  	}
  
  	@Override
  	public View getInfoContents(Marker marker) {
  		return null;
  	}
  
  	@Override
  	public View getInfoWindow(final Marker marker) {
  		View view = getLayoutInflater().inflate(R.layout.poikeywordsearch_uri,
  				null);
  		TextView title = (TextView) view.findViewById(R.id.title);
  		title.setText(marker.getTitle());
  
  		TextView snippet = (TextView) view.findViewById(R.id.snippet);
  		snippet.setText(marker.getSnippet());
  		ImageButton button = (ImageButton) view
  				.findViewById(R.id.start_amap_app);
  		// 调起高德地图app
  		button.setOnClickListener(new View.OnClickListener() {
  			@Override
  			public void onClick(View v) {
  				startURI(marker);
  			}
  		});
  		return view;
  	}
  
  	/**
  	 * 通过URI方式调起高德地图app
  	 */
  	public void startURI(Marker marker) {
  		if (getAppIn()) {
  			Intent intent = new Intent(
  					"android.intent.action.VIEW",
  					android.net.Uri
  							.parse("androidamap://viewMap?sourceApplication="
  									+ getApplicationName() + "&poiname="
  									+ marker.getTitle() + "&lat="
  									+ marker.getPosition().latitude + "&lon="
  									+ marker.getPosition().longitude + "&dev=0"));
  			intent.setPackage("com.autonavi.minimap");
  			startActivity(intent);
  		} else {
  			String url = "http://mo.amap.com/?dev=0&q="
  					+ marker.getPosition().latitude + ","
  					+ marker.getPosition().longitude + "&name="
  					+ marker.getTitle();
  			Intent intent = new Intent(Intent.ACTION_VIEW);
  			intent.setData(Uri.parse(url));
  			startActivity(intent);
  		}
  
  	}
  
  	/**
  	 * 判断高德地图app是否已经安装
  	 */
  	public boolean getAppIn() {
  		PackageInfo packageInfo = null;
  		try {
  			packageInfo = this.getPackageManager().getPackageInfo(
  					"com.autonavi.minimap", 0);
  		} catch (NameNotFoundException e) {
  			packageInfo = null;
  			e.printStackTrace();
  		}
  		// 本手机没有安装高德地图app
  		if (packageInfo != null) {
  			return true;
  		}
  		// 本手机成功安装有高德地图app
  		else {
  			return false;
  		}
  	}
  
  	/**
  	 * 获取当前app的应用名字
  	 */
  	public String getApplicationName() {
  		PackageManager packageManager = null;
  		ApplicationInfo applicationInfo = null;
  		try {
  			packageManager = getApplicationContext().getPackageManager();
  			applicationInfo = packageManager.getApplicationInfo(
  					getPackageName(), 0);
  		} catch (PackageManager.NameNotFoundException e) {
  			applicationInfo = null;
  		}
  		String applicationName = (String) packageManager
  				.getApplicationLabel(applicationInfo);
  		return applicationName;
  	}
  
  	/**
  	 * poi没有搜索到数据，返回一些推荐城市的信息
  	 */
  	private void showSuggestCity(List<SuggestionCity> cities) {
  		String infomation = "推荐城市\n";
  		for (int i = 0; i < cities.size(); i++) {
  			infomation += "城市名称:" + cities.get(i).getCityName() + "城市区号:"
  					+ cities.get(i).getCityCode() + "城市编码:"
  					+ cities.get(i).getAdCode() + "\n";
  		}
  		ToastUtil.show(PoiKeywordSearchActivity.this, infomation);
  
  	}
  
  	@Override
  	public void afterTextChanged(Editable s) {
  
  	}
  
  	@Override
  	public void beforeTextChanged(CharSequence s, int start, int count,
  			int after) {
  
  	}
  
  	@Override
  	public void onTextChanged(CharSequence s, int start, int before, int count) {
  		String newText = s.toString().trim();
  		Inputtips inputTips = new Inputtips(PoiKeywordSearchActivity.this,
  				new InputtipsListener() {
  
  					@Override
  					public void onGetInputtips(List<Tip> tipList, int rCode) {
  						if (rCode == 0) {// 正确返回
  							List<String> listString = new ArrayList<String>();
  							for (int i = 0; i < tipList.size(); i++) {
  								listString.add(tipList.get(i).getName());
  							}
  							ArrayAdapter<String> aAdapter = new ArrayAdapter<String>(
  									getApplicationContext(),
  									R.layout.route_inputs, listString);
  							searchText.setAdapter(aAdapter);
  							aAdapter.notifyDataSetChanged();
  						}
  					}
  				});
  		try {
  			inputTips.requestInputtips(newText, editCity.getText().toString());// 第一个参数表示提示关键字，第二个参数默认代表全国，也可以为城市区号
  
  		} catch (AMapException e) {
  			e.printStackTrace();
  		}
  	}
  
  	/**
  	 * POI详情查询回调方法
  	 */
  	@Override
  	public void onPoiItemDetailSearched(PoiItemDetail arg0, int rCode) {
  
  	}
  
  	/**
  	 * POI信息查询回调方法
  	 */
  	@Override
  	public void onPoiSearched(PoiResult result, int rCode) {
  		dissmissProgressDialog();// 隐藏对话框
  		if (rCode == 0) {
  			if (result != null && result.getQuery() != null) {// 搜索poi的结果
  				if (result.getQuery().equals(query)) {// 是否是同一条
  					poiResult = result;
  					// 取得搜索到的poiitems有多少页
  					List<PoiItem> poiItems = poiResult.getPois();// 取得第一页的poiitem数据，页数从数字0开始
  					List<SuggestionCity> suggestionCities = poiResult
  							.getSearchSuggestionCitys();// 当搜索不到poiitem数据时，会返回含有搜索关键字的城市信息
  
  					if (poiItems != null && poiItems.size() > 0) {
  						aMap.clear();// 清理之前的图标
  						PoiOverlay poiOverlay = new PoiOverlay(aMap, poiItems);
  						poiOverlay.removeFromMap();
  						poiOverlay.addToMap();
  						poiOverlay.zoomToSpan();
  					} else if (suggestionCities != null
  							&& suggestionCities.size() > 0) {
  						showSuggestCity(suggestionCities);
  					} else {
  						ToastUtil.show(PoiKeywordSearchActivity.this,
  								R.string.no_result);
  					}
  				}
  			} else {
  				ToastUtil.show(PoiKeywordSearchActivity.this,
  						R.string.no_result);
  			}
  		} else if (rCode == 27) {
  			ToastUtil.show(PoiKeywordSearchActivity.this,
  					R.string.error_network);
  		} else if (rCode == 32) {
  			ToastUtil.show(PoiKeywordSearchActivity.this, R.string.error_key);
  		} else {
  			ToastUtil.show(PoiKeywordSearchActivity.this, getString(R.string.error_other) + rCode);
  		}
  
  	}
  
  	/**
  	 * Button点击事件回调方法
  	 */
  	@Override
  	public void onClick(View v) {
  		switch (v.getId()) {
  		/**
  		 * 点击搜索按钮
  		 */
  		case R.id.searchButton:
  			searchButton();
  			break;
  		/**
  		 * 点击下一页按钮
  		 */
  		case R.id.nextButton:
  			nextButton();
  			break;
  		default:
  			break;
  		}
  	}
  }
  