偵測使用者何時開始或結束一項活動

應用程式可能必須經過特別設計,才能識別使用者何時開始或停止 特定活動,例如步行、騎腳踏車或開車。舉例來說 使用者開始開車時,英里追蹤應用程式就會開始追蹤里程數,或是 訊息應用程式可以將所有對話靜音,直到使用者停止駕駛為止。

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 權限 。

  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。 物件,代表您要接收通知的轉換 介紹生成式 AI 模型一個 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 的使用方式,請參閱以下資源: 教材:

範例

展示使用者動作辨識最佳做法的範例