三星设备上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
相关产品推荐
相关产品推荐

