Ringkasan Fence API

Di Awareness API, konsep pembatasan wilayah diambil dari geofencing, yang menentukan wilayah geografis, atau pembatasan wilayah, dan aplikasi menerima callback saat pengguna memasuki atau keluar dari wilayah pembatasan wilayah. Fence API memperluas konsep geofencing untuk menyertakan banyak kondisi konteks lainnya selain kedekatan geografis. Aplikasi menerima callback setiap kali transisi status konteks terjadi. Misalnya, jika aplikasi Anda menentukan batas untuk headphone, aplikasi akan mendapatkan callback saat headphone dicolokkan dan saat headphone dicabut.

Anda dapat menggunakan Fence API untuk menentukan pagar berdasarkan sinyal konteks, seperti berikut:

  • Lokasi pengguna saat ini (lintang/bujur)
  • Aktivitas pengguna saat ini, seperti berjalan atau mengemudi.
  • Kondisi khusus perangkat, seperti apakah headphone dicolokkan.
  • Jarak ke beacon terdekat

Fence API memungkinkan Anda menggabungkan beberapa sinyal konteks untuk membuat pagar dengan operator boolean AND, OR, dan NOT. Aplikasi Anda kemudian menerima callback setiap kali kondisi batas terpenuhi. Berikut beberapa contoh kemungkinan batas:

  • Pengguna mencolokkan headphone dan mulai berjalan.
  • Pengguna memasuki geofence 100 meter sebelum pukul 17.00 pada hari kerja.
  • Pengguna memasuki rentang beacon BLE tertentu.

Contoh berikut menunjukkan cara menentukan batas yang diaktifkan setiap kali pengguna berjalan:

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

Setelah menentukan batas, Anda harus melakukan hal berikut:

  • Panggil updateFences untuk mendaftarkan batas agar menerima callback.
  • Tentukan callback yang dapat dipanggil saat status pagar berubah.

Contoh berikut menunjukkan metode yang membuat dan mendaftarkan pagar. Dalam contoh ini, subkelas kustom BroadcastReceiver digunakan untuk menangani intent saat pagar dipicu.

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