ユーザーがアクティビティを開始したときや終了したときに検出する

徒歩や、自転車の運転、自動車の運転など、特定のアクティビティをユーザーが開始したときや停止したときに検出できるようなアプリの設計が必要となる場合があります。たとえば、走行距離トラッキング アプリの場合、ユーザーが自動車の運転を開始したら、走行距離のトラッキングを開始できる必要があります。また、メッセージ アプリの場合、自動車の運転を停止するまですべての会話をミュートできる必要があります。

Activity Recognition Transition API を使用すると、ユーザー アクティビティの変化を検出できます。アプリの対象となるアクティビティの遷移を登録しておくと、必要な場合にのみ API がアプリに通知します。このページは、Activity Recognition Transition 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 権限を指定する必要があります。

  1. API への依存関係を宣言するには、Google Maven リポジトリへの参照を追加して、アプリの build.gradle ファイルの依存関係セクションに、com.google.android.gms:play-services-location:12.0.0 に対する実装エントリを追加します。詳細については、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 オブジェクトのリストを作成するコードを以下に示します。

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 オブジェクトを受け取り、ユーザーが他のアクティビティに遷移したときにもう 1 つオブジェクトを受け取ります。

コールバックを実装するには、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....
        }
    }
}

アクティビティ遷移の更新情報の登録を解除する

アクティビティ遷移の更新情報の登録を解除するには、ActivityRecognitionClientremoveActivityTransitionUpdates() メソッドを呼び出して、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 の使用方法の詳細については、次の資料をご覧ください。

サンプル

ユーザーのアクティビティ認識のベスト プラクティスを示したサンプル