除了其他功能之外,我的应用程序还用于跟踪执行交付工作的驱动程序,因此我们需要不断跟踪驱动程序的位置。为此,我们使用在后台运行的服务,并在将它们发送到服务器之前在内部保存坐标。
问题是,正如预期的那样,我们需要越精确,电池消耗越多。至于谷歌播放控制台Vitals显示的方式高于唤醒的平均数量,如下所示:walarm:com.google.android.location.ALARM_WAKEUP_LOCATOR *
我想知道我做错了什么,或者我能改进代码的唯一方法就是做一些小调整。
public class LocationService extends Service implements LocationListener {
private Integer gpsFreqInMillis = 1000 * 10; //10 seconds
private Integer gpsFreqInDistance = 10; //10 meters
...
public void startUpdatingLocation() {
...
final LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
try {
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, gpsFreqInMillis, gpsFreqInDistance, this);
} catch (java.lang.SecurityException ex) {
Log.i(TAG, "fail to request location update, ignore", ex);
} catch (IllegalArgumentException ex) {
Log.d(TAG, "gps provider does not exist " + ex.getMessage());
}
try {
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, gpsFreqInMillis, gpsFreqInDistance, this);
} catch (java.lang.SecurityException ex) {
Log.i(TAG, "fail to request location update, ignore", ex);
} catch (IllegalArgumentException ex) {
Log.d(TAG, "gps provider does not exist " + ex.getMessage());
}
}
...
@Override
public void onLocationChanged(final Location newLocation) {
//saves location in internal database
}
}
有没有办法可以跟踪精确的位置而不会杀死用户的电池?我知道我可以改变最小距离和最小时间值,但10米/ 10秒是我们提供的最精确的选项。
解决这个问题的唯一方法是通过更新代码中的这些值来优化请求回调
private Integer gpsFreqInMillis = 1000 * 40; //10 seconds
private Integer gpsFreqInDistance = 20; //10 meters