ActivityRecognitionResult.hasResult(intent) false при добавлении дополнений к намерению

В настоящее время я работаю над добавлением распознавания активности 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, поскольку у меня нет активности/фрагмента для получения опубликованных событий.

person cYrixmorten    schedule 03.01.2015    source источник
comment
Любое решение? ?   -  person febaisi    schedule 12.10.2016
comment
@febaisi решил это альтернативным способом, см. ответ ниже   -  person cYrixmorten    schedule 12.10.2016
comment
Это просто обходной путь. Правильно ? Я думаю, что мы должны каким-то образом передать сериализуемый или разделяемый объект через намерение.   -  person febaisi    schedule 13.10.2016
comment
@febaisi Это правда. Я предполагаю, что это может быть задумано, чтобы предотвратить подделку намерения.   -  person cYrixmorten    schedule 13.10.2016


Ответы (1)


Я нашел решение, используя LocalBroadcastReceiver из IntentService, пересылая результаты.

Реализацию можно найти по адресу: https://github.com/mcharmas/Android-ReactiveLocation.

person cYrixmorten    schedule 06.02.2015