您的位置:首页 > 移动开发 > Android开发

Android应用程序开发之跟踪位置变化

2012-02-22 15:04 429 查看
开发位置相关的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决定应该使用哪种技术,具体方式如下:

  Criteria criteria = new Criteria();
  criteria.setAccuracy(Criteria.ACCURACY_COARSE);

  criteria.setPowerRequirement(Criteria.POWER_LOW);

  criteria.setAltitudeRequired(false);

  criteria.setBearingRequired(false);

  criteria.setSpeedRequired(false);

  criteria.setCostAllowed(true);

  String bestProvider = locationManager.getBestProvider(criteria, true);    //获取最好的

  List<String> matchingProviders = locationManager.getProviders(criteria,false);//获取所有的


  在选择好合适的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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: