You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

三星设备上ActivityTransitions API无法触发BroadcastReceiver问题

三星设备上ActivityTransitions API的BroadcastReceiver无法触发问题

我通过PendingIntent和BroadcastReceiver实现了ActivityTransitions API,代码在Pixel 3a上运行正常,但在三星A32和S22 Pro设备上,尽管ActivityRecognition.getClient(mainActivity).requestActivityTransitionUpdates()调用成功并进入onSuccessListener(),BroadcastReceiver却始终无法被触发。

已做以下尝试:

  • 查阅大量资料未找到相关方案,暂不考虑关闭三星电池优化(应用仅在前台运行)
  • 参考华为设备权限要求,已添加并完成运行时检查以下三个权限:
    <uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION" />
    <uses-permission android:name="com.huawei.hms.permission.ACTIVITY_RECOGNITION" />
    <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />
    
  • 已验证三星设备上ActivityRecognition API可用

代码

主类:ActivityTransitionController

包含初始化函数initController()(调用方式:mActivityTransitionController = ActivityTransitionController().also { it.initController(this@MainActivity) })和入口函数onClickEnableOrDisableActivityRecognition():

class ActivityTransitionController() {
companion object {
internal val TRANSITION_RECEIVER_ACTION: String =
"MyMachineLearningStalkingProtection.TRANSITIONS_RECEIVER_ACTION"
}

    private var activityTrackingOn: Boolean = false
    
    private lateinit var activityTransitionList: List<ActivityTransition>
    private lateinit var mActivityTransitionPendingIntent: PendingIntent
    
    internal fun initController(mainActivity: MainActivity) {
        activityTrackingOn = false    
        activityTransitionList = buildTransitionList()
    
        val intent = Intent(TRANSITION_RECEIVER_ACTION)
        mActivityTransitionPendingIntent =
            PendingIntent.getBroadcast(mainActivity, 0, intent, PendingIntent.FLAG_MUTABLE)
    
        Utils.makeSnackBar("Activity Recognition initialized!", mainActivity)
    }
    
    internal fun onClickEnableOrDisableActivityRecognition(mainActivity: MainActivity) {
        if (activityTrackingOn) {
            disableActivityTransitions(mainActivity)
        } else {
            enableActivityTransitions(mainActivity)
        }
    }
    
    
    private fun buildTransitionList(): ArrayList<ActivityTransition> {
        val list = ArrayList<ActivityTransition>()
        list.add(
            ActivityTransition.Builder()
                .setActivityType(DetectedActivity.WALKING)
                .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
                .build()
        )
        list.add(
            ActivityTransition.Builder()
                .setActivityType(DetectedActivity.WALKING)
                .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
                .build()
        )
        list.add(
            ActivityTransition.Builder()
                .setActivityType(DetectedActivity.STILL)
                .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
                .build()
        )
        list.add(
            ActivityTransition.Builder()
                .setActivityType(DetectedActivity.STILL)
                .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
                .build()
        )
        return list
    }
    
    @SuppressLint("MissingPermission")
    internal fun disableActivityTransitions(mainActivity: MainActivity) {
        Log.d(Utils.MY_LOG_TAG, "disableActivityTransitions()")
        ActivityRecognition.getClient(mainActivity)
            .removeActivityTransitionUpdates(mActivityTransitionPendingIntent)
            .addOnSuccessListener {
                activityTrackingOn = false
                Utils.makeSnackBar("Transitions successfully unregistered.", mainActivity)
            }.addOnFailureListener {
                Utils.makeSnackBar("Transitions could NOT be unregistered.", mainActivity)
                Log.e(Utils.MY_LOG_TAG, "Transitions could not be unregistered $it")
            }
    }
    
    @SuppressLint("MissingPermission")
    internal fun enableActivityTransitions(mainActivity: MainActivity) {
        Log.d(Utils.MY_LOG_TAG, "enableActivityTransitions()")
    
        val request = ActivityTransitionRequest(activityTransitionList)
        ActivityRecognition.getClient(mainActivity)
            .requestActivityTransitionUpdates(request, mActivityTransitionPendingIntent)
            .addOnSuccessListener {
                Utils.makeSnackBar("Transitions Api was successfully registered", mainActivity)
                activityTrackingOn = true
            }
            .addOnFailureListener {
                Utils.makeSnackBar("Transitions Api could NOT be registered", mainActivity)
                Log.e(Utils.MY_LOG_TAG, "Transitions Api could NOT be registered. $it")
            }
    }

}

BroadcastReceiver:ActivityTransitionReceiver

  • 在MainActivity的onStart()中注册
  • 在MainActivity的onStop()中注销
class ActivityTransitionReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        val mainActivity = context as MainActivity
        val findViewById = mainActivity.findViewById<TextView>(R.id.txt_activity)
        val now = Calendar.getInstance().time.toString()
        val currentText = findViewById.text
        if (currentText.isEmpty()) {
            findViewById.text = "1##$now"
        } else {
            val split = currentText.split("##")
            val num = split[0].toInt() + 1
            findViewById.text = "$num##$now"
        }

        if (ActivityRecognitionResult.hasResult(intent)) {
            Log.d(Utils.MY_LOG_TAG, "RECOGNITION  called")
        }

        if (ActivityTransitionResult.hasResult(intent)) {
            Log.d(Utils.MY_LOG_TAG, "TRANSITION  called")
            val result = ActivityTransitionResult.extractResult(intent!!)
            for (event in result!!.transitionEvents) {
                val activityType = event.activityType
                val transitionType = event.transitionType
                val elapsedRealTimeNanos = event.elapsedRealTimeNanos
                val findViewById1 = mainActivity.findViewById<TextView>(R.id.txt_confidence)
                findViewById1.text ="${findViewById1.text} + $activityType + $transitionType"
            }
        }
    }
}

调用onClickEnableOrDisableActivityRecognition()后,Pixel 3a能正常检测活动状态,但三星设备无任何反应,请求成功但ActivityTransitionReceiver从未被触发,求解决方案。


内容的提问来源于stack exchange,提问作者pxbn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 05:05:28