Android LBS连串05 地方策略(一)

Location Strategies

 

定位的落实

  在Android系统上贯彻稳定重借使透过GPS可能是依据网络的稳定方法。

  GPS是精度最高的,但是它只在户外有用,并且很功耗,并且第二遍定位耗时较长。

  基于互连网的一定应用通讯互连网蜂窝基站和Wi-Fi信号,那种稳定情势在室内室外都能用,响应时间较短,功耗较少,然则精度较差。

  为了在应用中拿走用户的音讯,你的location
provider能够是GPS可能依照网络,也能够相互都用。

 

控制用户地方面临的挑衅

  从手提式有线电话机上赢得用户的岗位是个比较复杂的标题,无论使用的数据源是什么样,总是有一部分元素会造成地点新闻包涵误差,从而不确切。

  误差来源如下:

  八种职位消息源

  GPS, Cell-ID,
和Wi-Fi都能为用户地方提供一定的头脑。决定信任和行使什么样数据是3个亟待权衡的历程,权衡时要考虑精度、速度、电池功用等。

  用户移动

  因为用户的职位会变动,所以应当考虑每隔一段时间重新估价用户地点。

  转移的精度

  每叁个岗位新闻源的精度不是一定的。也等于说地点推测就算是同二个音信源提供的,它的精确度也是频频在变化的。

 

呼吁地方更新

  在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

 

创建2个超级级品质的模子

  为了克服获取用户地点时的各类艰辛,定义二个模子,具体化你的利用怎么着得到用户地方。

  那几个模型包括了您何时开头和哪天终止地点更新的监听,也带有了何等时候利用缓存的任务数据。

赢得用户地点的流水生产线

  获取用户地点的特出流程如下:

             
ACCESS 1           

 

    1.第①开头利用。

    2.在某多少个点,开端监听地点更新。

    3.保障三个当下义务的“最好猜度”。

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

    5.应用最终一回的特级地方揣摸。

  那一个模型是三个窗口,窗口从早先监听初阶,从结束监听甘休。

ACCESS, 

支配曾几何时开端监听更新

  能够从利用一早先就运营监听,也足以在用户触发有个别性格后开头。

  要驾驭假如长日子监听地点会消耗很多电量,可是长期的监听恐怕达不到丰裕的精度。

  调用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分选最棒地点推测的1个例子

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

 

 

相关文章