Fence API'ye genel bakış

Awareness API'de çitler kavramı, bir coğrafi bölgenin veya coğrafi çitin tanımlandığı ve bir kullanıcı coğrafi çit bölgesine girdiğinde veya bu bölgeden çıktığında uygulamanın geri çağırma aldığının belirlendiği coğrafi çitleme'den alınmıştır. Çit API'si, coğrafi yakınlığa ek olarak birçok başka bağlam koşulunu içerecek şekilde coğrafi sınırlama kavramını genişletir. Uygulama, bağlam durumu geçişlerinde geri çağırma alır. Örneğin, uygulamanız kulaklıklar için bir çit tanımlarsa kulaklıklar takıldığında ve çıkarıldığında geri çağrı alır.

Aşağıdakiler gibi bağlam sinyallerine göre çitler tanımlamak için Fence API'yi kullanabilirsiniz:

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

Fence API, AND, OR ve NOT mantıksal operatörleriyle çitler oluşturmak için birden fazla bağlam sinyalini birleştirmenize olanak tanır. Ardından, çit koşulları her karşılandığında uygulamanız geri çağrı alır. Olası çitlere örnek olarak aşağıdakiler verilebilir:

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

Aşağıdaki örnekte, kullanıcı 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 şunları yapmanız gerekir:

  • Geri arama almak için çiti kaydettirmek üzere updateFences numaralı telefonu arayın.
  • Çit durumu değiştiğinde çağrılabilecek bir geri çağırma işlevi 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 sınıfının özel bir alt sınıfı kullanılmaktadı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);
        }
    }
}