高德地图关键字搜索

效果图:


一、添加库文件到libs中:AMap_Search_V2.8.0_20160105.jarAMap_Search_V2.8.0_20160105.jar
SDK库文件下载:
http://lbs.amap.com/api/android-sdk/down/

arm64-v8a.ziparmeabi.zip
二、配置build.gradle文件:
Android{}里面添加代码:
sourceSets.main {
jniLibs.srcDir 'libs'
}
三、配置AndroidManifest文件
1、value值为自己的申请的key:
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="f9363c320a489cc49017bd7515d5ed01"/>
申请key地址:
右下角有“获取key”按钮点击进入,注册登录申请key。
2、添加服务:
<!-- 定位需要的服务 使用2.0的定位需要加上这个 -->
<service android:name="com.amap.api.location.APSService" >
</service>
3、添加权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
四、核心代码:
package testslideswitch.testamapkey;

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.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.AMapException;
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.maps.overlay.PoiOverlay;
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;

import testslideswitch.testamapkey.util.AMapUtil;
import testslideswitch.testamapkey.util.ToastUtil;

/**
* AMapV1地图中简单介绍poisearch搜索
*/
public class PoiKeywordSearchActivity extends FragmentActivity implements
OnMarkerClickListener, InfoWindowAdapter, TextWatcher,
OnPoiSearchListener, OnClickListener, InputtipsListener {
private AMap fragment_a_map;
private AutoCompleteTextView auto_txt_key_word;// 输入搜索关键字
private String keyWord = "";// 要输入的poi搜索关键字
private ProgressDialog progDialog = null;// 搜索时进度条
private EditText edt_city;// 要输入的城市名字或者城市区号
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 (fragment_a_map == null) {
fragment_a_map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_a_map)).getMap();
setUpMap();
}
}

/**
* 设置页面监听
*/
private void setUpMap() {
Button btn_search = (Button) findViewById(R.id.btn_search);
btn_search.setOnClickListener(this);
Button btn_next = (Button) findViewById(R.id.btn_next);
btn_next.setOnClickListener(this);
auto_txt_key_word = (AutoCompleteTextView) findViewById(R.id.auto_txt_key_word);
auto_txt_key_word.addTextChangedListener(this);// 添加文本输入框监听事件
edt_city = (EditText) findViewById(R.id.edt_city);
fragment_a_map.setOnMarkerClickListener(this);// 添加点击marker监听事件
fragment_a_map.setInfoWindowAdapter(this);// 添加显示infowindow监听事件
}

/**
* 点击搜索按钮
*/
public void searchButton() {
keyWord = AMapUtil.checkEditText(auto_txt_key_word);
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, "", edt_city.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;
}

/**
*
* 搜索到目标后点击蓝色图标,调用该方法。
* @param marker
* @return
*/
@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);
String selectedInfo = marker.getSnippet();
snippet.setText(selectedInfo);
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;
}

/**
* 调起高德地图导航功能,如果没安装高德地图,会进入异常,可以在异常中处理,调起高德地图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 (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();
InputtipsQuery inputquery = new InputtipsQuery(newText, edt_city.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 == 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) {
fragment_a_map.clear();// 清理之前的图标
PoiOverlay poiOverlay = new PoiOverlay(fragment_a_map, 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);
}

}

@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.btn_search:
searchButton();
break;
/**
* 点击下一页按钮
*/
case R.id.btn_next:
nextButton();
break;
default:
break;
}
}


/**
* 在这个方法中写提示字符
* <h3>Version</h3> 1.0
* <h3>CreateTime</h3> 2016/3/9,10:15
* <h3>UpdateTime</h3> 2016/3/9,10:15
* <h3>CreateAuthor</h3> lzb
* <h3>UpdateAuthor</h3>
* <h3>UpdateInfo</h3> (此处输入修改内容,若无修改可不写.)
*
* @param tipList 提示字符集合
* @param rCode
*/
@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());
}
/**
* 改变提示字符的颜色可以直接到item_input_hint_layout布局中设置textColor属性
*/
ArrayAdapter<String> aAdapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.item_input_hint_layout, listString);
auto_txt_key_word.setAdapter(aAdapter);
aAdapter.notifyDataSetChanged();
}

}
}
效果图:

源码:http://download.csdn.net/detail/lu1024188315/9456310

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值