徒歩や、自転車の運転、自動車の運転など、特定のアクティビティをユーザーが開始したときや停止したときに検出できるようなアプリの設計が必要となる場合があります。たとえば、走行距離トラッキング アプリの場合、ユーザーが自動車の運転を開始したら、走行距離のトラッキングを開始できる必要があります。また、メッセージ アプリの場合、自動車の運転を停止するまですべての会話をミュートできる必要があります。
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
権限を指定する必要があります。
- API への依存関係を宣言するには、Google Maven リポジトリへの参照を追加して、アプリの
build.gradle
ファイルの依存関係セクションに、com.google.android.gms:play-services-location:12.0.0
に対する実装エントリを追加します。詳細については、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
オブジェクトを受け取り、ユーザーが他のアクティビティに遷移したときにもう 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.... } } }
アクティビティ遷移の更新情報の登録を解除する
アクティビティ遷移の更新情報の登録を解除するには、ActivityRecognitionClient
の removeActivityTransitionUpdates()
メソッドを呼び出して、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 の使用方法の詳細については、次の資料をご覧ください。
サンプル
ユーザーのアクティビティ認識のベスト プラクティスを示したサンプル。