【问题标题】:Get location (coordinates) periodically without dramatically increase battery consumption定期获取位置(坐标),而不会显着增加电池消耗
【发布时间】:2015-03-27 20:36:20
【问题描述】:

我正在开发一个 Android 应用程序;此应用程序需要定期(每 10 分钟)将当前位置(坐标)发送到 Web 服务。但是......我对更正确的方法(并且对设备电池更友好)有点困惑。

我读了这个answer,她的方法_getLocation()看起来不错;但我不知道该方法是否可以获得我需要的位置的可用性;总可用性...

我想,如果使用 GSM / WIFI 无法获得位置,应用程序选择 GPS 方法。

这就是这种方法的原因吗?

private void _getLocation() {
    // Get the location manager
    LocationManager locationManager = (LocationManager) 
            getSystemService(LOCATION_SERVICE);
    Criteria criteria = new Criteria();
    String bestProvider = locationManager.getBestProvider(criteria, false);
    Location location = locationManager.getLastKnownLocation(bestProvider);
    try {
        lat = location.getLatitude();
        lon = location.getLongitude();
    } catch (NullPointerException e) {
        lat = -1.0;
        lon = -1.0;
    }
}

有人知道一种定期获取设备坐标的方法...而不会显着增加电池消耗吗?

【问题讨论】:

标签: android google-play-services locationmanager android-location battery-saver


【解决方案1】:

如果您担心电池问题并且对 10 分钟间隔没有那么严格,您可以尝试使用 PassiveProvider 而不是 GPS/Coarse。
通常,其他应用程序请求位置的频率足够高,因此您无需担心。
如果您很严格,那么您可以尝试自己询问位置,以防在过去的时间间隔内没有收到。
这是使用被动提供程序的示例。

LocationManager locationManager = (LocationManager) this
        .getSystemService(Context.LOCATION_SERVICE);
LocationListener locationListener = new LocationListener() {

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

    @Override
    public void onProviderEnabled(String provider) {}

    @Override
    public void onProviderDisabled(String provider) {}

    @Override
    public void onLocationChanged(Location location) {
        // Do work with new location. Implementation of this method will be covered later.
        doWorkWithNewLocation(location);
    }
};

long minTime = 10*60*1000;
long minDistance = 0;

locationManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, minTime, minDistance, locationListener);

【讨论】:

  • 这个snipet即使在手机挂起的情况下也会得到坐标?
  • 手机被挂断是什么意思?如果位置服务关闭,您将无法获得位置更新。您仍然可以注册 locationListener 但它不会被调用。
  • 嗨@Ohad,谢谢你的回复,我的意思是:空白屏幕,锁定屏幕,黑屏,我知道它的正确术语......就像你按下关机按钮时,屏幕会关闭,但我的手机仍然开机。
【解决方案2】:

Play Services 具有低消耗位置 API。你可以在Android Developer Site找到更多信息

更新

Here你可以找到存储在 Github 中的 Play Location Service 示例。查看LocationUpdates 示例。

当您设置位置请求时,您可以更改优先级,请参阅更多信息 here。我认为你使用PRIORITY_BALANCED_POWER_ACCURACY

【讨论】:

  • 感谢您的帮助@ClarkXP。我可以问你@Ohad Zadok 的评论吗?在设备的电池节省和位置可用性方面,您的示例是否优于 PassiveProvider
  • @tomloprod 我认为 Play Services 更易于设置,并且更有效地管理位置资源和能源消耗。查看我的更新
  • 我不同意,因为 PassiveProvider 不会自行启动 GPS,它根本不消耗能源。
  • @OhadZadok 此功能在其他位置源不可用时可能会出现问题,如果使用 GSM / WIFI 无法获取位置,Play Service 可以激活 GPS 提供程序,确保应用功能。
  • 那是正确的,他将不得不报道那个案子。但根据我在 10 分钟间隔和低准确度的经验,这种情况很少发生。
猜你喜欢
  • 1970-01-01
  • 2011-07-24
  • 2012-11-30
  • 2015-10-09
  • 2018-10-27
  • 1970-01-01
  • 2014-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多