Android Map Api 使用和开发(3)浮动搜索框 ,通过地址名称获取经纬度和详细地址并定位

这篇把  浮动搜索框 ,通过地址名称获取经纬度和详细地址并定位 这些功能加上,算是一个比较完整的地图了。 

 

 

前辈们都说不要重复的造相同的轮子, 希望这整个例子对正在研究或做地图的同学有帮助。 

 

 

先上图,看看效果

 

搜索框: 

用的icon是愤怒的小鸟,尼玛默认的icon太难看了,换个好看的。哈哈

 

 

 

 

 

 

点击搜索后的效果:

 

 

 

 

 

 

那就开始吧!

 

 

一、配置搜索框

 

searchable.xml

 

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <searchable  
  3.   xmlns:android="http://schemas.android.com/apk/res/android"  
  4.   android:hint="@string/searchLable"   
  5.   android:label="@string/searchLable"  
  6.   android:searchSuggestAuthority="com.android.fzmap.map.SearchSuggestionProvider"  
  7.   android:searchSuggestSelection=" ? ">  
  8.     
  9. </searchable>  
 

 

搜索框其实是系统提供的, 可以设置很多属性,想要通过语音搜索也可以配置上去,这个这里就不介绍了

 

 

 

二 、AndroidManifest.xml 文件如何写?

 

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.       package="com.android.fzmap"  
  4.       android:versionCode="1"  
  5.       android:versionName="1.0">  
  6.     <uses-sdk android:minSdkVersion="7" />  
  7.     <uses-permission android:name="android.permission.INTERNET" />  
  8.     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>  
  9.     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>  
  10.     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>  
  11.     <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>  
  12.     <uses-permission android:name="android.permission.READ_LOGS"></uses-permission>  
  13.       
  14.     <application android:icon="@drawable/icon" android:label="@string/app_name">  
  15.     <uses-library android:name="com.google.android.maps" />   
  16.         <activity android:name="FzMapActivity"  android:screenOrientation="portrait"   
  17.                   android:label="@string/app_name"  android:launchMode="singleTop">  
  18.             <intent-filter>  
  19.                 <action android:name="android.intent.action.SEARCH"></action>  
  20.             </intent-filter>  
  21.             <meta-data android:name="android.app.default_searchable"  
  22.                        android:value="FzMapActivity" />  
  23.             <meta-data android:resource="@xml/searchable" android:name="android.app.searchable"></meta-data>  
  24.         </activity>  
  25.           
  26.          <activity android:name="SomeActivity"  android:screenOrientation="portrait"   
  27.                   android:label="@string/app_name"   >  
  28.             <intent-filter>  
  29.                 <action android:name="android.intent.action.MAIN" />  
  30.                 <category android:name="android.intent.category.LAUNCHER" />  
  31.             </intent-filter>  
  32.         </activity>  
  33.           
  34.         <meta-data android:value="4e0c22ce431fe3420f000155" android:name="UMENG_APPKEY"></meta-data>  
  35. <provider android:name="com.android.fzmap.map.SearchSuggestionProvider" android:authorities="com.android.fzmap.map.SearchSuggestionProvider"></provider>  
  36.     </application>  
  37. </manifest>  
 

我上源码一般都是全部的,不是一截一截的,方便那些想省事的人。 

 

 

 

<activity android:name="FzMapActivity"  android:screenOrientation="portrait" 

                  android:label="@string/app_name"  android:launchMode="singleTop">

            <intent-filter>

                <action android:name="android.intent.action.SEARCH"></action>

            </intent-filter>

            <meta-data android:name="android.app.default_searchable"

                       android:value="FzMapActivity" />

            <meta-data android:resource="@xml/searchable" android:name="android.app.searchable"></meta-data>

        </activity>

 

 

这里重点介绍下段 , <action android:name="android.intent.action.SEARCH"></action>   加上action

 

配置搜索配置文件 <meta-data android:resource="@xml/searchable" android:name="android.app.searchable"></meta-data>

 

搜索属于那个Activity   <meta-data android:name="android.app.default_searchable"

                       android:value="FzMapActivity" />

 

模式要设置成 android:launchMode="singleTop".

 

 

三、 保存历史搜索记录   SearchSuggestionProvider

 

  1. package com.android.fzmap.map;  
  2. import android.content.SearchRecentSuggestionsProvider;  
  3. public class SearchSuggestionProvider extends SearchRecentSuggestionsProvider {  
  4.     public final static String AUTHORITY="com.android.fzmap.map.SearchSuggestionProvider";  
  5.     public final static int MODE=DATABASE_MODE_QUERIES;  
  6.       
  7.     public SearchSuggestionProvider(){  
  8.         super();  
  9.         setupSuggestions(AUTHORITY, MODE);  
  10.     }  
  11. }  
 

 

 

android:launchMode="singleTop"

 

 

四、 重点来了,  在FzMapActivity里加上这段代码 ,用来调起搜索框和得到搜索框内容的

 

  1. @Override  
  2. public boolean onSearchRequested(){  
  3.     //打开浮动搜索框(第一个参数默认添加到搜索框的值)        
  4.     startSearch(nullfalsenullfalse);  
  5.     return true;  
  6. }  
  7.   
  8.   
  9. //得到搜索结果  
  10. @Override  
  11. public void onNewIntent(Intent intent){  
  12.     super.onNewIntent(intent);  
  13.     //获得搜索框里值  
  14.     query=intent.getStringExtra(SearchManager.QUERY);  
  15.     //保存搜索记录  
  16.     SearchRecentSuggestions suggestions=new SearchRecentSuggestions(this,  
  17.             SearchSuggestionProvider.AUTHORITY, SearchSuggestionProvider.MODE);  
  18.     suggestions.saveRecentQuery(query, null);  
  19.     CommonHelper.showProgress(this"正在搜索: " + query);  
  20.     new Thread(new Runnable() {  
  21.         @Override  
  22.         public void run() {  
  23.             Address address;  
  24.             int count = 0;  
  25.             while(true){  
  26.                 count++;  
  27.                 try {  
  28.                     Thread.sleep(500);  
  29.                 } catch (InterruptedException e) {  
  30.                     // TODO Auto-generated catch block  
  31.                     e.printStackTrace();  
  32.                 }  
  33.                 address = searchLocationByName(query);  
  34.                 Log.d(TAG, "获取经纬度");  
  35.                 if(address == null && count > 5){  
  36.                     Message msg1 = new Message();  
  37.                     msg1.what = MSG_VIEW_LOCATIONLATLNG_FAIL;  
  38.                     mHandler.sendMessage(msg1);  
  39.                     break;  
  40.                 }else if(address == null){  
  41.                     continue;  
  42.                 }else{  
  43.                     break;  
  44.                 }  
  45.                   
  46.             }  
  47.               
  48.             if( address != null || count <= 5 ){  
  49.                 Message msg = new Message();  
  50.                 msg.what = MSG_VIEW_LOCATIONLATLNG;  
  51.                 msg.obj = address;  
  52.                 mHandler.sendMessage(msg);  
  53.             }  
  54.         }  
  55.     }).start();  
  56. }  
 

 

搜索需要联网,所以起了个线程,去处理。

 

 

 

 

在点搜索的button时调用  onSearchRequested方法就可以搜索了

 

 

 

 

五、通过地址搜索的方法 searchLocationByName

 

private Address searchLocationByName(String addressName){

Geocoder geoCoder = new Geocoder(getBaseContext(),

Locale.CHINA);

try {

List<Address> addresses = geoCoder.getFromLocationName(addressName, 1);

Address address_send = null;

for(Address address : addresses){

locPoint = new GeoPoint((int)(address.getLatitude() * 1E6), (int)(address.getLongitude() * 1E6));

address.getAddressLine(1);

address_send = address;

}

return address_send;

} catch (IOException e) {

e.printStackTrace();

return null;

}

}

 

 

 

geoCoder.getFromLocationName(addressName, 1);  第二个参数是返回结果的数量,

 

这个接口有时候返回null,那可能是因为google当时的服务不好。 多试几次就好了。

 

我在代码里写的试重试五次,如果获取不到就返回错误。

 

 

好吧,解释就这么多,直接去下全部源码看效果吧 。有收获的就顶顶哈

 

源码下载地址 http://www.eoeandroid.com/thread-82185-1-1.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值