Tổng quan về API hàng rào

Trong Awareness API, khái niệm về hàng rào được lấy từ khoanh vùng địa lý, trong đó một khu vực địa lý hoặc khoanh vùng địa lý được xác định và ứng dụng sẽ nhận được lệnh gọi lại khi người dùng nhập hoặc rời khỏi khu vực khoanh vùng địa lý. Fence API mở rộng khái niệm về hàng rào địa lý để bao gồm nhiều điều kiện ngữ cảnh khác ngoài khoảng cách địa lý. Ứng dụng sẽ nhận được lệnh gọi lại bất cứ khi nào trạng thái bối cảnh chuyển đổi. Ví dụ: nếu ứng dụng của bạn xác định một hàng rào cho tai nghe, thì ứng dụng sẽ nhận được lệnh gọi lại khi tai nghe được cắm và khi tai nghe bị rút phích cắm.

Bạn có thể sử dụng Fence API để xác định các hàng rào dựa trên tín hiệu ngữ cảnh, chẳng hạn như:

  • Vị trí hiện tại của người dùng (vĩ độ/kinh độ)
  • Hoạt động hiện tại của người dùng, chẳng hạn như đi bộ hoặc lái xe.
  • Các điều kiện dành riêng cho thiết bị, chẳng hạn như việc tai nghe có được cắm vào hay không.
  • Khoảng cách gần với các thiết bị báo hiệu lân cận

Fence API cho phép bạn kết hợp nhiều tín hiệu ngữ cảnh để tạo hàng rào bằng các toán tử boolean AND, ORNOT. Sau đó, ứng dụng của bạn sẽ nhận được lệnh gọi lại bất cứ khi nào các điều kiện của hàng rào được đáp ứng. Sau đây là một số ví dụ về các hàng rào có thể có:

  • Người dùng cắm tai nghe và bắt đầu đi bộ.
  • Người dùng truy cập vào hàng rào địa lý trong phạm vi 100 mét trước 5 giờ chiều vào một ngày trong tuần.
  • Người dùng truy cập vào phạm vi của một beacon BLE cụ thể.

Ví dụ sau đây cho thấy cách xác định một hàng rào kích hoạt bất cứ khi nào người dùng đi bộ:

AwarenessFence walkingFence = DetectedActivityFence.during(DetectedActivityFence.WALKING);

Sau khi xác định một hàng rào, bạn phải làm như sau:

  • Gọi updateFences để đăng ký hàng rào nhằm nhận các lệnh gọi lại.
  • Xác định một lệnh gọi lại có thể được gọi khi trạng thái hàng rào thay đổi.

Ví dụ sau đây cho thấy một phương thức tạo và đăng ký hàng rào. Trong ví dụ này, một lớp con tuỳ chỉnh của BroadcastReceiver được dùng để xử lý ý định khi hàng rào được kích hoạt.

Awareness.getFenceClient(this).updateFences(new FenceUpdateRequest.Builder()
    .addFence(FENCE_KEY, exercisingWithHeadphonesFence, mPendingIntent)
    .build())
    .addOnSuccessListener(new OnSuccessListener<Void>() {
        @Override
        public void onSuccess(Void aVoid) {
            Log.i(TAG, "Fence was successfully registered.");
        }
    })
    .addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            Log.e(TAG, "Fence could not be registered: " + e);
        }
    });
public class FenceReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

        FenceState fenceState = FenceState.extract(intent);

        if (TextUtils.equals(fenceState.getFenceKey(), FENCE_KEY)) {
            String fenceStateStr;
            switch (fenceState.getCurrentState()) {
                case FenceState.TRUE:
                    fenceStateStr = "true";
                    break;
                case FenceState.FALSE:
                    fenceStateStr = "false";
                    break;
                case FenceState.UNKNOWN:
                    fenceStateStr = "unknown";
                    break;
                default:
                    fenceStateStr = "unknown value";
            }
            mLogFragment.getLogView().println("Fence state: " + fenceStateStr);
        }
    }
}