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是一个同步执行函数,在执行过程中通过网络请求将经纬度信息发至服务器,并等待服务器根据经纬度查询出地址信息。这可能需要非常多的时间开销,进而阻塞调用线程。因此,在实践中,一定不能在主线程中调用该函数,否则很有可能会使得界面失去响应。