Fence API'ye genel bakış

Awareness API'de çitler kavramı, bir coğrafi bölgenin veya geofence'in tanımlandığı coğrafi sınır özelliğinden alınır ve bir kullanıcı coğrafi sınır bölgesine girdiğinde veya bu bölgeden ayrıldığında bir uygulama geri çağırma alır. Fence API, coğrafi sınır çizme kavramının kapsamını, coğrafi yakınlığa ek olarak birçok başka bağlam koşulunu da içerecek şekilde genişletir. Bağlam durumu her değiştiğinde uygulama bir geri çağırma alır. Örneğin, uygulamanız kulaklıklar için bir çit tanımladıysa kulaklık takıldığında ve fişe takılı değilse geri çağırma işlemi gerçekleştirir.

Aşağıdakiler gibi içerik sinyallerine göre çit tanımlamak için Çit API'sini kullanabilirsiniz:

  • Kullanıcının geçerli konumu (enlem/boylam)
  • Yürüme veya araba kullanma gibi kullanıcının mevcut etkinliği.
  • Kulaklığın takılı olup olmaması gibi cihaza özgü koşullar.
  • Yakındaki işaretçilere yakınlık

Fence API birden fazla bağlam sinyalini birleştirerek AND, OR ve NOT boole operatörleriyle çit oluşturabilirsiniz. Ardından, çit koşulları karşılandığında uygulamanız geri çağırma alır. Olası çitlere örnek olarak aşağıdakiler verilebilir:

  • Kullanıcı kulaklığı takıp yürümeye başlar.
  • Kullanıcı, hafta içi 17:00'den önce 100 metre coğrafi sınır çizer.
  • Kullanıcı belirli bir BLE işaretçisinin aralığını girer.

Aşağıdaki örnekte, kullanıcı her yürürken 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 çağırmaları almak için çiti kaydetmek için updateFences numaralı telefonu arayın.
  • Çit durumu değiştiğinde çağrılabilecek bir geri çağırma tanımlayın.

Aşağıdaki örnekte bir çit oluşturan ve kaydeden bir yöntem gösterilmektedir. Bu örnekte, çit tetiklendiğinde niyeti işlemek için BroadcastReceiver adlı özel bir alt sınıf kullanılı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);
        }
    }
}