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

Trong API Nhận biết, khái niệm rào được lấy từ tính năng 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 vào hoặc rời khỏi khu vực khoanh vùng địa lý. Fence API mở rộng khái niệm khoanh vùng đị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 ngữ 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 được rút ra.

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

  • 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ư liệu bạn có cắm tai nghe hay không.
  • Khoảng cách đến các beacon ở gầ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 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ề 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 đi vào khoanh vùng địa lý 100 mét trước 5 giờ chiều vào ngày thường.
  • Người dùng đi vào phạm vi của một beacon BLE cụ thể.

Ví dụ sau đây cho biết 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 hàng rào, bạn phải làm như sau:

  • Gọi updateFences để đăng ký hàng rào nhận lệnh gọi lại.
  • Xác định 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);
        }
    }
}