Location-based services(LBS)是一个总称,用来描述寻找移动设备当前位置的不同的技术。定位服务有两个主要的类:
LocationManager:这个类提供了访问系统中定位服务的功能,允许应用程序获得移动设备的定期更新的地理位置,或者是当移动设备到达一个已知的地理位置时来产生一个Intent。
LocationProviders:这个类提供了定位的不同技术。比如说一些移动设备基于GPS定位,有些是基于基站定位的。
在Android模拟器怎么测试定位服务呢?可以通过DDMS来帮助我们。
在DDMS的Emulator Control选项卡中有一个Location Control的位置控制,可以通过send按钮发送一些位置信息到模拟器上。
举个例子来使用LocationManager这个类。
package com.figoyu.android.whereami;
import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationManager;
import android.location.LocationListener;
import android.os.Bundle;
import android.widget.TextView;
import java.util.List;
public class WhereAmI extends Activity {
LocationManager locationManager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//getSystemService(String name)是通过名字来返回一个系统级别的服务。
//名字是Android系统中的常量,有WINDOW_SERVICE、POWER_SERVICE等
//详细可参见SDK文档。
//要启动定位服务,还需在AndroidManifest.xml中加上一句
//
locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
updateWithNewLocation();
}
/** Update UI with a new location */
private void updateWithNewLocation() {
TextView myLocationText = (TextView)findViewById(R.id.myLocationText);
StringBuilder sb = new StringBuilder("Enabled Providers:");
//getProviders(boolean enabledOnly)返回定位服务的实现技术,比如GPS定位、基站定位。
List providers = locationManager.getProviders(true);
for(String provider : providers){
/*注册当前Activity的定位的实现技术,并通过LocationListener监测位置的变化。
这可能需要一段时间才能获得最新的位置。如果需要即时位置,应用程序可能使用getLastKnownLocation(String)方法。
如果定位实现技术被用户禁用,将停止更新,这时onProviderDisabled(String)方法将被调用。
一旦定位实现技术重新启用,onProviderEnabled(String)方法将调用,并且位置更新将重新开始。
通知更新的频率可以使用minTime和minDistance参数来控制。
如果minTime大于0,LocationManager将停止更新minTime毫秒,以节省电力。
如果minDistance大于0,当设备移动到minDistance时,位置信息将广播出去。
为了尽可能经常获得通知,可以设置这两个参数为0;*/
locationManager.requestLocationUpdates(provider, 1000, 0, new LocationListener(){
public void onLocationChanged(Location location){}
public void onProviderDisabled(String provider){}
public void onProviderEnabled(String provider){}
public void onStatusChanged(String provider, int status, Bundle extras){}
});
sb.append("/n").append(provider).append(": ");
//获取最后一次的位置。
Location location = locationManager.getLastKnownLocation(provider);
if (location != null) {
//获得经纬度
double lat = location.getLatitude();
double lng = location.getLongitude();
sb.append(lat).append(", ").append(lng);
} else {
sb.append("No location found");
}
}
myLocationText.setText(sb);
}
}