【发布时间】:2022-02-16 17:48:21
【问题描述】:
我正在使用 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 时,它确实有效!! 但是后来我收到了编译警告,我应该指定 Mutability 标志。 当使用 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)
【问题讨论】:
标签: android activity-recognition