2

ActivityRecognition を使用して、DetectedActivities のブロードキャスト レシーバーがあります。接続されていることに気付きましたが、データが取得されていませんでした。これはSamsung 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

私はこれを自分で調べていました。ドキュメントから:

バッテリーを節約するために、デバイスが長時間「STILL」の状態にあると、アクティビティ レポートが停止する場合があります。デバイスが再び移動すると再開されます。これは、Sensor.TYPE_SIGNIFICANT_MOTION ハードウェアをサポートするデバイスでのみ発生します。

API 21 以降、デバイスが省電力モードで画面がオフの場合、アクティビティを受信する頻度が detectionIntervalMillis パラメーターよりも低くなる可能性があります。

したがって、バッテリーを節約するためActivityRecognitionに、可能な場合はスリープ状態になります (そしてイベントの発生を停止します)。

于 2015-12-24T19:08:23.730 に答える