Di Awareness API, konsep fence diambil dari geofencing, yang menentukan wilayah geografis, atau geofence, dan aplikasi menerima callback saat pengguna memasuki atau keluar dari wilayah geofence. Fence API memperluas konsep geofencing untuk menyertakan banyak kondisi konteks lainnya selain kedekatan geografis. Aplikasi menerima callback setiap kali status konteks bertransisi. Misalnya, jika aplikasi Anda menentukan fence untuk headphone, aplikasi akan mendapatkan callback saat headphone dicolokkan dan saat headphone 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 kaki atau mengemudi.
- Kondisi khusus perangkat, seperti apakah headphone dicolokkan.
- Kedekatan dengan beacon terdekat
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 kemungkinan fence mencakup hal berikut:
- Pengguna mencolokkan headphone dan mulai berjalan kaki.
- Pengguna memasuki geofence 100 meter sebelum pukul 17.00 pada hari kerja.
- Pengguna memasuki rentang beacon BLE tertentu.
Contoh berikut menunjukkan cara menentukan fence yang diaktifkan setiap kali pengguna berjalan kaki:
AwarenessFence walkingFence = DetectedActivityFence.during(DetectedActivityFence.WALKING);
Setelah menentukan fence, Anda harus melakukan hal berikut:
- Panggil
updateFencesuntuk mendaftarkan fence agar menerima callback. - Tentukan 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);
}
}
}