开发位置相关的Android应用程序时,可以选择使用不同的技术来获取当前位置,如通过GPS或网络等等,对于不同的技术,精确度、耗电量、产生的费用都是不同的,本文将详细介绍Location Provider的相关内容。
要获得一个特定的Location Provider的实例对象,可使用如下方法:
LocationProvider provider = locationManager.getProvider(providerName);
这里的providerName是一个字符串,最常见的providerName是以下的两种,分别对应GPS和网络:
LocationManager.GPS_PROVIDER
LocationManager.NETWORK_PROVIDER
但是,可用的Location Provider不仅仅只有这两种,通过以下的方法,可以获取当前硬件上所有可用的Location Provider:
boolean enabledOnly = true; //获取所有的Provider,或者只获取当前可用的Provider
List<String> providers = locationManager.getProviders(enabledOnly);
如果不确定哪种获取位置的方式是最最好的,可以借助Criteria类,告知所需的条件,让Android决定应该使用哪种技术,具体方式如下:
在选择好合适的Location Provider之后,就可以进行下一步的开发工作了。
要在应用程序中使用位置相关服务,先要在对应的AndroidManifest添加一些uses-permission标签,如下:
<uses-permission android:name=”android.permission.ACCESS_FINE_LOCATION”/>
<uses-permission android:name=”android.permission.ACCESS_COARSE_LOCATION”/>
注:使用GPS时需要ACCESS_FINE_LOCATION,使用Network时需要ACCESS_COARSE_LOCATION。
在Android应用程序中,位置相关的服务是通过Location Manager来处理的,获取Location Manager的实例对象可以用以下方法:
String serviceString = Context.LOCATION_SERVICE;
LocationManager locationManager;
locationManager = (LocationManager)getSystemService(serviceString);
使用LocationManager实例对象中的getLastKnownLocation函数可以查看最后一次被某个Location Provider确定的地点,但是这个操作不会更新当前位置:
String provider = LocationManager.GPS_PROVIDER;
Location location = locationManager.getLastKnownLocation(provider);
返回的Location对象中包含这个Provider可以提供的全部信息,可以通过对应的get方法获得。
一个实例程序如下,摘自《Professional Android 2 Application Development》:
package net.ispiders.whereami;
import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.TextView;
public class WhereAmI extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LocationManager locationManager;
String context = Context.LOCATION_SERVICE;
locationManager = (LocationManager)getSystemService(context);
String provider = LocationManager.GPS_PROVIDER;
Location location = locationManager.getLastKnownLocation(provider);
updateWithNewLocation(location);
}
private void updateWithNewLocation(Location location)
{
String latLongString;
TextView myLocationText;
myLocationText = (TextView)findViewById(R.id.myLocationText);
if (location != null)
{
double lat = location.getLatitude();
double lng = location.getLongitude();
latLongString = "Lat:" + lat + "\nLong:" + lng;
}
else
{
latLongString = "No location found";
}
myLocationText.setText("Your Current Position is:\n" +
latLongString);
}
}
要让Android应用程序跟踪手机位置的变化,需要调用LocationManager实例对象的requestLocationUpdates()方法,这个方法需要四个参数:
1、Location Provider的类型
2、多久更新一次位置,以毫秒为单位
3、位置变化至少多少才更新一次位置,以米为单位
4、用于处理位置变化的LocationListener
LocationListener的形式:
LocationListener onLocationChange=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) { }
};
当不再需要跟踪位置更新时,调用LocationManager实例对象的removeUpdates()方法,传入参数的类型为LocationListener.
以下程序代码实例演示了跟踪位置变化的过程,摘自《Professional Android 2 Application Development》
package net.ispiders.whereami;
import android.app.Activity;
import android.content.Context;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.TextView;
public class WhereAmI extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LocationManager locationManager;
String context = Context.LOCATION_SERVICE;
locationManager = (LocationManager)getSystemService(context);
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(true);
criteria.setPowerRequirement(Criteria.POWER_LOW);
String provider = locationManager.getBestProvider(criteria, true);
Location location = locationManager.getLastKnownLocation(provider);
updateWithNewLocation(location);
locationManager.requestLocationUpdates(provider, 2000, 10,
locationListener);
}
private final LocationListener locationListener = new LocationListener()
{
public void onLocationChanged(Location location)
{
updateWithNewLocation(location);
}
public void onProviderDisabled(String provider)
{
updateWithNewLocation(null);
}
public void onProviderEnabled(String provider)
{
}
public void onStatusChanged(String provider, int status,
Bundle extras)
{
}
};
private void updateWithNewLocation(Location location)
{
String latLongString;
TextView myLocationText;
myLocationText = (TextView)findViewById(R.id.myLocationText);
if (location != null)
{
double lat = location.getLatitude();
double lng = location.getLongitude();
latLongString = "Lat:" + lat + "\nLong:" + lng;
}
else
{
latLongString = "No location found";
}
myLocationText.setText("Your Current Position is:\n" +
latLongString);
}
}