文档章节

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

AK_47
 AK_47
发布于 2014/07/09 17:03
字数 939
阅读 40
收藏 0

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

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

先上图,看看效果

搜索框: 

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

 

 

点击搜索后的效果:

那就开始吧!

 一、配置搜索框

 searchable.xml

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

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

二 、AndroidManifest.xml 文件如何写?

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.android.fzmap"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="7" />
	<uses-permission android:name="android.permission.INTERNET" />
	<uses-permission android:name="android.permission.ACCESS_NETWORK_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.READ_PHONE_STATE"></uses-permission>
	<uses-permission android:name="android.permission.READ_LOGS"></uses-permission>
	
    <application android:icon="@drawable/icon" android:label="@string/app_name">
    <uses-library android:name="com.google.android.maps" /> 
        <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>
        
         <activity android:name="SomeActivity"  android:screenOrientation="portrait" 
                  android:label="@string/app_name"   >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        
        <meta-data android:value="4e0c22ce431fe3420f000155" android:name="UMENG_APPKEY"></meta-data>
<provider android:name="com.android.fzmap.map.SearchSuggestionProvider" android:authorities="com.android.fzmap.map.SearchSuggestionProvider"></provider>
    </application>
</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

package com.android.fzmap.map;
import android.content.SearchRecentSuggestionsProvider;
public class SearchSuggestionProvider extends SearchRecentSuggestionsProvider {
	public final static String AUTHORITY="com.android.fzmap.map.SearchSuggestionProvider";
	public final static int MODE=DATABASE_MODE_QUERIES;
	
	public SearchSuggestionProvider(){
		super();
		setupSuggestions(AUTHORITY, MODE);
	}
}
 

 

 android:launchMode="singleTop"

 

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

@Override
	public boolean onSearchRequested(){
		//打开浮动搜索框(第一个参数默认添加到搜索框的值)      
		startSearch(null, false, null, false);
		return true;
	}
	
	
	//得到搜索结果
	@Override
	public void onNewIntent(Intent intent){
		super.onNewIntent(intent);
		//获得搜索框里值
		query=intent.getStringExtra(SearchManager.QUERY);
		//保存搜索记录
		SearchRecentSuggestions suggestions=new SearchRecentSuggestions(this,
				SearchSuggestionProvider.AUTHORITY, SearchSuggestionProvider.MODE);
		suggestions.saveRecentQuery(query, null);
		CommonHelper.showProgress(this, "正在搜索: " + query);
		new Thread(new Runnable() {
			@Override
			public void run() {
				Address address;
				int count = 0;
				while(true){
					count++;
					try {
						Thread.sleep(500);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					address = searchLocationByName(query);
					Log.d(TAG, "获取经纬度");
					if(address == null && count > 5){
						Message msg1 = new Message();
						msg1.what = MSG_VIEW_LOCATIONLATLNG_FAIL;
						mHandler.sendMessage(msg1);
						break;
					}else if(address == null){
						continue;
					}else{
						break;
					}
					
				}
				
				if( address != null || count <= 5 ){
					Message msg = new Message();
					msg.what = MSG_VIEW_LOCATIONLATLNG;
					msg.obj = address;
					mHandler.sendMessage(msg);
				}
			}
		}).start();
	}
 

 

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

 

在点搜索的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://download.csdn.net/detail/totogo2010/4471568

 

 

© 著作权归作者所有

AK_47
粉丝 16
博文 533
码字总数 569998
作品 0
嘉定
程序员
私信 提问
Android应用开发之使用PhoneGap实现位置上报功能

看这里:Android应用开发之使用PhoneGap实现位置上报功能 上一篇,使用Intellij Idea 搭建PhoneGap Android开发环境中,简单的介绍了PhoneGap Android开发环境的搭建,并且开发了Hello World...

Realfighter
2015/02/05
682
1
android ------ 实现高德定位并获取相应信息 ( 最新版高德SDK 和 Android SDK版本)

Android开发项目时常常会遇到定位这个功能, 很久以前写过一篇了,官方也更新了一些东西,我也更新下 以前使用的是jar包 导入来实现高德定位 老版本 链接:https://blog.csdn.net/DickyQie/...

切切歆语
05/21
22
0
【Python】如何利用百度API进行地理编码(将地名转换为经纬度信息)

一、注册密钥 在百度地图API上相关位置的展现是以经纬度为基础的。要使用百度地图接口需要注册百度地图API以获取免费的密钥,才能完全使用该API。登录网址:http://lbsyun.baidu.com/, 首页...

CS青雀
02/04
0
0
【高小爱课堂】_地图API开发者教程(全平台精华版)

一、使用须知 二、坐标相关问题 三、标注问题 四、定位相关问题 五、云图 六、地图API 1)Javascript API 2)Android API 3)iOS API 4)Windows Phone 及win8 API 5)URI API ▼使用须知 Q:...

高德LBS开放平台
2014/06/13
1K
0
说说在 Android 如何实现基于位置的服务(基于百度 API)

基于位置的服务简称 LBS(Location Based Service),它是利用无线电通讯网络或 GPS 定位方式来确定出移动设备所在的位置。 利用定位服务,可以开发出许多丰富多彩的功能。比如天气预报 APP,...

deniro
2018/08/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

TiDB 最佳实践系列(三)乐观锁事务

作者:Shirly TiDB 最佳实践系列是面向广大 TiDB 用户的系列教程,旨在深入浅出介绍 TiDB 的架构与原理,帮助用户在生产环境中最大限度发挥 TiDB 的优势。我们将分享一系列典型场景下的最佳实...

TiDB
54分钟前
11
0
原来缓存是这样

经过一闪而过的一个灵感,记下来,我觉得缓存的定义应该是这样定义的: 我之前一直认为缓存的词义是错误的:是在读取到值之后,再次被使用的时候,不会去取新的值,而是使用旧的值,这是是错...

走向人生巅峰的大路
56分钟前
7
0
数字货币交易所开发常用的7个开源撮合引擎

如果你希望按照自己的需求打造金融交易平台,那么应当选择合适的交易撮合引擎进行二次开发而不是基于完整的交易平台实现进行修改。本文将介绍10个采用不同语言开发的开源的撮合引擎,你可以根...

汇智网教程
59分钟前
7
0
Spring Security做JWT认证和授权

Spring Security做JWT认证和授权

乐逍遥-镜子
今天
5
0
LNMP---日志不记录静态文件、日志切割、静态文件过期缓存、nginx防盗链

4.39 日志不记录静态文件 4.40 日志切割 4.41 静态文件过期缓存 4.42 nginx防盗链 扩展: yum install lrzsz -yrz 上传文件sz filename 这样去把这个文件推送到windows上 一、日志不记录...

tobej
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部