Fence API'ye genel bakış

Farkındalık API'sinde çitler kavramı, bir coğrafi bölgenin veya coğrafi çitin tanımlandığı ve kullanıcının coğrafi çit bölgesine girip çıktığında uygulamanın geri çağırma aldığı coğrafi çit kavramından alınmıştır. Fence API, coğrafi yakınlığa ek olarak diğer birçok bağlam koşulunu da içerecek şekilde coğrafi sınırlama kavramını genişletir. Bir uygulama, bağlam durumu her değiştiğinde geri çağırma alır. Örneğin, uygulamanız kulaklıklar için bir sınır tanımlarsa kulaklıklar takıldığında ve çıkarıldığında geri çağırma işlemleri gerçekleşir.

Aşağıdakiler gibi bağlam 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.
  • Kulaklığın takılı olup olmadığı gibi cihaza özel koşullar
  • Yakındaki beacon'lara yakınlık

Fence API, AND, OR ve NOT Boole operatörleriyle çitler oluşturmak için birden fazla bağlam sinyalini birleştirmenize olanak tanır. Ardından, çit koşulları karşılandığında uygulamanız geri çağırma işlemleri alır. Olası sınırlara ilişkin bazı örnekler:

  • Kullanıcı kulaklıkları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 giriyor.
  • Kullanıcı, belirli bir BLE işaretçisinin aralığı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 kaydetmek üzere 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 amacı işlemek için BroadcastReceiver öğesinin ö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);
        }
    }
}