Huawei Push Kit ile arama ekranı yapımı

Alperen Babagil
Huawei Developers - Türkiye
3 min readAug 14, 2020

Herkese merhaba arkadaşlar. Bu yazımda Huawei Push Kit kullanarak bir canlı arama uygulamasının çalma ekranının yapımını anlatacağım. Öncelikle HMS Push Kit’i uygulamanıza entegre etmeniz gerekiyor. Push Kit Data mesajı ve Notification mesajı olmak üzere 2 mesaj tipini desteklemektedir. Notification, sistemin uygulamanızın çalıştırmaya gerek duymadan Bildirim Merkezinde (NC) gösterdiği standart bildirimdir.

Huawei Bildirim Merkezi

Data mesajı ise sistemin notification ile gelen datayı uygulamanıza göndermesidir. Bu durumda uygulamanız (process) ayağa kaldırılır ve az sonra anlatacağım notification receiver service içindeki bir fonksiyon çalıştırılır. Bu fonksiyon içinde gelen datayı parse ederek uygulamanızda bir özellik çalıştırabilir veya aşağıda anlatacağım gibi bir gelen arama ekranı (call screen) gösterebilirsiniz. Bu türde sistem otomatik olarak bir bildirim oluşturmaz. Biz bu bildirim türünü kullanacağız.

HMS Push Kit’i entegre etmek ve örnek bir bildirim yollamak için şu medium yazısından yararlanabilirsiniz:

HMS Send Api Data Yapısı

Bildirimlerinizi kendi server kodunuz üzerinden yollamak için HMS Send Api kullanmalıyız (https://developer.huawei.com/consumer/en/doc/HMSCore-References-V5/https-send-api-0000001050986197-V5). Bu api’ı kullanırken data mesajı yollamak için json yapımız şöyle olmalıdır:

Notification Receiver Service

Bildirim almak içinHmsMessageServicesınıfından türeyen bir alıcı servis sınıfınız olmalı. Daha sonra ise onMessageReceived(remoteMessage : RemoteMessage?) fonksiyonunu override etmelisiniz. Eğer remoteMessage.data kısmı dolu ise bu bir data mesajıdır ve parse edip gerekli aksiyonu almamız gerekir.

Gelen datayı parse ettikten sonra gerekli parametrelerle birlikte istediğimiz ekranı açabiliriz. Data mesajının en sık kullanıldığı durumlardan biri olarak arama ekranını örnek vermek istedim. Senaryomuzda gelen datayı parse edip CallScreenActivity’i açacağız.

İlk aklınıza gelen bu fonksiyon içinde yeni bir Intent ile gerekli activity’i açmak ve ilgli ekranda ses,görüntü ve ilgili butonları göstermek ise doğru fakat eksik düşünüyorsunuz :) Ne yazık ki Android ekosistemi tamamen önceki versiyonlarla uyumlu sistem sürümlerine, tek bir cihaz üreticisine ve genel bir güç optimizasyonu stratejisine sahip değil. Dolayısıyla bunları çözmenin yollarından bahsedeceğim.

1- Güç Optimizasyonu

Android telefonlar gerek AOSP güç yönetimi gerekse telefon üreticilerinin bağımsız olarak oluşturdukları bir dizi kurala göre uygulamaları kısıtlayabiliyorlar. Hatta daha can sıkıcı olanı belli bir süre boyunca kullanılmayan uygulamaları direkt öldürüyorlar(force stop). Böyle olunca uygulamanız çalışması gerektiği gibi çalışmıyor ve kullanıcı uygulamanızı silebiliyor ve uygulama mağazasına kötü yorum, kötü puan bırakabiliyor.

Bu durumu çözmek için 2 seçeneğimiz var: Birincisi ayrı ayrı telefon üreticilerine başvurup kendi uygulamanızı beyaz listeye aldırmak. Bu işlemin oldukça yorucu ve başarıyla sonuçlanma ihtimalinin düşük olduğunu söyleyebilirim. İkinci seçenek ise kullanıcıdan sizin uygulamanız için güç optimizasyonu seçeneklerini devre dışı bırakmasını istemek. Burada da her markanın güç optimizasyonu ayarlar sayfasının farklı isimde olması ve ortalama bir kullanıcı için fazla karmaşık bir işlem olması sorunu yatıyor. İlk problemimizi tüm markaların güncel ayarlar sayfasını takip edip birkaç satır kodla bu sayfayı açan bir kütüphane sayesinde çözebiliyoruz(https://github.com/judemanutd/AutoStarter). İkincisi için ise örnek bir öğretici video veya slider koyularak sorun bir miktar çözülebilir.

2- Service içinden Activity açma

Android 10 ile birlikte kullanıcı deneyimini geliştirmek için ekran açıkken bir uygulamanın pat diye kendi Activity’sini açması engellendi. Bunun yerine bir Heads-up notification göstererek daha doğal bir kullanıcı deneyimi istendi.

Ekran açıkken çalan alarm. Alarm ekranı açılmadı.

Servisimizden Activity açmak için önce Android versiyon kontrolü yapmamız gerekiyor. Eğer 10 ve yukarısı ise bir bildirim göstermemiz ve NotificationCompat.Builder nesnemizin pending intentini ayarlarkensetFullScreenIntent(pendingIntent,true) böyle bir ayar yapmamız gerekiyor. Bu ayar eğer ekran kapalıysa Activity’nin açılmasını, degilse bildirime tıklandığında ilgili Activity’nin açılmasını sağlıyor. Bunun için ayrıca android.permission.USE_FULL_SCREEN_INTENT iznini de Manifest dosyasına yazmanız gerekiyor. Örnek bir bildirim gösterimi:

Android 10 altı cihazlar için ise normal olarak Activity’nizi başlatabilirsiniz. Yalnızca intente Intent.FLAG_ACTIVITY_NEW_TASK flag’ini eklemeniz gerekiyor. Ayrıca ekran kapalıyken ekran kilidini açmak için android.permission.WAKE_LOCK ve android.permission.DISABLE_KEYGUARD izninlerini de Manifest dosyasına eklemelisiniz.

--

--