我正在使用 Android ActivityRecognition API。
当将 PendingIntent 标志设置为 PendingIntent.FLAG_UPDATE_CURRENT 或 PendingIntent.FLAG_IMMUTABLE(建议使用?)时,接收到的意图不包含任何额外信息。
然后,我设置了如下的转换列表:
最后注册请求:
现在你可以看到,我使用了一个广播接收器来接收ActivityRecognition广播的意图!现在接收器可以工作了!!它确实接收到了应该接收到的广播,但是附加信息似乎为空!
onReceive代码如下:
当我只使用 PendingIntent.FLAG_UPDATE_CURRENT 时它确实起作用!但是,然后我会收到编译警告,提示我应该指定可变性标志。当使用 PendingIntent.FLAG_MUTABLE 时,它也有效,但代码中也会出现(不清楚的)警告。
目标 SDK 是 31。 所有权限都已正确授予。
更新图片:
请注意我得到的编译错误,非常奇怪:
此外,一旦我根据 Build.VERSION 设置标志,编译错误就消失了,如下所示:
以下是我的使用方式:
首先,我创建一个待处理的意图,如下所示:
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](https://istack.dev59.com/vTP0Y.webp)
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)
FLAG_MUTABLE
标志是自Android S版本引入的,因此只在if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)
块内使用它是常识。 - Sam Lu