Android活动识别和不可变PendingIntent。

5
我正在使用 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

然后,我设置了如下的转换列表:
private val INTERESTING_TRANSITION = intArrayOf(
    DetectedActivity.IN_VEHICLE,
    DetectedActivity.STILL,
    DetectedActivity.ON_FOOT,
    DetectedActivity.WALKING,
 )

接下来,创建一个请求:

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)

最后注册请求:
   val transitionTask: Task<Void> = 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。 所有权限都已正确授予。
更新图片:
请注意我得到的编译错误,非常奇怪: enter image description here 此外,一旦我根据 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)
1个回答

6

在创建 requestActivityTransitionUpdates()PendingIntent 时,您必须添加 PendingIntent.FLAG_MUTABLE 标记。

我在我的代码中使用 PendingIntent.FLAG_MUTABLE 没有看到任何编译错误或警告。如果您看到,请发布警告消息。


请参考我的更新,了解有关编译错误及其消失的情况。我的应用程序最低SDK版本为23。 - Moti Bartov
1
FLAG_MUTABLE标志是自Android S版本引入的,因此只在if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)块内使用它是常识。 - Sam Lu
好的,这更像是一个linting警告,而不是编译错误。 - Moti Bartov
感谢这个解决方案,我能够再次接收更新(之前像问题所有者一样得到了null)。我已经添加了以下检查: val flag = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { PendingIntent.FLAG_MUTABLE } else { PendingIntent.FLAG_UPDATE_CURRENT } - A.Alqadomi
直到找到这个答案之前,我花了几个小时浪费时间并且不理解 EXTRAS 为空的原因。 - MaaAn13

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接