10/10/2018, 17:54

Activity Recognition Transition API

Điện thoại ngày nay là một thiết bị vô cùng phổ biến, hầu như ai cũng phải trang bị cho mình ít nhất 1 cái. Người cũng cũng luôn mang theo điện thoại bên mình trong rất nhiều các hoạt động khác nhau. Và để cải thiện ứng dụng và mang lại nhiều trải nghiệm cho người dùng hơn thì nhà phát triển cần ...

Điện thoại ngày nay là một thiết bị vô cùng phổ biến, hầu như ai cũng phải trang bị cho mình ít nhất 1 cái. Người cũng cũng luôn mang theo điện thoại bên mình trong rất nhiều các hoạt động khác nhau. Và để cải thiện ứng dụng và mang lại nhiều trải nghiệm cho người dùng hơn thì nhà phát triển cần rất nhiều thông tin hoạt động của người dùng như đi bộ, lái xe. Trước đây thì các nhà phát triển phải tự viết các service chạy ngầm nhằm có thể tracking liên tục hoạt động của người dùng rồi từ đó đưa ra các action tương ứng kịp thời để có thể mang lại những trải nghiệm thú vị trên app của họ. Và việc tracking liên tục này thường sẽ gây tốn pin, đây là 1 điều không hay chút nào khi dung lượng pin là thứ mà người dùng cũng rất lưu tâm.

Và để giải quyết vấn đề trên thì hiện nay Gu gờ Service đã đưa ra Activity Recognition Transition API để hỗ trợ, giúp cải thiện tốt hơn vấn đề trên. Activity Recognition Transition API sẽ cung cấp cho app của bạn những thông tin cần thiết tại các thời điểm phù hợp khi người dùng có sự thay đổi về hoạt động thay vì phải chạy ngầm service liên tục như ngày xưa. Quá ngon phải không :v

Library Setup

Để sử dụng Transition API, bạn cần implement Google Location and Activity Recognition API version 12.0.0 hoặc cao hơn:

implementation 'com.google.android.gms:play-services-location:12.0.0'

Và tiếp đó là khai báo com.google.android.gms.permission.ACTIVITY_RECOGNITION permission trong Manifest.xml:

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

Registering for Updates

Để nhận được notification từ activity transitions, hãy thực hiện implement theo các bước sau:

  • Tạo một object ActivityTransitionRequest để chỉ định type của activity and transition.
  • Tạo một PendingIntent callback - đây sẽ là nơi mà app bạn sẽ nhận notification về.

Để tạo ActivityTransitionRequest object, bạn phải tạo một list ActivityTransition object - list transition mà bạn muốn nhận notification về.

Một ActivityTransition sẽ bao gồm:

Activity type được đại diện bởi DetectedActivity class. Transition API có support các activity type sau:

  • IN_VEHICLE
  • ON_BICYCLE
  • RUNNING
  • STILL
  • WALKING

Transition type được đại diện bởi ActivityTransition class:

  • ACTIVITY_TRANSITION_ENTER
  • ACTIVITY_TRANSITION_EXIT

Ví dụ, ta tạo một ActivityTransition objects bao gồm 2 Activity type: WALKING, STILL và 2 Transition type: ACTIVITY_TRANSITION_ENTER, ACTIVITY_TRANSITION_EXIT:

List<ActivityTransition> transitions = new ArrayList<>();

transitions.add(
  new ActivityTransition.Builder()
    .setActivityType(DetectedActivity.WALKING)
    .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
    .build());

transitions.add(
  new ActivityTransition.Builder()
    .setActivityType(DetectedActivity.WALKING)
    .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
    .build());

transitions.add(
  new ActivityTransition.Builder()
    .setActivityType(DetectedActivity.STILL)
    .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
    .build());

transitions.add(
  new ActivityTransition.Builder()
    .setActivityType(DetectedActivity.STILL)
    .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
    .build());

tiếp theo là ActivityTransitionRequest:

ActivityTransitionRequest request = new ActivityTransitionRequest(transitions);

Và sau đó là add listener để check success hay failure:

// 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 đã register thành công activity transition updates, ứng dụng của bạn sẽ nhận được các notification transition trong PendingIntent đã được đăng ký trong Task.

Processing Events

Khi mà activity transition mà ứng dụng đăng ký có sự thay đổi, thì đồng thời app cũng sẽ nhận được một Intent callback. Một ActivityTransitionResult object có thể được truyền vào extract của Intent, nó bao gồm một list các ActivityTransitionEvent object. Các event sẽ được sắp xếp theo trình tự thời gian, ví dụ như nếu ứng dụng request activity type là IN_VEHICLE và transition type là ACTIVITY_TRANSITION_ENTER và ACTIVITY_TRANSITION_EXIT thì ứng dụng sẽ nhận được ActivityTransitionEvent khi người dùng bắt đầu lái xe, và một event khác khi người dùng chuyển sang bất kỳ hoạt động nào khác.

Bạn có thể tạo một BroadcastReceiver và implement phương thức onReceive() để có thể nhận được list activity transition event.

@Override
protected void onReceive(Context context, Intent intent) {
  if (ActivityTransitionResult.hasResult(intent)) {
    ActivityTransitionResult result = ActivityTransitionResult.extractResult(intent);
    for (ActivityTransitionEvent event : result.getTransitionEvents()) {
        // chronological sequence of events....
    }
  }
}

De-registering Updates

Đăng ký được thì cũng hủy đăng ký được, bạn có thể hủy đăng ký các activity transition bằng cách sử dụng phương thức removeActivityTransitionUpdates() của ActivityRecognitionClient:

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

Chạy test thử nào.

Trên đây là cách cơ bản sử dụng Activity Recognition Transition API trong Android App. Bạn có thể tracking hoạt động của người dùng một cách dễ dàng hơn, tiện lợi hơn từ đó có thể phát triển ứng dụng một cách tốt hơn.

0