嘿,我正在尝试在后台运行应用程序时提高用户速度。 我正在使用getSpeed(),当我的应用程序在前台运行时它可以工作。 我试图为此使用Service,但是它只有几分钟后才给我速度,我更需要它。 我读到Google更改了他们的条款,但是我不确定是否可以做一些事情(也许有一些许可,或者让应用以浮动状态运行)。
这是我的代码:
public class LocationService extends Service {
private static final String TAG = "LocationService";
private LocationManager locationManager;
private LocationListener locationListener;
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 1;
private static final long MIN_TIME_BW_UPDATES = 1000 * 1;
@Override
public void onCreate() {
super.onCreate();
locationManager = (LocationManager) getSystemService
(Context.LOCATION_SERVICE);
locationListener = new SpeedActionListener();
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
}
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, locationListener);
Log.d(TAG, "onCreate");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartCommand");
super.onStartCommand(intent, flags, startId);
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
Log.d(TAG, "onBind");
return null;
}
private class SpeedActionListener implements android.location.LocationListener {
private static final String TAG = "SpeedoActionListener";
@Override
public void onLocationChanged(Location location) {
if(location != null) {
if(location.hasSpeed()){
double mySpeed = location.getSpeed();
Log.d(TAG, "Current speed: " + String.valueOf(mySpeed * 3.6));
}
}
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
}
}
谢谢大家!
答案 0 :(得分:0)
您观察到的行为是正确的。当您的应用在后台运行时,您的应用每小时仅收到几次位置更新。
您可以在此处找到更多信息:Background Location Limits
页面还提到了一些可能的解决方案:
请考虑,如果您的应用程序接收到的位置更新很少,则在后台运行的用例是否根本无法成功。在这种情况下,您可以通过执行以下操作之一来更频繁地检索位置更新:
- 将您的应用程序置于前台。 通过调用startForegroundService()在应用中启动前景服务。当此类前台服务处于活动状态时,它将在通知区域中显示为正在进行的通知。
- 使用Geofencing API的元素(例如GeofencingApi接口),这些元素已进行了优化,可最大程度地减少功耗。
- 使用被动位置侦听器,如果有前台应用以更快的速度请求位置更新,则被动位置侦听器可能会收到更快的位置更新。
最简单的解决方案可能是将您的服务升级为前台服务,但这要求在电话的通知中心中整个运行时都可以看到一条通知。您可以了解有关Android前台服务here的信息。
其他建议的解决方案取决于您的用例。 here是有关前台服务及其替代方案的另一篇有趣的博客文章。