#android #activity-recognition
Вопрос:
Я работаю с API распознавания активности Android. При установке флага PendingIntent в значение PendingIntent.FLAG_UPDATE_CURRENT или PendingIntent.ФЛАГ_ИММУТИРУЕМЫЙ (как рекомендуется?) полученное намерение не содержит никаких дополнительных функций.
Вот как я его использую:
Во-первых, я создаю ожидающее намерение, подобное этому:
private val intent: Intent = Intent(context, ActivityRecognitionReceiver::class.java) private val mActivityTransitionPendingIntent = PendingIntent.getBroadcast(context, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE) //This gives warning that Mutability flag required
Затем я составляю список переходов следующим образом:
private val INTERESTING_TRANSITION = intArrayOf( DetectedActivity.IN_VEHICLE, DetectedActivity.STILL, DetectedActivity.ON_FOOT, DetectedActivity.WALKING, )
Затем создайте запрос:
val transitions = mutableListOflt;ActivityTransitiongt;() for (activity in INTERESTING_TRANSITION) { transitions.add( ActivityTransition.Builder() .setActivityType(activity) .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER) .build() ) transitions.add( ActivityTransition.Builder() .setActivityType(activity) .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT) .build() ) } val request = ActivityTransitionRequest(transitions)
наконец, зарегистрируйте запрос:
val transitionTask: Tasklt;Voidgt; = mActivityRecognitionClient.requestActivityTransitionUpdates(request, mActivityTransitionPendingIntent)
Теперь, как вы видите, я использую широковещательный приемник, который должен принимать намерения передач ActivityRecognition! Теперь приемник действительно работает!! Он действительно принимает трансляции так, как должен, но дополнительные функции, похоже, равны нулю!
onReceive выглядит так:
override fun onReceive(context: Context, intent: Intent?) { Log.i(TAG, "onReceive: ${intent?.extras}") //Here i am getting null!! intent?.let { if(ActivityTransitionResult.hasResult(it)){ Log.i(TAG, "onReceive: hasTransition..") activityDetectionProcessor.onActivityTransition(ActivityTransitionResult.extractResult(it)) } if (ActivityRecognitionResult.hasResult(it)) { Log.i(TAG, "onReceive: hasResult: ${it.toString()} ") processDetectedActivities(ActivityRecognitionResult.extractResult(it)?.probableActivities) } } }
Когда я использую только PendingIntent.FLAG_UPDATE_CURRENT это действительно работает!! Но затем я получаю предупреждения о компиляции, в которых я должен указать флаг изменяемости. При использовании PendingIntent.FLAG_MUTABLE он также работает, но он также выдает предупреждение (которое неясно) в коде..
Целевой SDK-31. Все разрешения были даны должным образом.
Обновление с изображением:
Пожалуйста, обратите внимание на ошибку компиляции, которую я получаю, это очень странно:
Кроме того, ошибка компиляции исчезает, как только я устанавливаю флаги в соответствии со сборкой.ВЕРСИЯ, подобная этой:
private val pIntentFlags = if(Build.VERSION.SDK_INT gt;= Build.VERSION_CODES.S){ PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT } else { PendingIntent.FLAG_UPDATE_CURRENT } private val mActivityTransitionPendingIntent = PendingIntent.getBroadcast(context, 1, intent, pIntentFlags)
Ответ №1:
Вы должны добавить PendingIntent.FLAG_MUTABLE
флаг при создании PendingIntent
для requestActivityTransitionUpdates()
.
Я не вижу никаких ошибок компиляции или предупреждений при использовании PendingIntent.FLAG_MUTABLE
с моим кодом. Если вы это сделаете, пожалуйста, отправьте предупреждающее сообщение.
Комментарии:
1. Пожалуйста, ознакомьтесь с моим обновлением, касающимся ошибки компиляции и того, как она исчезла. Минимальный пакет SDK для моего приложения составляет 23
2.
FLAG_MUTABLE
Флаг был введен с Android S, поэтому использовать его только внутриif (Build.VERSION.SDK_INT gt;= Build.VERSION_CODES.S)
блока-это здравый смысл.3. Верно, ну, это было скорее предупреждение о переносе, а не ошибка компиляции.