关于高德地图的基本配置和使用请参看:Android之高德地图SDK配置及简单使用详解
效果图
功能
- 可以实现对当前位置的定位
- 可以对当前位置附近进行关键字搜索,并可以选择搜索范围
代码
- 主函数代码:PoiKeywordSearchActivity.java
public class PoiKeywordSearchActivity 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.poikeywordsearch_activity);
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) {
startAMapNavi(marker);
}
});
return view;
}
/**
* 调起高德地图导航功能,如果没安装高德地图,会进入异常,可以在异常中处理,调起高德地图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 (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 (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();
if (!AMapUtil.IsEmptyOrNullString(newText)) {
InputtipsQuery inputquery = new InputtipsQuery(newText, editCity.getText().toString());
Inputtips inputTips = new Inputtips(PoiKeywordSearchActivity.this, inputquery);
inputTips.setInputtipsListener(this);
inputTips.requestInputtipsAsyn();
}
}
/**
* POI信息查询回调方法
*/
@Override
public void onPoiSearched(PoiResult result, int rCode) {
dissmissProgressDialog();// 隐藏对话框
if (rCode == 1000) {
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 {
ToastUtil.showerror(this, rCode);
}
}
@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 == 1000) {// 正确返回
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);
}
}
}
- 布局代码:poikeywordsearch_activity.xml
<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"
android:background="#000000" >
<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="@color/darkgrey"
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="@color/darkgrey"
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"
android:background="#000000" >
<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>
- 用到的另一个布局:poikeywordsearch_uri.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:textColor="@android:color/black" />
<TextView
android:id="@+id/snippet"
android:layout_width="200dip"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_below="@id/title"
android:textColor="@android:color/black" />
<ImageButton
android:id="@+id/start_amap_app"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_toRightOf="@id/snippet"
android:background="@drawable/start_uri" />
</RelativeLayout>