13.2.1.2. 作为LocationListener的Activity
13.2.1.2.作为LocationListener的Activity
这就是我们唯一的Activity。我们将在这里初始化界面,连接到LocationManager,然后使用Geocoder检索我们的地理地址。LocationManager可以通过不同的位置信息源(比如GPS或者网络)来获得我们的当前位置,以经纬度的格式返回。Geocoder以此检索在线的位置数据库,即可获得当前位置的地理地址。检索的结果可能有多个,精度不一。
例 13.4. WhereAmI.java
package com.marakana;
import java.io.IOException;
import java.util.List;
import android.app.Activity;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
public class WhereAmI extends Activity implements LocationListener { //
LocationManager locationManager; //
Geocoder geocoder; //
TextView textOut; //
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textOut = (TextView) findViewById(R.id.textOut);
locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); //
geocoder = new Geocoder(this); //
// Initialize with the last known location
Location lastLocation = locationManager
.getLastKnownLocation(LocationManager.GPS_PROVIDER); //
if (lastLocation != null)
onLocationChanged(lastLocation);
}
@Override
protected void onResume() { //
super.onRestart();
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000,
10, this);
}
@Override
protected void onPause() { //
super.onPause();
locationManager.removeUpdates(this);
}
// Called when location has changed
public void onLocationChanged(Location location) { //
String text = String.format(
"Lat:\t %f\nLong:\t %f\nAlt:\t %f\nBearing:\t %f", location
.getLatitude(), location.getLongitude(), location.getAltitude(),
location.getBearing()); //
textOut.setText(text);
// Perform geocoding for this location
try {
List<Address> addresses = geocoder.getFromLocation(
location.getLatitude(), location.getLongitude(), 10); //
for (Address address : addresses) {
textOut.append("\n" + address.getAddressLine(0)); //
}
} catch (IOException e) {
Log.e("WhereAmI", "Couldn't get Geocoder data", e);
}
}
// Methods required by LocationListener
public void onProviderDisabled(String provider) {
}
public void onProviderEnabled(String provider) {
}
public void onStatusChanged(String provider, int status, Bundle extras) {
}
}
- 留意WhereAmI实现了LocationListener。它是LocationManager用来通知地址变更的接口。
- 指向LocationManager的私有变量。
- 指向Geocoder的私有变量。
- textOut是表示输出结果的TextView。
- 在当前上下文通过getSystemService()获取LocationManager的引用。有关当前上下文的有关内容,可见ApplicationContext一节。
- 创建一个Geocoder的实例,将当前上下文传递给它。
- 还需要一段时间才可以获得新的位置信息。因此LocationManager会缓存着上次得到的地址,可以减少用户的等待。
- 同前面一样,在进入Running状态之前也就是onResume`()时注册到系统服务。在这里,通过requestLocationUpdates()订阅位置服务的更新。
- 在离开Running状态之后也就是onPause()时注销。
- onLocationChanged()是LocationManager负责调用的一个回调方法,在位置信息发生变化时触发。
- 得到了Location对象。它里面有不少有用的信息,我们格式化一下,使之容易阅读。
- 只要得到Location对象,就可以检索"geocode"了,它可以将经纬度转换为实际的地址。
- 如果得到正确的地址,就输出到textOut。
- LocationListener接口中还有许多其它的回调方法,这里没有用到这些功能,因此留空。