【问题标题】:Android ActivityRecognition and IMMUTABLE PendingIntentAndroid ActivityRecognition 和 IMMUTABLE PendingIntent
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

    • 请参考我关于编译错误的更新以及它是如何消失的。我的应用最小 SDK 是 23
    • FLAG_MUTABLE 标志是自 Android S 以来引入的,因此仅在 if (Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.S) 块内使用它是常识。
    • 好吧,这更像是一个 linting 警告,而不是编译错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    相关资源
    最近更新 更多