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