高德地图四:关键字搜索
关键字检索介绍
根据关键字检索适用于在某个城市搜索某个名称相关的POI,例如:查找北京市的“肯德基”。
注意:关键字未设置城市信息(默认为全国搜索)时,如果涉及多个城市数据返回,仅会返回建议城市,请根据APP需求,选取城市进行搜索。
代码实现:
layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_margin="5.0dip" >
<AutoCompleteTextView
android:id="@+id/keyWord"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/text_search"
android:completionThreshold="1"
android:dropDownVerticalOffset="1.0dip"
android:hint="请输入关键字"
android:textColorHint="#6666"
android:imeOptions="actionDone"
android:inputType="text|textAutoComplete"
android:maxLength="20"
android:paddingRight="37.0dip"
android:singleLine="true"
android:textColor="#000000"
android:textSize="16.0sp" />
<EditText
android:id="@+id/city"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginLeft="5.0dip"
android:hint="请输入城市"
android:textColorHint="#6666"
android:text="北京"
android:background="@drawable/text_search"
android:imeOptions="actionDone"
android:singleLine="true"
android:textColor="#000000"
android:textSize="16.0sp"/>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/searchButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="开始搜索" />
<Button
android:id="@+id/nextButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="下一页" />
</LinearLayout>
<fragment
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.amap.api.maps.SupportMapFragment" />
</LinearLayout>
com/example/administrator/MainActivity.java
package com.example.administrator;
import android.app.ProgressDialog;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
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.AMapUtils;
import com.amap.api.maps.SupportMapFragment;
import com.amap.api.maps.model.Marker;
import com.amap.api.maps.model.NaviPara;
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.InputtipsQuery;
import com.amap.api.services.help.Tip;
import com.amap.api.services.poisearch.PoiResult;
import com.amap.api.services.poisearch.PoiSearch;
import com.amap.api.services.poisearch.PoiSearch.OnPoiSearchListener;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends FragmentActivity implements
OnMarkerClickListener, InfoWindowAdapter, TextWatcher,
OnPoiSearchListener, OnClickListener, InputtipsListener {
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.activity_main);
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 = searchText.getText().toString();
if ("".equals(keyWord)) {
Toast.makeText(this,"请输入搜索关键字",Toast.LENGTH_SHORT).show();
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 {
Toast.makeText(this,"没找到结果",Toast.LENGTH_SHORT).show();
}
}
}
/**
* 显示进度框
*/
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 OnClickListener() {
// @Override
// public void onClick(View v) {
// startAMapNavi(marker);
// }
// });
// return view;
return null;
}
/**
* 调起高德地图导航功能,如果没安装高德地图,会进入异常,可以在异常中处理,调起高德地图app的下载页面
*/
public void startAMapNavi(Marker marker) {
// 构造导航参数
NaviPara naviPara = new NaviPara();
// 设置终点位置
naviPara.setTargetPoint(marker.getPosition());
// 设置导航策略,这里是避免拥堵
naviPara.setNaviStyle(NaviPara.DRIVING_AVOID_CONGESTION);
// 调起高德地图导航
try {
AMapUtils.openAMapNavi(naviPara, getApplicationContext());
} catch (com.amap.api.maps.AMapException e) {
// 如果没安装会进入异常,调起下载页面
AMapUtils.getLatestAMapApp(getApplicationContext());
}
}
/**
* 判断高德地图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 (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";
}
Toast.makeText(this,infomation,Toast.LENGTH_SHORT).show();
}
@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();
if (!TextUtils.isEmpty(newText)) {
InputtipsQuery inputquery = new InputtipsQuery(newText, editCity.getText().toString());
Inputtips inputTips = new Inputtips(this, inputquery);
inputTips.setInputtipsListener(this);
inputTips.requestInputtipsAsyn();
}
}
/**
* POI信息查询回调方法
*/
@Override
public void onPoiSearched(PoiResult result, int rCode) {
dissmissProgressDialog();// 隐藏对话框
if (rCode == AMapException.CODE_AMAP_SUCCESS) {
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 {
Toast.makeText(this,"没找到结果",Toast.LENGTH_SHORT).show();
}
}
} else {
Toast.makeText(this,"没找到结果2",Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(this,"没找到结果3",Toast.LENGTH_SHORT).show();
}
}
@Override
public void onPoiItemSearched(PoiItem item, int rCode) {
// TODO Auto-generated method stub
}
/**
* Button点击事件回调方法
*/
@Override
public void onClick(View v) {
switch (v.getId()) {
/**
* 点击搜索按钮
*/
case R.id.searchButton:
searchButton();
break;
/**
* 点击下一页按钮
*/
case R.id.nextButton:
nextButton();
break;
default:
break;
}
}
@Override
public void onGetInputtips(List<Tip> tipList, int rCode) {
if (rCode == AMapException.CODE_AMAP_SUCCESS) {// 正确返回
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();
} else {
// ToastUtil.showerror(this, rCode);
}
}
}