Довольно много вопросов / ответов в 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()
}
}
}
В настоящее время я не понимаю, почему приемник никогда не вызывается. Есть идеи?