ActivityRecognition API 一段时间后不发送动作

ActivityRecognition API doesn't send motions after a while

我有一个使用 ActivityRecognition 的 DetectedActivities 的广播接收器。 我注意到它确实连接了,但我没有收到任何数据。这是在 Samsung Note 2 上。在其他 phones 上我试过它总是有效。 这是连接到 google api:

的代码
  public synchronized void buildGoogleApiClient() {
    if(PSLocationCenter.getInstance().pref.getAutoPilot(context) || (PSTripDBFactory.getInstance(context).getActiveTrip()!= null)){
        Log.i("","autopilot, will activate");
        if(mGoogleApiClient == null || !mGoogleApiClient.isConnected()) {
            mGoogleApiClient = new GoogleApiClient.Builder(context)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .addApi(ActivityRecognition.API)
                    .build();
            Log.i("", "autopilot build google api client");
            mGoogleApiClient.connect();
            Log.i("", "autopilot register receiver");
            LocalBroadcastManager.getInstance(context).registerReceiver(mBroadcastReceiver,
                    new IntentFilter(Constants.BROADCAST_ACTION));
        }else{
            Log.i("", "autopilot is already connected");
            if(!PSLocationCenter.getInstance().pref.getMotionDetection(context)){
                requestActivityUpdatesButtonHandler();
            }
            if(PSTripDBFactory.getInstance(context).getActiveTrip()== null) {
                PSLocationCenter.getInstance().requestLocationUpdatesFromMotion();
            }
        }
    }else{
        if(mGoogleApiClient != null && mGoogleApiClient.isConnected()){
            removeActivityUpdatesButtonHandler();
        }
        Log.i("","autopilot, will NOOOT activate");
    }
}

这是请求动议的代码:

  public void requestActivityUpdatesButtonHandler() {
        Log.i("", "autopilot request activity update");
        Utils.appendLog("AUTOPILOT requestActivityUpdatesButtonHandler", false);
        if(mGoogleApiClient != null && mGoogleApiClient.isConnected()){
            Log.i("","AUTOPILOT requestActivityUpdatesButtonHandler GOOGLE API CLIENT CONNECTED");
            Utils.appendLog("AUTOPILOT requestActivityUpdatesButtonHandler GOOGLE API CLIENT CONNECTED", false);
            PSLocationCenter.getInstance().pref.setMotionDetection(context, true);
            ActivityRecognition.ActivityRecognitionApi.requestActivityUpdates(
                    mGoogleApiClient,
                    Constants.DETECTION_INTERVAL_IN_MILLISECONDS,
                    getActivityDetectionPendingIntent()
            ).setResultCallback(this);
        }else if(mGoogleApiClient != null && mGoogleApiClient.isConnecting()){
            Log.i("","AUTOPILOT requestActivityUpdatesButtonHandler GOOGLE API CLIENT CONNECTING");
            Utils.appendLog("AUTOPILOT requestActivityUpdatesButtonHandler GOOGLE API CLIENT CONNECTING", false);
            Handler han = new Handler();
            han.postDelayed(new Runnable() {
                @Override
                public void run() {
                    requestActivityUpdatesButtonHandler();
                }
            },500);
        }else{
            Log.i("","AUTOPILOT requestActivityUpdatesButtonHandler GOOGLE API CLIENT NOT CONNECTED");
            Utils.appendLog("AUTOPILOT requestActivityUpdatesButtonHandler GOOGLE API CLIENT NOT CONNECTED", false);
            buildGoogleApiClient();
        }
    }

其中 "getActivityDetectionPendingIntent" 是:

  private PendingIntent getActivityDetectionPendingIntent() {
        Log.i("", "autopilot get activity detection pending intent");
        // Reuse the PendingIntent if we already have it.
        if (mActivityDetectionPendingIntent != null) {
            return mActivityDetectionPendingIntent;
        }
        Intent intent = new Intent(context, DetectedActivitiesIntentService.class);

        // We use FLAG_UPDATE_CURRENT so that we get the same pending intent backListener when calling
        // requestActivityUpdates() and removeActivityUpdates().
        return PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    }

奇怪的是,我随后重新启动了 phone。进入应用程序并重新启动后,我只是稍微摇动 phone 并开始获取位置。 是否有可能以某种方式强制关闭广播接收器?还是识别activity被打破? 还有其他人遇到这个问题吗?有没有办法检查我的广播接收器的状态? 我没有日志,因为我没有问题,在日志中。它只是构建 api 客户端,然后用这个请求动作:

  ActivityRecognition.ActivityRecognitionApi.requestActivityUpdates(
                    mGoogleApiClient,
                    Constants.DETECTION_INTERVAL_IN_MILLISECONDS,
                    getActivityDetectionPendingIntent()
            ).setResultCallback(this);

我自己正在调查这个。来自文档:

To conserve battery, activity reporting may stop when the device is 'STILL' for an extended period of time. It will resume once the device moves again. This only happens on devices that support the Sensor.TYPE_SIGNIFICANT_MOTION hardware.

Beginning in API 21, activities may be received less frequently than the detectionIntervalMillis parameter if the device is in power save mode and the screen is off.

因此,为了节省电量,ActivityRecognition 会在可能的情况下进入睡眠状态(并停止触发事件)。