2

我有一个使用 ActivityRecognition 的 DetectedActivity 广播接收器。我注意到它确实连接了,但我没有得到任何数据。这是在三星 Note 2 上。在我尝试过的其他手机上它总是有效。这是连接到 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);
    }

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

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

1 回答 1

3

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

为了节省电池电量,当设备长时间处于“静止”状态时,活动报告可能会停止。一旦设备再次移动,它将恢复。这只发生在支持 Sensor.TYPE_SIGNIFICANT_MOTION 硬件的设备上。

从 API 21 开始,如果设备处于省电模式且屏幕关闭,则接收活动的频率可能低于 detectionIntervalMillis 参数。

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

于 2015-12-24T19:08:23.730 回答