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);