13.2.1.2. 作为LocationListener的Activity

优质
小牛编辑
131浏览
2023-12-01

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) {

}

}

  1. 留意WhereAmI实现了LocationListener。它是LocationManager用来通知地址变更的接口。
  2. 指向LocationManager的私有变量。
  3. 指向Geocoder的私有变量。
  4. textOut是表示输出结果的TextView。
  5. 在当前上下文通过getSystemService()获取LocationManager的引用。有关当前上下文的有关内容,可见ApplicationContext一节。
  6. 创建一个Geocoder的实例,将当前上下文传递给它。
  7. 还需要一段时间才可以获得新的位置信息。因此LocationManager会缓存着上次得到的地址,可以减少用户的等待。
  8. 同前面一样,在进入Running状态之前也就是onResume`()时注册到系统服务。在这里,通过requestLocationUpdates()订阅位置服务的更新。
  9. 在离开Running状态之后也就是onPause()时注销。
  10. onLocationChanged()是LocationManager负责调用的一个回调方法,在位置信息发生变化时触发。
  11. 得到了Location对象。它里面有不少有用的信息,我们格式化一下,使之容易阅读。
  12. 只要得到Location对象,就可以检索"geocode"了,它可以将经纬度转换为实际的地址。
  13. 如果得到正确的地址,就输出到textOut。
  14. LocationListener接口中还有许多其它的回调方法,这里没有用到这些功能,因此留空。