Определяйте, когда пользователи начинают или заканчивают действие

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

API перехода для распознавания активности можно использовать для обнаружения изменений в активности пользователя. Ваше приложение подписывается на переход интересующих действий, и API уведомляет ваше приложение только при необходимости. На этой странице показано, как использовать API перехода для распознавания активности, сокращенно также называемый API перехода.

Настройте свой проект

Чтобы использовать API перехода в своем приложении, вы должны объявить зависимость от Google Location and Activity Recognition API версии 12.0.0 или выше и указать разрешение com.google.android.gms.permission.ACTIVITY_RECOGNITION в манифесте приложения.

  1. Чтобы объявить зависимость от API, добавьте ссылку на репозиторий Google maven и добавьте запись реализации com.google.android.gms:play-services-location:12.0.0 в раздел зависимостей файла build.gradle вашего приложения. . Дополнительную информацию см. в разделе «Настройка сервисов Google Play» .
  2. Чтобы указать разрешение 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 , необходимо создать список объектов ActivityTransition , представляющих переход, о котором вы хотите получать уведомления. Объект 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 распознавания активности пользователей, просмотрите следующие материалы:

Образцы

Пример , демонстрирующий лучшие практики распознавания активности пользователей.