Ringkasan Fence API

Di Awareness API, konsep pagar diambil dari pembatasan wilayah, tempat wilayah geografis, atau pagar wilayah, ditentukan, dan aplikasi menerima callback saat pengguna memasuki atau meninggalkan wilayah pembatasan wilayah. Fence API memperluas konsep pembatasan wilayah untuk menyertakan banyak kondisi konteks lain selain kedekatan geografis. Aplikasi menerima callback setiap kali status konteks bertransisi. Misalnya, jika aplikasi Anda menetapkan pagar untuk headphone, aplikasi tersebut akan mendapatkan callback saat headphone dicolokkan dan saat dicabut.

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

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

Fence API memungkinkan Anda menggabungkan beberapa sinyal konteks untuk membuat fence dengan operator boolean AND, OR, dan NOT. Aplikasi Anda kemudian akan menerima callback setiap kali kondisi fence terpenuhi. Beberapa contoh pagar yang mungkin mencakup hal berikut:

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

Contoh berikut menunjukkan cara menentukan fence yang aktif setiap kali pengguna berjalan:

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

Setelah menentukan fence, Anda harus melakukan hal-hal berikut:

  • Panggil updateFences untuk mendaftarkan fence guna menerima callback.
  • Menentukan callback yang dapat dipanggil saat status fence berubah.

Contoh berikut menunjukkan metode yang membuat dan mendaftarkan fence. Dalam contoh ini, subclass kustom BroadcastReceiver digunakan untuk menangani intent saat fence 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);
        }
    }
}