Phát hiện thời điểm người dùng bắt đầu hoặc kết thúc một hoạt động

Bạn có thể cần phải thiết kế ứng dụng để xác định thời điểm người dùng bắt đầu hoặc dừng một hoạt động cụ thể, chẳng hạn như đi bộ, đi xe đạp hoặc lái xe. Ví dụ: ứng dụng theo dõi số dặm có thể bắt đầu theo dõi dặm đường khi người dùng bắt đầu lái xe hoặc ứng dụng nhắn tin có thể tắt tiếng tất cả các cuộc trò chuyện cho đến khi người dùng dừng lái xe.

Bạn có thể sử dụng API chuyển đổi nhận dạng hoạt động để phát hiện các thay đổi trong hoạt động của người dùng. Ứng dụng sẽ đăng ký chuyển đổi theo các hoạt động bạn quan tâm và API chỉ thông báo cho ứng dụng khi cần. Trang này trình bày cách sử dụng API chuyển tiếp nhận dạng hoạt động, gọi tắt là API chuyển đổi.

Thiết lập dự án

Để sử dụng API chuyển đổi trong ứng dụng, bạn phải khai báo phần phụ thuộc Nhận dạng vị trí và hoạt động của Google API phiên bản 12.0.0 trở lên và chỉ định quyền cho ứng dụng com.google.android.gms.permission.ACTIVITY_RECOGNITION trong tệp kê khai ứng dụng.

  1. Để khai báo phần phụ thuộc với API, hãy thêm một tệp tham chiếu đến kho lưu trữ của Google và thêm mục nhập triển khai vào phần phụ thuộc com.google.android.gms:play-services-location:12.0.0 của tệp build.gradle trong ứng dụng. Để biết thêm thông tin, hãy xem nội dung Thiết lập Dịch vụ Google Play.
  2. Để chỉ định quyền com.google.android.gms.permission.ACTIVITY_RECOGNITION, hãy đưa phần tử <uses-permission> vào tệp kê khai ứng dụng như trong ví dụ sau:

     <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>
    

Đăng ký nhận thông tin cập nhật về việc chuyển đổi hoạt động

Để nhận được thông báo về việc chuyển đổi hoạt động, bạn phải triển khai các nội dung sau:

Để tạo đối tượng ActivityTransitionRequest, bạn phải tạo danh sách các đối tượng ActivityTransition đại diện cho chuyển đổi mà bạn muốn nhận thông báo. Đối tượng ActivityTransition bao gồm các dữ liệu sau:

Mã sau đây cho biết cách tạo danh sách đối tượng 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());

Có thể tạo đối tượng ActivityTransitionRequest bằng cách chuyển danh sách ActivityTransitions đến lớpActivityTransitionRequest, như ở ví dụ sau:

Kotlin

val request = ActivityTransitionRequest(transitions)

Java

ActivityTransitionRequest request = new ActivityTransitionRequest(transitions);

Bạn có thể đăng ký nhận thông tin cập nhật về việc chuyển đổi hoạt động bằng cách chuyển bản sao của ActivityTransitionRequest và đối tượng PendingIntent vào requestActivityTransitionUpdates(). Phương thức requestActivityTransitionUpdates() trả về đối tượng Task và bạn có thể kiểm tra xem có thành công hay không, như trong mã sau ví dụ:

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
        }
    }
);

Sau khi đăng ký thành công thông tin cập nhật về việc chuyển đổi hoạt động, ứng dụng sẽ nhận được thông báo trong PendingIntent đã đăng ký.

Xử lý sự kiện chuyển đổi hoạt động

Khi quá trình chuyển đổi hoạt động được yêu cầu diễn ra, ứng dụng sẽ nhận được một lệnh gọi lại Intent. Một đối tượng ActivityTransitionResult có thể được trích xuất từIntent, trong đó có một danh sách các đối tượng ActivityTransitionEvent. Các sự kiện được sắp xếp theo trình tự thời gian, ví dụ: nếu ứng dụng yêu cầuIN_VEHICLE cho loại hoạt động trên ACTIVITY_TRANSITION_ENTER và chuyển đổi ACTIVITY_TRANSITION_EXIT thì nhận được đối tượng ActivityTransitionEvent khi người dùng bắt đầu lái xe, và một đối tượng khác khi người dùng chuyển đổi sang bất kỳ hoạt động nào khác.

Bạn có thể triển khai hàm gọi lại bằng cách tạo một lớp con của BroadcastReceiver và triển khai phương thức onReceive() để nhận danh sách các sự kiện chuyển đổi hoạt động. Để biết thêm thông tin, hãy xem nội dung Chương trình phát sóng. Ví dụ sau cho thấy cách triển khai phương thức 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....
        }
    }
}

Hủy đăng ký nhận thông tin cập nhật về việc chuyển đổi hoạt động

Có thể hủy đăng ký nhận thông tin cập nhật về hoạt động chuyển đổi bằng cách gọi phương thức removeActivityTransitionUpdates() của ActivityRecognitionClient và chuyển đối tượng PendingIntent dưới dạng thông số, như hiển thị ở ví dụ sau:

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());
        }
    }
);