Иногда в приложении нужно определять, когда пользователь начинает или прекращает определенное действие, например ходьбу, езду на велосипеде или вождение автомобиля. Например, приложение для отслеживания пробега может начать отслеживать мили, когда пользователь начинает движение, а мессенджер может отключить звук во всех разговорах, пока пользователь не остановится.
Activity Recognition Transition API позволяет обнаруживать изменения в действиях пользователя. Приложение подписывается на переход между интересующими вас действиями, и API уведомляет приложение только при необходимости. На этой странице показано, как использовать Activity Recognition Transition API (или просто Transition API).
Настройте проект
Чтобы использовать Transition API в приложении, необходимо объявить зависимость от Google Location and Activity Recognition API версии 12.0.0 или более поздней и указать разрешение com.google.android.gms.permission.ACTIVITY_RECOGNITION в манифесте приложения.
- Чтобы объявить зависимость от API, добавьте ссылку на репозиторий Google Maven и запись реализации в
com.google.android.gms:play-services-location:12.0.0в разделе зависимостей файлаbuild.gradleвашего приложения. Подробнее о том, как настроить сервисы Google Play… Чтобы указать разрешение
com.google.android.gms.permission.ACTIVITY_RECOGNITION, добавьте элемент<uses-permission>в манифест приложения, как показано в примере ниже.<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapp"> <uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION" /> … </manifest>
Регистрация для получения обновлений о переходе между действиями
Чтобы начать получать уведомления о переходах между действиями, необходимо реализовать следующее:
- Объект
ActivityTransitionRequest, который указывает тип активности и перехода. - Обратный вызов
PendingIntent, с помощью которого приложение получает уведомления. Подробнее о том, как использовать отложенный интент…
Чтобы создать объект ActivityTransitionRequest, необходимо создать список объектов ActivityTransition, которые представляют переходы, о которых вы хотите получать уведомления. Объект ActivityTransition содержит следующие данные:
- Тип активности, представленный классом
DetectedActivity. Transition API поддерживает следующие действия: - Тип перехода
ACTIVITY_TRANSITION_ENTERилиACTIVITY_TRANSITION_EXIT. Подробную информацию можно найти в описании классаActivityTransition.
В следующем примере кода показано, как создать список объектов ActivityTransition:
Kotlin
val transitions = mutableListOf<ActivityTransition>() transitions += ActivityTransition.Builder() .setActivityType(DetectedActivity.IN_VEHICLE) .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER) .build() transitions += ActivityTransition.Builder() .setActivityType(DetectedActivity.IN_VEHICLE) .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT) .build() transitions += ActivityTransition.Builder() .setActivityType(DetectedActivity.WALKING) .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT) .build()
Java
List<ActivityTransition> transitions = new ArrayList<>(); transitions.add( new ActivityTransition.Builder() .setActivityType(DetectedActivity.IN_VEHICLE) .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER) .build()); transitions.add( new ActivityTransition.Builder() .setActivityType(DetectedActivity.IN_VEHICLE) .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT) .build()); transitions.add( new ActivityTransition.Builder() .setActivityType(DetectedActivity.WALKING) .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT) .build());
Чтобы создать объект ActivityTransitionRequest, передайте список ActivityTransitions в класс ActivityTransitionRequest, как показано в примере ниже.
Kotlin
val request = ActivityTransitionRequest(transitions)
Java
ActivityTransitionRequest request = new ActivityTransitionRequest(transitions);
Чтобы зарегистрироваться для получения обновлений о смене активности, передайте экземпляр ActivityTransitionRequest и объект PendingIntent в метод requestActivityTransitionUpdates(). Метод requestActivityTransitionUpdates() возвращает объект Task, который можно проверить на успешность выполнения, как показано в примере кода ниже.
Kotlin
// myPendingIntent is the instance of PendingIntent where the app receives callbacks. val task = ActivityRecognition.getClient(context) .requestActivityTransitionUpdates(request, myPendingIntent) task.addOnSuccessListener { // Handle success } task.addOnFailureListener { e: Exception -> // Handle error }
Java
// myPendingIntent is the instance of PendingIntent where the app receives callbacks. Task<Void> task = ActivityRecognition.getClient(context) .requestActivityTransitionUpdates(request, myPendingIntent); task.addOnSuccessListener( new OnSuccessListener<Void>() { @Override public void onSuccess(Void result) { // Handle success } } ); task.addOnFailureListener( new OnFailureListener() { @Override public void onFailure(Exception e) { // Handle error } } );
После успешной регистрации для получения обновлений о смене активности ваше приложение будет получать уведомления в зарегистрированном объекте PendingIntent.
Обработка событий перехода между действиями
Когда происходит запрошенная смена активности, приложение получает обратный вызов Intent. Из Intent можно извлечь объект ActivityTransitionResult, который содержит список объектов ActivityTransitionEvent. События упорядочены в хронологическом порядке. Например, если приложение запрашивает тип активности IN_VEHICLE при переходах ACTIVITY_TRANSITION_ENTER и ACTIVITY_TRANSITION_EXIT, оно получает объект ActivityTransitionEvent, когда пользователь начинает движение на автомобиле, и ещё один, когда пользователь переходит к любому другому действию.
Чтобы реализовать обратный вызов, создайте подкласс BroadcastReceiver и реализуйте метод onReceive(), который будет получать список событий перехода между действиями. Подробнее о трансляциях… Ниже показано, как реализовать метод onReceive().
Kotlin
override fun onReceive(context: Context, intent: Intent) { if (ActivityTransitionResult.hasResult(intent)) { val result = ActivityTransitionResult.extractResult(intent)!! for (event in result.transitionEvents) { // chronological sequence of events.... } } }
Java
@Override public void onReceive(Context context, Intent intent) { if (ActivityTransitionResult.hasResult(intent)) { ActivityTransitionResult result = ActivityTransitionResult.extractResult(intent); for (ActivityTransitionEvent event : result.getTransitionEvents()) { // chronological sequence of events.... } } }
Отмена регистрации для получения обновлений о переходах между действиями
Чтобы отменить регистрацию, вызовите метод removeActivityTransitionUpdates() класса ActivityRecognitionClient и передайте объект PendingIntent в качестве параметра, как показано в примере ниже.
Kotlin
// myPendingIntent is the instance of PendingIntent where the app receives callbacks. val task = ActivityRecognition.getClient(context) .removeActivityTransitionUpdates(myPendingIntent) task.addOnSuccessListener { myPendingIntent.cancel() } task.addOnFailureListener { e: Exception -> Log.e("MYCOMPONENT", e.message) }
Java
// myPendingIntent is the instance of PendingIntent where the app receives callbacks. Task<Void> task = ActivityRecognition.getClient(context) .removeActivityTransitionUpdates(myPendingIntent); task.addOnSuccessListener( new OnSuccessListener<Void>() { @Override public void onSuccess(Void result) { myPendingIntent.cancel(); } } ); task.addOnFailureListener( new OnFailureListener() { @Override public void onFailure(Exception e) { Log.e("MYCOMPONENT", e.getMessage()); } } );
Дополнительные ресурсы
Чтобы узнать больше об использовании API распознавания действий пользователя, ознакомьтесь со следующими материалами:
Образцы
Пример, демонстрирующий рекомендации по распознаванию действий пользователя.