最近項目中有用到搜索附近4S店和加油站的功能,於是我寫了個Demo,輸入你想查找的內容,就可以顯示相關的信息.效果如下:
PS:listview中有兩個緯度,後一個應該是經度的,不小心寫錯了名稱。
這裏使用的是高德地圖,先需要去高德SDK網站申請一個key,下載相應的SDK導入工程,需要地圖SDK和定位SDK,網站在此,然後配置AndroidManifest文件。
配置對應權限:
<!-- 地圖包、搜索包需要的基礎權限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 定位包、導航包需要的額外權限(注:基礎權限也需要) -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
配置key
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="0f9baee65aefab8f09065d4e60942305" /> <!--輸入你申請的key -->
配置定位的服務
<service android:name="com.amap.api.location.APSService" >
現在編寫代碼了。先實現定位,獲取手機的經緯度,先創建一個AMapLocationClient 對象, 然後設置定位回調監聽,需要創建一個mLocationListener對象
// 聲明定位回調監聽器
public AMapLocationListener mLocationListener = new AMapLocationListener() {
@Override
public void onLocationChanged(AMapLocation amapLocation) {
if (amapLocation != null) {
if (amapLocation.getErrorCode() == 0) {
//定位成功回調信息,設置相關消息
Latitude=amapLocation.getLatitude();//獲取緯度
Longitude=amapLocation.getLongitude();//獲取經度
} else {
//顯示錯誤信息ErrCode是錯誤碼,errInfo是錯誤信息,詳見錯誤碼錶。
Log.e("AmapError","location Error, ErrCode:"
+ amapLocation.getErrorCode() + ", errInfo:"
+ amapLocation.getErrorInfo());
}
}
}
};
再獲取定位參數配置AMapLocationClientOption的實例,進行一些參數的配置,比如定位模式,間隔等。
<pre name="code" class="java"> // 初始化定位參數
mLocationOption = new AMapLocationClientOption();
// 設置定位模式爲高精度模式,Battery_Saving爲低功耗模式,Device_Sensors是僅設備模式
mLocationOption.setLocationMode(AMapLocationMode.Hight_Accuracy);
// 設置是否返回地址信息(默認返回地址信息)
mLocationOption.setNeedAddress(true);
// 設置是否只定位一次,默認爲false
mLocationOption.setOnceLocation(false);
// 設置是否強制刷新WIFI,默認爲強制刷新
mLocationOption.setWifiActiveScan(true);
// 設置是否允許模擬位置,默認爲false,不允許模擬位置
mLocationOption.setMockEnable(false);
// 設置定位間隔,單位毫秒,默認爲2000ms
mLocationOption.setInterval(2000);
給客戶端對象設置參數,開始監聽
// 給定位客戶端對象設置定位參數
mLocationClient.setLocationOption(mLocationOption);
// 啓動定位
mLocationClient.startLocation();
在mLocationListener的回調監聽裏可以獲得經緯度,下一步就是搜索附近的實現了,PS: 別忘了在onDestory方法裏關閉定位.
先通過new PoiSearch.Query(keyword, type,cityCode )創建一個Query對象。 傳入三個參數,keyword是你要查找的內容,type是要查找的類型,默認爲:生活服務、餐飲服務、商務住宅,共有20種,cityCode是城市編號,可以傳空值,空值表示在全國範圍裏查找。獲取Query對象後,可以設置返回多少條結果,查第幾頁。傳入context和Query對象獲得PoiSearch對象,通過setBound方法設置中心點和查找區域,中心點則是之前獲取的定位的經緯度。
之後設置回調監聽器,然後調用searchPOIAsyn()方法開始搜索。
query = new PoiSearch.Query(content, "汽車維修|修車服務", "");
// keyWord表示搜索字符串,第二個參數表示POI搜索類型,默認爲:生活服務、餐飲服務、商務住宅
// 共分爲以下20種:汽車服務|汽車銷售|
// 汽車維修|摩托車服務|餐飲服務|購物服務|生活服務|體育休閒服務|醫療保健服務|
// 住宿服務|風景名勝|商務住宅|政府機構及社會團體|科教文化服務|交通設施服務|
// 金融保險服務|公司企業|道路附屬設施|地名地址信息|公共設施
// cityCode表示POI搜索區域,(這裏可以傳空字符串,空字符串代表全國在全國範圍內進行搜索)
query.setPageSize(10);// 設置每頁最多返回多少條poiitem
query.setPageNum(1);// 設置查第一頁
PoiSearch poiSearch = new PoiSearch(this, query);
//如果不爲空值
if(Latitude!=0.0&&Longitude!=0.0){
poiSearch.setBound(new SearchBound(new LatLonPoint(Latitude,
Longitude), 6000));// 設置周邊搜索的中心點以及區域
poiSearch.setOnPoiSearchListener(this);// 設置數據返回的監聽器
poiSearch.searchPOIAsyn();// 開始搜索
}else{
Toast.makeText(MainActivity.this, "定位失敗", 0).show();
}
返回的結果在onPoiSearched方法裏,就是參數PoiResult,這裏我用listview展示了結果。result.getPois()返回類型爲Poiltem的Arraylist集合,Poiltem有許多屬性,例如通過getTel()獲取電話,getDistance()獲取距離,getLatLonPoint獲取緯度等。
@Override
public void onPoiSearched(PoiResult result, int code) {
MyAdapter mAdapter=new MyAdapter(MainActivity.this,result.getPois());
result_listview.setAdapter(mAdapter);
}
就這樣完成了附近搜索功能,大家可以自己嘗試下。
Demo地址:點擊打開鏈接