Android ActivityRecognition 和 IMMUTABLE PendingIntent

Mot*_*tov 5 android activity-recognition

我正在使用 Android ActivityRecognition api。当将 PendingIntent 标志设置为PendingIntent.FLAG_UPDATE_CURRENT 或 PendingIntent.FLAG_IMMUTABLE(按照建议?)时,收到的意图不包含任何额外内容。

我的使用方法如下:

首先,我创建一个待处理的意图,如下所示:

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
Run Code Online (Sandbox Code Playgroud)

然后,我像这样设置转换列表:

private val INTERESTING_TRANSITION = intArrayOf(
    DetectedActivity.IN_VEHICLE,
    DetectedActivity.STILL,
    DetectedActivity.ON_FOOT,
    DetectedActivity.WALKING,
 )
Run Code Online (Sandbox Code Playgroud)

接下来,创建一个请求:

val transitions = mutableListOf<ActivityTransition>()

   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)
Run Code Online (Sandbox Code Playgroud)

最后注册请求:

   val transitionTask: Task<Void> = mActivityRecognitionClient.requestActivityTransitionUpdates(request, mActivityTransitionPendingIntent)
Run Code Online (Sandbox Code Playgroud)

现在如您所见,我使用一个广播接收器,它应该接收 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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我仅使用PendingIntent.FLAG_UPDATE_CURRENT时,它确实有效!但随后我收到编译警告,提示我应该指定可变性标志。当使用PendingIntent.FLAG_MUTABLE时,它也可以工作,但它也会在代码中发出警告(不清楚)。

目标SDK为31。所有权限均已正确授予。

用图像更新:

请注意我收到的编译错误,这很奇怪: 在此输入图像描述

此外,一旦我根据 Build.VERSION 设置标志,编译错误就会消失,如下所示:

 private val pIntentFlags = if(Build.VERSION.SDK_INT >= 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)
Run Code Online (Sandbox Code Playgroud)

Sam*_* Lu 6

您必须PendingIntent.FLAG_MUTABLE在创建PendingIntentfor时添加该标志requestActivityTransitionUpdates()

与我的代码一起使用时,我没有看到任何编译错误或警告PendingIntent.FLAG_MUTABLE。如果这样做,请发布警告消息。