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

开发位置相关的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);
    }
}


 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值