В настоящее время я работаю над добавлением распознавания активности Google API.
Мне удалось получить отчет о действиях с использованием ожидающего намерения, как показано в примере по адресу: http://developer.android.com/training/location/activity-recognition.html
Теперь я хотел бы получить обратный вызов от IntentService (запущенный ожидающим намерением). Для этого я попробовал решение, найденное по адресу: Использование ResultReceiver в Android
Intent intent = new Intent(ctx, ActivityRecognitionIntentService.class);
intent.putExtra(ActivityRecognitionIntentService.REQUEST_RECEIVER_EXTRA, new ResultReceiver(null) {
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
switch (resultCode) {
case ActivityRecognitionIntentService.RESULT_ID_WITH_ACTIVITYRESULT:
ActivityRecognitionResult result = resultData.getParcelable(ActivityRecognitionIntentService.RESULT_BUNDLE_ACTIVITYRESULT);
DetectedActivity mostProbableActivity = result.getMostProbableActivity();
observer.onNext(mostProbableActivity);
// Get the confidence percentage for the most probable activity
int confidence = mostProbableActivity.getConfidence();
// Get the type of activity
int activityType = mostProbableActivity.getType();
Log.d(TAG, getNameFromType(activityType) + " confidence: " + confidence + " isMoving: " + isMoving(activityType));
break;
case ActivityRecognitionIntentService.RESULT_ID_NO_ACTIVITYRESULT:
Log.e(TAG, "Nonfatal: no activity result");
break;
default:
Log.e(TAG, "Unexpected resultCode: " + resultCode);
}
}
});
К сожалению, это привело к тому, что ActivityRecognitionResult.hasResult(intent)
всегда возвращал false.
/**
* Called when a new activity detection update is available.
*/
@Override
protected void onHandleIntent(Intent intent) {
// outputs "onHandleIntent false"
Log.d(TAG, "onHandleIntent " + ActivityRecognitionResult.hasResult(intent));
}
Дальнейшее тестирование показало, что любые дополнения, переданные намерению, вызывают ту же проблему, например:
Intent intent = new Intent(ctx, ActivityRecognitionIntentService.class);
intent.putExtra("TEST", "TESTING");
PendingIntent pendingIntent = PendingIntent.getService(ctx, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
ActivityRecognition.ActivityRecognitionApi.requestActivityUpdates(apiClient, 0, pendingIntent);
Снова заставляет ActivityRecognitionResult.hasResult(intent)
возвращать false. Удаление дополнительного «ТЕСТ» дает результаты действия, как и ожидалось.
Итак, наконец, мои вопросы:
- Почему добавление Extras к намерению делает намерение непригодным для распознавания активности
- Можно ли создавать обратные вызовы каким-то другим способом. Примечание. это предназначено для проекта библиотеки, поэтому я не могу использовать EventBus, поскольку у меня нет активности/фрагмента для получения опубликованных событий.