requestActivityTransitionUpdates BroadcastReceiver не вызывается - PullRequest
0 голосов
/ 13 февраля 2020

Довольно много вопросов / ответов в SO (только некоторые из того, что я видел SO1 , SO2 , пример github ....) , К сожалению, после многих комментариев / ответов у меня не получилось вызвать приемник вещания. У меня есть все доступные переходы, поэтому я мог бы ожидать чего-то, но ничего, когда шел или не двигался.

У меня есть сценарий, который заключается в том, что у меня есть класс, который ищет обновления перехода активности, и этот класс вызывается из обслуживание переднего плана. Служба работает нормально, класс успешно вызывается, и все выглядит правильно, но результатов нет. Отображаются все журналы в Logcat, кроме любого в приемнике. Вот класс целиком

class MotionServices (val context: Context, val listener: MotionServicesListener) {
private var mPendingIntent: PendingIntent? = null
private var mListener: MotionServicesListener? = null
private val tag = "MotionServices"
private var mContext: Context
var _isRunning = false

interface MotionServicesListener {
    fun motionServiceComplete()
    fun motionStart()
    fun motionEnd()
    fun motionError()
}

val broadCastReceiver = object : BroadcastReceiver() {
    override fun onReceive(contxt: Context?, intent: Intent?) {
        Log.e(tag, "broadCastReceiver called")

        when (intent?.action) {
            Constants.CALLBACK_ACTION -> {

                if (ActivityTransitionResult.hasResult(intent)) {
                    val result = ActivityTransitionResult.extractResult(intent)!!
                    val event = result.transitionEvents.first()
                    _isRunning = true
                    Log.e(tag, event.toString())

                    //car
                    if(event.activityType == DetectedActivity.IN_VEHICLE){
                        mListener?.motionStart()
                        return
                    }

                    mListener?.motionEnd()
                }
            }
        }
    }
}

init {
    mListener = listener
    mContext = context
}

fun startMotionMonitoring(){
    fun buildActivityTransitions() : ArrayList<ActivityTransition> {
        val transitions = ArrayList<ActivityTransition>()
        transitions.add(ActivityTransition.Builder()
            .setActivityType(DetectedActivity.STILL)
            .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
            .build())

        transitions.add(ActivityTransition.Builder()
            .setActivityType(DetectedActivity.STILL)
            .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
            .build())

        transitions.add(ActivityTransition.Builder()
            .setActivityType(DetectedActivity.WALKING)
            .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
            .build())

        transitions.add(ActivityTransition.Builder()
            .setActivityType(DetectedActivity.WALKING)
            .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
            .build())

        transitions.add(ActivityTransition.Builder()
            .setActivityType(DetectedActivity.IN_VEHICLE)
            .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
            .build())

        transitions.add(ActivityTransition.Builder()
            .setActivityType(DetectedActivity.IN_VEHICLE)
            .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
            .build())

        transitions.add(ActivityTransition.Builder()
            .setActivityType(DetectedActivity.ON_BICYCLE)
            .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
            .build())

        transitions.add(ActivityTransition.Builder()
            .setActivityType(DetectedActivity.ON_BICYCLE)
            .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
            .build())

        transitions.add(ActivityTransition.Builder()
            .setActivityType(DetectedActivity.RUNNING)
            .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
            .build())

        transitions.add(ActivityTransition.Builder()
            .setActivityType(DetectedActivity.RUNNING)
            .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
            .build())
        return transitions
    }
    val transitions = buildActivityTransitions()
    val request = ActivityTransitionRequest(transitions)
    Log.e(tag, "MotionServices: startMotionMonitoring")

    val mIntentService = Intent(mContext, broadCastReceiver::class.java)
    mPendingIntent = PendingIntent.getBroadcast(mContext, 0, mIntentService, PendingIntent.FLAG_UPDATE_CURRENT)
    val task = ActivityRecognition.getClient(mContext).requestActivityTransitionUpdates(request, mPendingIntent)
    task.addOnSuccessListener {
        // Handle success
        mListener?.motionServiceComplete()
        mContext.registerReceiver(broadCastReceiver, IntentFilter(Constants.CALLBACK_ACTION))
    }

    task.addOnFailureListener { e: Exception ->
        // Handle error
        e.printStackTrace()
        mListener?.motionError()
    }
}

fun endMotionMonitoring(){
    Log.e(tag, "MotionServices: endMotionMonitoring")
    _isRunning = false
    val task = ActivityRecognition.getClient(mContext).removeActivityTransitionUpdates(mPendingIntent)
    task.addOnSuccessListener {
        // Handle success
        mPendingIntent?.cancel()
        mContext.unregisterReceiver(broadCastReceiver)
    }

    task.addOnFailureListener { e: Exception ->
        // Handle error
        e.printStackTrace()
    }
}
}

В настоящее время я не понимаю, почему приемник никогда не вызывается. Есть идеи?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...