几小时后,融合定位停止发送更新

4

如果我让应用程序开启了几个小时,融合定位就停止发送更新了...

我正在创建高优先级的位置请求,这里是代码:

LocationRequest = LocationRequest.create()
                .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
                .setExpirationDuration(TimeUnit.SECONDS.toMillis(LOCATION_TIMEOUT_IN_SECONDS))
                .setInterval(LOCATION_UPDATE_INTERVAL);

这里涉及客户端和回调:
LocationCallback mLocationCallback = new LocationCallback() {
        @Override
        public void onLocationAvailability(LocationAvailability locationAvailability) {
            super.onLocationAvailability(locationAvailability);
        }

        @Override
        public void onLocationResult(LocationResult locationResult) {
            super.onLocationResult(locationResult);
            //Update location
        }
    };
    mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
    mFusedLocationProviderClient.requestLocationUpdates(mLocationRequest, mLocationCallback, null);

LOCATION_TIMEOUT_IN_SECONDS的时间设置为5秒,但是更新并不总是在运行,当我的应用程序需要位置时,我会手动停止和启动它,就像文档中所述。

如果应用程序运行了一两个小时,一切都正常,但是如果我打开它很长一段时间,它就停止工作了...

我在按钮点击事件中从Activity请求位置更新,10秒后手动停止位置更新... 如果我整晚都没关掉它,这意味着Activity全夜都在运行... 然后当我再次请求位置更新时,它就不会出现了...

有什么解决方案或想法吗?


停止工作,请更具体。 - Tim
位置更新未被调用。 - Nininea
1
什么是LOCATION_TIMEOUT_IN_SECONDS? - Tim
你可能正在onResume中移除位置更新回调。 - M.Waqas Pervez
1
@M.WaqasPervez 当然不是,哈哈哈哈哈。 - Nininea
显示剩余7条评论
2个回答

2
setExpirationDuration(long millis)

来自文档:

设置此请求的持续时间(以毫秒为单位)。

持续时间立即开始(而不是当请求传递给位置客户端时),因此如果稍后重新使用请求,请再次调用此方法。

请求过期后,位置客户端将自动停止更新。

持续时间包括挂起时间。允许小于0的值,但表示请求已经过期。

如果您希望永远接收位置更新,请将其删除或设置适当的时间。


0

这是我的 MyApplication 类:

public class MyApplication extends Application  {

  public static boolean isActivityVisible() {
   return activityVisible;
 }

 public static void setVisibilityTrue() {
  activityVisible = true;
 }

这是我的 BaseActivity 类:

 public static void activityResumed() {
 boolean isScreenOn = true;
 // isScreenOn() method is deprecated API level 21. You should use 
 isInteractive instead:
 PowerManager pm = (PowerManager) 
 MyApplication.getInstance().getSystemService(Context.POWER_SERVICE);
 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
     isScreenOn = pm.isInteractive();
 } else {
    isScreenOn = pm.isScreenOn();
 }
 if (isScreenOn) {
    activityVisible = true;
 }

}

 public static void activityPaused() {
 boolean isScreenOn = true;
 PowerManager pm = (PowerManager) 
MyApplication.getInstance().getSystemService(Context.POWER_SERVICE);
 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
     isScreenOn = pm.isInteractive();
 } else {
     isScreenOn = pm.isScreenOn();
 }
 if (isScreenOn) {
     activityVisible = false;
 }

}
private static boolean activityVisible;

}

当应用程序在后台时,我们将其带到前台,每30秒使用计时器检查应用程序屏幕是否锁定,如果锁定则打开应用程序:private void bringApplicationToFront(Context context) { /** * 检查监视器屏幕是否开启/关闭 * */ boolean isScreenOn = true; PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) { isScreenOn = pm.isInteractive(); } else { isScreenOn = pm.isScreenOn(); } if (!isScreenOn) { /** * 检查应用程序是前台还是后台 * */ boolean isInForeBackground = false; try { isInForeBackground = MyApplication.isActivityVisible(); } catch (Exception e) { e.printStackTrace(); } if (!isInForeBackground) { Intent notificationIntent = new Intent(context, ActivitySplash.class); notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); try { pendingIntent.send(); } catch (PendingIntent.CanceledException e) { e.printStackTrace(); } } } }

我认为如果应用程序进入前台,它的优先级很高,那么它可以一直使用GPS。

棘手的部分是当应用程序在后台运行且屏幕被锁定时,重新打开应用程序(将其带到前台)后会调用onPause(),这意味着activityVisible被设置为false(表示不可见,但实际上并非如此)。虽然这是正确的,但这不是我想要的。为了解决这个问题,我从不让activityVisible在屏幕被锁定时被设置,并且当应用程序在闪屏中重新打开时,我将activityVisible设置为true。

希望这能有所帮助...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接