Awareness API'de sınır kavramı, coğrafi sınır çizme özelliğinden alınmıştır. Bu özellik, bir coğrafi bölgeyi veya coğrafi sınırı tanımlar ve kullanıcı coğrafi sınır bölgesine girdiğinde ya da bölgeden ayrıldığında uygulama geri çağırmalar alır. Fence API, coğrafi sınır çizme kavramını genişleterek coğrafi yakınlığın yanı sıra diğer birçok bağlam koşulunu da kapsar. Uygulama, bağlam durumu her geçiş yaptığında geri çağırma alır. Örneğin, uygulamanız kulaklıklar için bir çit tanımlıyorsa kulaklıklar takıldığında ve çıkarıldığında geri çağırma alır.
Aşağıdaki gibi içerik sinyallerine dayalı çitler tanımlamak için Fence API'yi kullanabilirsiniz:
- Kullanıcının mevcut konumu (enlem/boylam)
- Kullanıcının yürüme veya araba kullanma gibi mevcut etkinliği.
- Cihaza özel koşullar (ör. kulaklığın takılı olup olmadığı)
- Yakındaki işaretçilere yakınlık
Fence API, AND, OR ve NOT Boole operatörleriyle sınır oluşturmak için birden fazla içerik sinyalini birleştirmenize olanak tanır. Ardından, sınır koşulları karşılandığında uygulamanız geri çağırma alır. Olası sınırlara örnek olarak şunlar verilebilir:
- Kullanıcı kulaklığını takıp yürümeye başlıyor.
- Kullanıcı, hafta içi saat 17:00'den önce 100 metrelik bir coğrafi sınıra girer.
- Kullanıcı, belirli bir BLE işaretçisinin kapsama alanına girer.
Aşağıdaki örnekte, kullanıcı her yürüdüğünde etkinleşen bir çitin nasıl tanımlanacağı gösterilmektedir:
AwarenessFence walkingFence = DetectedActivityFence.during(DetectedActivityFence.WALKING);
Bir çit tanımladıktan sonra aşağıdakileri yapmanız gerekir:
- Geri aramaları almak üzere çiti kaydetmek için
updateFencesişlevini çağırın. - Çit durumu değiştiğinde çağrılabilecek bir geri çağırma tanımlayın.
Aşağıdaki örnekte, çit oluşturan ve kaydeden bir yöntem gösterilmektedir. Bu örnekte, çit tetiklendiğinde intent'i işlemek için BroadcastReceiver öğesinin özel bir alt sınıfı kullanılmıştır.
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);
}
}
}