Huawei Geofence Servisine Dair Her Şey

Ömer Akkuş
Huawei Developers - Türkiye
6 min readJun 28, 2020

Herkese Merhabalar,

Bugün Huawei Location servisinin önemli özelliklerinden biri olan Geofence özelliğini daha geniş kapsamlı örneklerle ele alacağım. Bir önceki yazım biraz daha Geofence giriş tadındaydı. Önceki yazıma aşağıdan ulaşabilirsiniz.

Geofence Nedir ?

Daha önceki yazımda bahsettiğim gibi Geofence, Location servislerinin kullandığı en önemli özelliklerden biridir. Geofence coğrafi çit anlamına gelir. Coğrafi çitler, cihazlara dünyadaki dairesel bir alanı izleme gücü verir ve cihazın o alana her girdiğinde veya buradan çıktığında sizi bilgilendirmesine izin verir. Sadece belirli bir alana giriş veya çıkış değil, kullanıcının belirli bir süre o alanda kaldığında da kullanıcıyı bilgilendirmenize yardımcı olmaktadır.

Geofence günümüzde perakende başta olmak üzere bir çok şirketin kullandığı konum servisi özelliklerinden biridir. Perakende şirketleri müşterilerinin kendi mağazalarına yakın bir alana giriş veya çıkış yaptığında müşterilerine bilgilendirme mesajı gönderebilir. Örnekler başka sektörler için de genişletilebilir.

Bugün yazımda Geofence kullanımını örneklerle ele alacağım. Belirli bir alana giriş veya çıkış yapıldığında veya belirli bir süre o alanda kalındığında kullanıcıya Push notification yollayarak kullanıcıyı bilgilendireceğiz.

Geofence servisini kullanabilmeniz için öncelikle Huawei Location servisini projenize entegre etmelisiniz. Huawei Location servisini developer hesabı açma zorunluluğu olmadan hızlı ve kolay bir şekilde entegre edebilir ve Location servislerini kullanmaya başlayabilirsiniz. Location servislerini kullanmaya başlayabilmek için aşağıdaki codelab sayesinde hızlıca projenizi hazır hale getirebilirsiniz.

Gerekli repoları ekledikten sonra gradle dosyamıza location dependencies eklememiz gerekmektedir.

Bu işlemlerden sonra artık Geofence servisimizi kullanmaya hazırız.

İlk olarak AndroidManifest.xml içerisine konum ve internet izinlerini eklememiz gerekmektedir. Bu eklemeleri yaptıktan sonra kullanıcının konumunu sürekli dinlememizi sağlayan Broadcast Receiver ları manifest dosyamıza ekliyoruz. Ben örnek projemde Job Intent servisini kullanarak bunu gerçekleştirdim.

AndroidManifest.xml dosyamıza gerekli tanımlamaları yaptıktan sonra broadcast receiver oluşturmamız gerekmektedir.

Daha sonra Job Intent servisimizi eklememiz gerekiyor. Burada belirlenen geofence tetiklendiği zaman broadcast receiver bizi uyaracak ve sendNotification() metoduna ilgili geofence bilgilerini iletecek. Bu metot sayesinde ise kullanıcıya bildirim gönderilebilecek.

Broadcast receiver tanımlamalarını yaptıktan sonra sıra activity üzerinde gerçekleştireceğimiz işlemleri kapsamaktadır.

Demo uygulamamda ben geofence konum bilgilerini statik olarak tanımladım. İsterseniz konum bilgilerini harita üzerinden tıklanıldığında geofence için belirlenecek olan latitude,longitude,title gibi bilgileri kullanıcıdan alabilir ve dinamik hale getirebilirsiniz.

Kod örneğine geçmeden önce geofence için kullanacağımız önemli metotları açıklamak istiyorum. Bu metotları aşağıdaki tabloda görebilirsiniz. Geofencemizi oluşturmak için Geofence.Buider sınıfını kullanmamız gerekiyor.

Methods of Geofence

setRoundArea: Bu metot geofencemiz için en önemli metotlardan biridir. Bu metot içerisine geofence’nin latitude,longitude ve ne kadarlık bir alanı kapsayacağını bildiren radius alanını eklememiz gerekir. Android radius değerini 100 veya 200 metre olarak önermektedir.

setUniqueId: Her Geofence’nin bir unique id değeri vardır. Bu unique değer ile geofenceler birbirinden ayrılır. Bu metot ile geofencemize bir unique id veriyoruz.

setConversions: Geofence’nin türünü seçmemizi sağlayan metottur. Hangi event sonucu kullanıcıyı bildireceğimizi belirlememize yardımcı olur. Kullanıcı geofence alanına giriş,çıkış veya belirli bir süre alan içerisinde bekleyecekse bu metota o değeri tanımlamalıyız.

Type of conversions

Yukarıdaki resimde conversion türlerini görebilirsiniz. Eğer kullanıcıya belirli bir coğrafi çit içerisini girdiğinde bilgilendirme yapacaksanız; ENTER_GEOFENCE_CONVERSION değerini seçmeniz gerekecektir. Alandan çıkış için EXIT_GEOFENCE_CONVERSION, alan içerisinde belirli bir süre bekleyecek ise DWELL_GEOFENCE_CONVERSION değerini seçmelisiniz.

setValidContinueTime: Bu metot ise geofence’nin ne kadarlık süre ile aktif olacağı bilgisini içerir. Buraya tanımlayacağınız değer sayesinde geofence o değere göre otomatik olarak kendini remove edecektir. Eğer geofence’nin hiç bir zaman expire olmasını istemiyorsanız bu metota GEOFENCE_NEVER_EXPIRE değerini vermelisiniz.

setDwellDelayTime: Bu metot sadece DWELL_GEOFENCE_CONVERSION türüne ait bir geofenceye sahipsek kullanabiliriz. Bir alana giriş veya çıkış eventlerine sahip geofencemiz var ise bu metotu kullanmamıza gerek yoktur. Bu metot sayesinde kullanıcıya coğrafi çit içerisinde ne kadar bir süre sonunda bildirim gönderilecek ise o değeri atamamız gerekir. Örneğin bu metota 10000 değerini verdiğinizde kullanıcı eğer 10 saniye boyunca coğrafi çit alanı içerisinde olursa kullanıcıya bilgilendirme mesajı gönderilecektir.

setNotificationInterval: Bu metot ise, herhangi bir geofence trigger olduğunda kullanıcıya anında bildirim göndermek yerine bu metota belirleyeceğiniz değer sonucunda kullanıcıya bildiri gönderilecektir. Örneğin bu metota 10000 değerini verdiğinizi varsayalım. Kullanıcı coğrafi çit alanına girdiğinde anında bilgilendirilmeyecek buradaki metotun değerine göre 10 saniye sonra kullanıcıya bilgilendirme yapılacak. Bu metotun kullanım amacı kullanıcının batarya ömrünü korumaktır. Ancak kullanıcı bilgilendirme tarafında gecikmelere sebep verdiği için kullanımı tavsiye edilmez.

Geofence servisimize ait metotları tanıdığımıza göre örnek kodumuza devam edebiliriz.

Aşağıdaki kod bloğunda statik olarak tanımladığım 2 adet geofence bilgisini görebilirsiniz. Bunlardan birinin id’si Home diğerinin ise Office. Daha önce bahsettiğim gibi her geofence’nin bir geofenceId si bulunmaktadır. GeofenceId sayesinde geofenceler unique hale gelir ve birbirlerinden ayrılır.

Son adım olarak MainActivity sayfamızdaki kodları kısaca açıklamam gerekirse;

İlk olarak GeofenceService türünde bir değişken tanımlıyoruz. Daha sonra broadcast receverımızı tetiklemeye yardımcı olan pendingIntent tanımlaması yapmalıyız. Bu tanımlamalardan sonra geofencelerimizi tuttuğumuz geofence tipinde bir ArrayList oluşturmalıyız. Bu list’in içerisinde geofenceye ait tüm bilgileri saklayacağız.

Daha sonra geofenceService ve geofenceList değişkenlerimizi onCreate() içerisinde tekrar load ediyoruz. populateGeofenceList() metodunu burada çağırarak statik olarak oluşturduğumuz geofenceleri geofenceList’in içerisine ekliyoruz. Bu örnekte conversion tipi olarak ENTER ve DWELL kullandığımız için kullanıcı geofence alanına girdiğinde ve belirlemiş olduğumuz 10 saniye değerine göre geofence alanı içerisinde kaldığında ilgili geofence tetiklenecek.

Daha sonra addGeofences() metodu sayesinde geofenceleri, geofence servisine ekleyerek işlemi tamamlıyoruz. addGeofences() metodu içerisine geofenceRequest ve pendingIntent değerlerini eklememiz gerekmektedir.

GeofenceRequest metodunu açıklamak gerekirse; broadcast receiver tarafından dinlenilmesi istenilen geofenceleri bu metod içerisine liste olarak eklemeliyiz. Burada önemli bir nokta setInitConversion() metodu içerisine hangi geofence türleri var ise o türleri eklemeliyiz. Örnek vermek gerekirse aşağıdaki kod bloğunda geofenceList oluştururken setConversion() metotuna ENTER_GEOFENCE_CONVERSION ve DWELL_GEOFENCE_CONVERSION eklediğimiz için geofenceRequest içerisinde bulunan setInitConversion() metodu içerisine de bunlarla ilgili olduğu için DWELL_INIT_CONVERSION ve ENTER_INIT_CONVERSION türlerini eklemelisiniz.

Tüm bu işlemleri tamamladıktan sonra addGeofences() metodumuz içerisinde göreceğiniz gibi createGeofenceList metodu içerisine geofenceRequest ve pendingIntent değerlerini ekledikten sonra işlemleri tamamlıyoruz.

Artık geofence listemiz hazır ve cihaz sürekli arka planda kullanıcının konumunu dinleyerek kullanıcı herhangi bir geofence alanı içerisine girdiğinde ve belirli bir süre o coğrafi çitin içerisinde kaldığında broadcast receiver tetiklenecek ve ilgili geofence’ye ait bilgileri Push notification içerisinde görebileceğiz.

Uygulamanın çıktılarını aşağıdaki resimlerde görebilirsiniz.

Result of Geofence

Gördüğünüz gibi Home uniqueId sine sahip olan geofence alanının içerisine kullanıcı giriş yaptığı için Entered:HOME bildirimini kullanıcıya gönderdik. Daha sonra kullanıcı aynı geofence alanı içerisinde 10 saniye kaldığı için bu sefer Dwell:HOME bildirim mesajını almıştır.

Huawei Location servislerinden biri olan Geofence servisini detaylı bir şekilde örneklerle anlatmaya çalıştım. Umarım herkes için faydalı bir yazı olmuştur. Vakit ayırıp okuduğunuz için teşekkür ederim.

Projenin tamamına aşağıdaki linkten ulaşabilirsiniz.

Kaynaklar

--

--