11.2.2 使用地址服务
在Android中,获取地址信息需要使用android.location.Geocoder类,通过调用Geocoder.getFromLocation函数可以将给定的经纬度信息换算成对应的地址信息:
//构造解码器对象
Geocoder geocoder=new Geocoder(context);
//将经纬度转换成地址信息
List<Address>addresses=geocoder.getFromLocation(
39.995/纬度/,116.329/经度/,/maxResults=/1);
Geocoder. getFromLocation函数接受一个整形数maxResults,用于指明最多返回几个地址对象android.location.Address。每个Address对象保存与经纬度对应的地址信息,包含国家、城市、街道等。增加maxResults的数量,并不能够显著增加地址信息的可靠性,因此在实践中,常常将该参数设置成1,以便能够最快地获得地址信息。
为了将地址信息呈现在用户面前,可以调用Address.toString函数,将地址对象Address转换成可理解的地址信息。如果觉得默认的格式化方式不够人性化,开发者也可以通过Address类提供的获取具体地址信息的函数,自行格式化生成可读性更强的地址信息。
比如,在Foursquare中,会如下格式化用户当前所在的地址信息:
//获得地址信息
List<Address>addresses=geocoded.getFromLocation(
location.getLatitude(),location.getLongitude(),1);
//将地址信息格式化为可理解的字符串信息,存放在format_address中
StringBuilder format_address=new StringBuilder(128);
if(addresses.size()>0){
//将最多3行的地址信息拼接在一起,用逗号隔离
Address address=addresses.get(0);
format_address.append(address.getAddressLine(0));
if(addresses.size()>1){
format_address.append(",");
format_address.append(address.getAddressLine(1));
}
if(addresses.size()>2){
format_address.append(",");
format_address.append(address.getAddressLine(2));
}
//如果有标志性建筑在周边,也拼接在地址信息的尾部
if(!TextUtils.isEmpty(address.getLocality())){
if(format_address.length()>0){
format_address.append(",");
}
format_address.append(address.getLocality());
}
}
…
需要特别注意的是,Geocoder.getFromLocation是一个同步执行函数,在执行过程中通过网络请求将经纬度信息发至服务器,并等待服务器根据经纬度查询出地址信息。这可能需要非常多的时间开销,进而阻塞调用线程。因此,在实践中,一定不能在主线程中调用该函数,否则很有可能会使得界面失去响应。