Возможно, потребуется разработать приложение так, чтобы оно определяло, когда пользователь начинает или прекращает определенное действие, например ходьбу, езду на велосипеде или вождение. Например, приложение для отслеживания пробега может начать отслеживать мили, когда пользователь начинает водить машину, или приложение для обмена сообщениями может отключать все разговоры до тех пор, пока пользователь не перестанет водить машину.
API перехода для распознавания активности можно использовать для обнаружения изменений в активности пользователя. Ваше приложение подписывается на переход интересующих действий, и API уведомляет ваше приложение только при необходимости. На этой странице показано, как использовать API перехода для распознавания активности, сокращенно также называемый API перехода.
Настройте свой проект
Чтобы использовать 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
. API перехода поддерживает следующие действия: - Тип перехода
ACTIVITY_TRANSITION_ENTER
илиACTIVITY_TRANSITION_EXIT
. Дополнительные сведения см. в классеActivityTransition
.
Следующий код показывает, как создать список объектов ActivityTransition
:
Котлин
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()
Ява
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
, как показано в следующем примере:
Котлин
val request = ActivityTransitionRequest(transitions)
Ява
ActivityTransitionRequest request = new ActivityTransitionRequest(transitions);
Вы можете зарегистрироваться для получения обновлений перехода активности, передав свой экземпляр ActivityTransitionRequest
и объект PendingIntent
методу requestActivityTransitionUpdates()
. Метод requestActivityTransitionUpdates()
возвращает объект Task
, успех или неудачу которого можно проверить, как показано в следующем примере кода:
Котлин
// 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 }
Ява
// 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
. Объект ActivityTransitionResult
можно извлечь из Intent
, который включает список объектов ActivityTransitionEvent
. События упорядочены в хронологическом порядке, например, если приложение запрашивает тип действия IN_VEHICLE
при переходах ACTIVITY_TRANSITION_ENTER
и ACTIVITY_TRANSITION_EXIT
, оно получает объект ActivityTransitionEvent
, когда пользователь начинает движение, и еще один объект, когда пользователь переходит к любому другому действию. .
Вы можете реализовать свой обратный вызов, создав подкласс BroadcastReceiver
и реализовав метод onReceive()
для получения списка событий перехода активности. Дополнительную информацию см. в разделе Трансляции . В следующем примере показано, как реализовать метод onReceive()
:
Котлин
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.... } } }
Ява
@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
в качестве параметра, как показано в следующем примере:
Котлин
// 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) }
Ява
// 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 распознавания активности пользователей, просмотрите следующие материалы:
Образцы
Пример , демонстрирующий лучшие практики распознавания активности пользователей.