應用程式可能必須經過特別設計,才能識別使用者何時開始或停止 特定活動,例如步行、騎腳踏車或開車。舉例來說 使用者開始開車時,英里追蹤應用程式就會開始追蹤里程數,或是 訊息應用程式可以將所有對話靜音,直到使用者停止駕駛為止。
Activity Recognition Transition API 可用來偵測 使用者活動應用程式訂閱感興趣的活動轉換 且 API 只會在需要時才會向應用程式發出通知。本頁說明如何使用 Activity Recognition Transition API (簡稱為 Transition API)。
設定專案
如要在應用程式中使用 Transition API,您必須宣告
Google Location 和 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
。
物件,代表您要接收通知的轉換
介紹生成式 AI 模型一個
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
回呼。一個
ActivityTransitionResult
敬上
可以從 Intent
中擷取物件,其中包含
ActivityTransitionEvent
如需儲存大量結構化物件
建議使用 Cloud Bigtable事件是按時間順序排列,例如
要求
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 的使用方式,請參閱以下資源: 教材:
範例
展示使用者動作辨識最佳做法的範例。