Android LBS系列05 位置策略(一)

Location Strategies

 

定点的落实

  在Android系统上实现稳定要是经过GPS或者是基于网络的一定法。

  GPS是精度高的,但是她仅于露天有因此,并且很耗电,并且首蹩脚定位花费时间比较丰富。

  基于网络的定点应用通信网络蜂窝基站和Wi-Fi信号,这种稳定法以室内室外都能就此,响应时间比短,耗电较少,但是精度比差。

  为了在运中取用户之信,你的location
provider可以是GPS或者因网络,也可彼此都因此。

 

控制用户位置面临的挑战

  从手机及取得用户之职是独比较复杂的题目,无论采取的数据源是呀,总是发生部分因素会造成位置信息包含误差,从而不确切。

  误差来源如下:

  强职信息源

  GPS, Cell-ID,
和Wi-Fi都能够为用户位置提供一定之端倪。决定信任与下什么数据是一个亟待权衡的历程,权衡时如考虑精度、速度、电池效率等。

  用户移动

  因为用户的位置会转移,所以应当考虑各隔一段时间重新估计用户位置。

  转之精度

  每一个位置信息源的精度不是稳定的。也就是说位置估计即使是跟一个信息源提供的,它的精确度也是连连在变之。

 

央位置更新

  于Android中收获位置要是经回调函数。

  首先通过 LocationManager的 requestLocationUpdates()措施注册监听器,向中传入一个贯彻了 LocationListener接口的靶子。

  你的 LocationListener目标被得兑现部分回调函数,当用户位置变动还是当服务状态改变时,Location
Manager就见面调用这些回调函数。

  比如,下面的代码就显得了安定义一个 LocationListener接下来要位置更新:

 

// Acquire a reference to the system Location Manager
LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

// Define a listener that responds to location updates
LocationListener locationListener = new LocationListener() 
{
    public void onLocationChanged(Location location) 
    {
      // Called when a new location is found by the network location provider.
      makeUseOfNewLocation(location);
    }

    public void onStatusChanged(String provider, int status, Bundle extras) {}

    public void onProviderEnabled(String provider) {}

    public void onProviderDisabled(String provider) {}
  };

// Register the listener with the Location Manager to receive location updates
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);

 

   requestLocationUpdates() 中的首先单参数指明了location
provider的类型,第二只参数是打招呼的极小时间间隔,第三个参数是通的绝小的变更距离。

  如果第二独同老三独参数都装成0就意味着若尽可能频繁地伸手位置通知。

  最后一个参数是用户自己定义的贯彻了LocationListener接口的靶子,它接受位置更新的回调。

  如果想要而利用GPS和网稳定,可以调用 requestLocationUpdates()个别赖,第一个参数分别是 GPS_PROVIDER和 NETWORK_PROVIDER 。

 

权设置

  如果无权限设置,程序在求位置更新时拿会晤砸。

<manifest ... >
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    ...
</manifest>

 

  如果用NETWROK_PROVIDER,
那么得声明
ACCESS_COARSE_LOCATIONINTERNET

  如果用GPS_PROVIDER,
那么需要声明
ACCESS_FINE_LOCATION

  ACCESS_FINE_LOCATION凡是含了ACCESS_COARSE_LOCATION的,所以两岸都用时可以只有声明ACCESS_FINE_LOCATION

 

树一个至上性能的模型

  为了克服获取用户位置时的类不便,定义一个型,具体化你的应用如何获取用户位置。

  这个模型包含了你何时开始与何时已位置更新的监听,也暗含了什么时候用缓存的岗位数据。

抱用户位置的流水线

  获取用户位置的天下第一流程如下:

             
ACCESS 1           

 

    1.首先开始以。

    2.当某一个接触,开始监听位置更新。

    3.保障一个当下位置的“最佳估计”。

    4.停歇对职务更新的监听。

    5.采取最后一次等的特等位置估计。

  这个模型是一个窗口,窗口起上马监听开始,从住监听了。

 

操纵何时起监听更新

  可以自利用相同上马就启动监听,也足以当用户触发某个特性后开始。

  要清楚而加上时监听位置会吃很多电量,但是差日之监听可能达到不顶足够的精度。

  调用requestLocationUpdates()起监听:

LocationProvider locationProvider = LocationManager.NETWORK_PROVIDER;
// Or, use GPS location data:
// LocationProvider locationProvider = LocationManager.GPS_PROVIDER;

locationManager.requestLocationUpdates(locationProvider, 0, 0, locationListener);

 

从而上次稳的结果得到便捷稳定

  初次获得位置信息或者会见花费较长时间。在得到一个比较准的永恒之前,可以利用一个缓存的职:调用getLastKnownLocation(String)术实现。

LocationProvider locationProvider = LocationManager.NETWORK_PROVIDER;
// Or use LocationManager.GPS_PROVIDER

Location lastKnownLocation = locationManager.getLastKnownLocation(locationProvider);

 

操纵何时休监听

  位置取与岗位运用期间的时光距离越来越聊,对估计精度之精益求精越便宜。

  永远铭记在心长日子的监听位置更新将会大费电,所以只要而获取你用的音信,就应该停止监听位置更新,调用removeUpdates(PendingIntent)法实现:

// Remove the listener you previously added
locationManager.removeUpdates(locationListener);

 

护一个手上最佳估计

  因为定位精度是实时变化的,所以杀可能最新的职并无是太规范的。

  你应该制定有专业并蕴含一效仿逻辑判断,来选择生最佳估计。

  这套标准为是随着以状况要变化的。

  下面是您验证一个location
fix的精确度时得利用的手续:

    1.检查是不是当期位置数据较前的估算数据而新很多;

    2.反省时数以及之前数据的精度,谁再好;

    3.检查时数据是于哪个provider处获得的,然后决定是否更信任它;

  一个事例如下:

ACCESS 2ACCESS 3分选最佳位置估计的一个例子

private static final int TWO_MINUTES = 1000 * 60 * 2;

/** Determines whether one Location reading is better than the current Location fix
  * @param location  The new Location that you want to evaluate
  * @param currentBestLocation  The current Location fix, to which you want to compare the new one
  */
protected boolean isBetterLocation(Location location, Location currentBestLocation) 
{
    if (currentBestLocation == null) 
    {
        // A new location is always better than no location
        return true;
    }

    // Check whether the new location fix is newer or older
    long timeDelta = location.getTime() - currentBestLocation.getTime();
    boolean isSignificantlyNewer = timeDelta > TWO_MINUTES;
    boolean isSignificantlyOlder = timeDelta < -TWO_MINUTES;
    boolean isNewer = timeDelta > 0;

    // If it's been more than two minutes since the current location, use the new location
    // because the user has likely moved
    if (isSignificantlyNewer) 
    {
        return true;
    // If the new location is more than two minutes older, it must be worse
    } 
    else if (isSignificantlyOlder) 
    {
        return false;
    }

    // Check whether the new location fix is more or less accurate
    int accuracyDelta = (int) (location.getAccuracy() - currentBestLocation.getAccuracy());
    boolean isLessAccurate = accuracyDelta > 0;
    boolean isMoreAccurate = accuracyDelta < 0;
    boolean isSignificantlyLessAccurate = accuracyDelta > 200;

    // Check if the old and new location are from the same provider
    boolean isFromSameProvider = isSameProvider(location.getProvider(),
            currentBestLocation.getProvider());

    // Determine location quality using a combination of timeliness and accuracy
    if (isMoreAccurate) 
    {
        return true;
    } 
    else if (isNewer && !isLessAccurate) 
    {
        return true;
    } 
    else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) 
    {
        return true;
    }
    return false;
}

/** Checks whether two providers are the same */
private boolean isSameProvider(String provider1, String provider2) 
{
    if (provider1 == null) 
    {
      return provider2 == null;
    }
    return provider1.equals(provider2);
}

 

调动模型以节省电量和拓展数据交换

  当您测试模型的时刻,可能发现你的范需要开片调,以抵它的准确度和属性。下面是有些若可以变动之地方:

  弱化多少流程的窗口尺寸

  窗口尺寸减多少,意味着跟GPS和网络的彼此减少,这样便可以省去电量。但是这样啊就是抽了获得最佳位置估计得运用的位置数。

  下跌location
provider返回更新的频率

  于窗口中下降更新频率为足以改进电池效率,但是会招精度之遗失。requestLocationUpdates() 通过内有数个参数就可设定更新的时间和空中距离,从而设定频率。

  限制provider

  根据使用之一定条件还是目标精度等级,可以择独自下基于网络的恒要单使用GPS定位,而非是以用两者。只与中间的一者交互将减小电量使用,但是会起机密的精度丢失。

 

参考资料:

  API Guides:Location
Strategies

  http://developer.android.com/guide/topics/location/strategies.html

 

 

相关文章