Я пробую простую вещь, но, к сожалению, я не могу этого достичь. Я хочу получить обратные вызовы распознавания перехода активности из Android SDK 26 - 29:
Я зарегистрировал следующие разрешения в манифесте:
<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION"/>
<uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION"/>
В основной активности я проверяю разрешение:
private val activityRecognitionPermission = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) permission.ACTIVITY_RECOGNITION else "com.google.android.gms.permission.ACTIVITY_RECOGNITION"
if( PERMISSION_GRANTED != ActivityCompat.checkSelfPermission(this, activityRecognitionPermission) )
permissionsToRequest += activityRecognitionPermission
Это отлично работает. Разрешение предоставлено.
После этого я регистрирую слушателя:
if (PERMISSION_GRANTED == ActivityCompat.checkSelfPermission(this, activityRecognitionPermission)) {
val transitions = ArrayList<ActivityTransition>()
transitions.add(ActivityTransition.Builder()
.setActivityType(DetectedActivity.IN_VEHICLE)
.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.WALKING)
.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.ON_BICYCLE)
.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_FOOT)
.setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
.build())
transitions.add(ActivityTransition.Builder()
.setActivityType(DetectedActivity.ON_FOOT)
.setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
.build())
transitions.add(ActivityTransition.Builder()
.setActivityType(DetectedActivity.RUNNING)
.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.STILL)
.setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
.build())
transitions.add(ActivityTransition.Builder()
.setActivityType(DetectedActivity.STILL)
.setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
.build())
val request = ActivityTransitionRequest( transitions )
val client = ActivityRecognition.getClient(this)
val intent = Intent(this, ActivityRecognitionReceiver::class.java)
activityRecognitionPendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0)
val task = client.requestActivityTransitionUpdates(request, activityRecognitionPendingIntent!!)
task.addOnSuccessListener ( object: OnSuccessListener<Void> {
override fun onSuccess(p0: Void?) {
return
}
})
task.addOnFailureListener ( object: OnFailureListener {
override fun onFailure(p0: Exception) {
return
}
})
}
Я отладил, и после этого вызывается метод onSuccess.
Это код моего получателя. :
class ActivityRecognitionReceiver: BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
if( ActivityTransitionResult.hasResult(intent)) {
val resultList = ActivityTransitionResult.extractResult(intent)
if( resultList != null ) {
for (event in resultList.transitionEvents) {
// TODO
}
}
}
}
}
Моя проблема в том, что метод onReceive никогда не вызывается.
У кого-нибудь есть идеи, в чем может быть проблема?