Распознавание активности Android и НЕИЗМЕННЫЙ PendingIntent

#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. Верно, ну, это было скорее предупреждение о переносе, а не ошибка компиляции.