HMS ile Yol Tarifi Alma ve Harita Üzerinde Gösterme

Mehmet Ozdemir
Huawei Developers - Türkiye
6 min readOct 5, 2020

Herkese Selam,

Bu yazıda, Huawei mobil servislerini kullanarak, cihazın güncel konumu nasıl elde edilir, iki konum arasındaki yol tarifi nasıl alınır ve bu yol tarifi adımları harita üzerinde nasıl gösterilir konularını açıklamaya çalışacağım.

Yukarıda bahsettiğim konularla ilgili geliştirme yaparken Huawei’ in Location Kit, Map Kit ve Directions API servisini kullanacağız. Öncelikle bu servisler hakkında kısaca bilgi vermek ve proje de hangi amaçla kullanacağımızı açıklamak istiyorum.

Location Kit

Location Kit, hassas kullanıcı konumlarını hızlı bir şekilde elde etmenize, küresel konumlandırma yetenekleri oluşturmanıza ve dünya çapında çok çeşitli kullanıcılara ulaşmanıza yardımcı olmak için GPS, Wi-Fi ve baz istasyonu konumlarını birleştirir.

Biz Location Kit’ i projemizde, kullanıcının güncel konumunu elde etmek için kullanacağız.

Map Kit

Map Kit, Android’ de harita geliştirme için bir dizi ara yüzdür. Harita verileri, Çin dışındaki çoğu ülkeyi kapsar ve birden çok dili destekler. Map Kit ile Android uygulamanıza haritayla ilgili işlevleri kolayca ekleyebilirsiniz.

Biz Map Kit’ i projemizde, iki konum arasındaki yol tarifi adımlarını harita üzerinde göstermek için kullanacağız.

Directions API

Directions API, konumlar arasındaki yol tariflerini hesaplayan bir hizmettir. Araba sürme, yürüme veya bisiklete binme dahil çeşitli ulaşım modları için yol tarifleri arayabilirsiniz.

Biz Directions API’ yi projemizde, iki konum arasındaki yol tarifini almak için kullanacağız.

Entegrasyon Adımları

HMS Entegrasyonu

HMS entegrasyonuyla alakalı detaylı bilgi için bu makaleyi inceleyebilirsiniz. Makaledeki adımları uyguladığınızı ve HMS entegrasyonunu tamamladığınızı varsayıyorum.

HMS Kit ve Servislerinin Entegrasyonları

HMS Kit ve Servisleri için aşağıda bulunan kod parçasındaki satırları app seviyesindeki build.gradle dosyasına ekliyoruz.

Gerekli Diğer Kütüphanelerin Entegrasyonları

Gerekli diğer kütüphaneler için aşağıda bulunan kod parçasındaki satırları app seviyesindeki build.gradle dosyasına ekliyoruz.

Gerekli İzinlerin Eklenmesi

Son olarak gerekli olan izinleri AndroidManifest.xml dosyasına ekliyoruz.

Geliştirme Adımları

Yol Tarifi İçin Konumların Elde Edilmesi

Yol tarifi alabilmek için 1 başlangıç ve 1 bitiş noktasına ihtiyacımız var. Bu noktalardan başlangıç noktası kullanıcımızın mevcut konumu olacaktır. Bitiş noktası ise kullanıcının, mekanlar listesinden seçmiş olduğu mekanın konumu olacaktır.

Not: Mekanların elde edilmesi, listelenmesi ve yönetilmesiyle ilgili olan bölüm bahsi geçen bu projenin başka bir bölümünü oluşturmaktadır. Bu yazıyı uzatmamak adına bu noktalara değinmeyeceğim.

Bitiş Noktası

Yukarıda da bahsetmiş olduğum üzere bitiş noktası, kullanıcının mekanlar listesinden seçmiş olduğu mekanın konumu olacaktır. Bu mekan, mekan listesi ekranında seçim yapıldıktan sonra Intent içerisine eklenecek ve açılan Activity içinde de yine Intent içerisinden alınacaktır.

Not: Buradaki Venue nesnesi custom olarak oluşturulmuş bir nesnedir. Detayını proje içerisinde bulabilirsiniz.

Başlangıç Noktası

Başlangıç noktasını dolayısıyla kullanıcının mevcut konumu elde edebilmek için HMS Location Kit’ i kullanacağız. Burada ihtiyacımız olan FusedLocationProviderClient, SettingsClient, LocationRequest ve LocationCallback sınıflarından oluşturulmuş nesnelerin tanımlanması ve kullanılmasıyla ilgili kod parçalarını aşağıda bulabilirsiniz. Ayrıca konum aramayı başlatmak ve belirli şartlara uygun bir konum elde ettikten sonra konum aramayı durdurmak için gerekli kod parçalarını da paylaşıyorum.

  • initLocationElements() Metodu

Yukarıda bahsettiğim belirli şartlara uygun konumdan kastım, aşağıdaki kod parçasında da görüldüğü üzere elde edilen konumun doğruluk değerinin 15 metre altında olmasıdır. Yine kod parçasında görüldüğü üzere, uygun konum elde edildikten sonra konum arama durdurulacaktır.

  • requestLocationUpdatesWithCallback() Metodu

Konum aramayı başlatmakla ilgili kodlar bu metodun içinde yer almaktadır.

  • removeLocationUpdatesWithCallback() Metodu

Konum aramayı durdurmakla ilgili kodlar bu metodun içinde yer almaktadır.

Yol Tarifinin Elde Edilmesi

Yol tarifini elde edebilmek için HMS Directions API’ yi kullanacağız. Adından da anlaşılacağı üzere bu servis Huawei’ in geliştiricilere sağladığı bir API. Bu API ile ağ üzerinden veri alışverişi yapmak için projemizde Retrofit kütüphanesini kullanacağız. Bu ağ işlemlerini yapabilmek için kullanmamız gereken sınıfları ve nesneleri aşağıda açıklamaya çalışacağım.

ApiService

Ağ üzerinden veri alış verişi sağlamak için gerekli bağlantı ayarlarını belirlediğimiz sınıftır.

Not: HMS Directions API için base url “https://mapapi.cloud.huawei.com/mapApi/v1/”’ dir.

IHuaweiMapServices

HMS Directions API’ nin sağladığı api’ lerin özelliklerini tanımladığımız interface’ dir. Burada sadece HMS Directions API’ nin yol tarifi ile ilgili api’ sinin özelliklerini tanımlayacağız.

Not: Yol tarifi ile ilgili end point “routeService/”’ dir. Kod parçasında görünen url içinde yer alan “type” değeri yol tarifi tipidir. Yol tarifi için 3 farklı tip kullanılabilir. Bunlar sürüş, bisiklet ve yürüme rotalarıdır. Projede sadece sürüş rotaları için yol tarifleri alacağız. Url’ e ekleyeceğimiz bir diğer değer ise API_KEY değeridir. Bu değer App Gallery Connect üzerinden ya da agconnect-services.json dosyası içinden bulunabilir.

DirectionRequest

HMS Directions API’ nin yol tarifi ile ilgili api’ sine göndereceğimiz isteğe ekleyeceğimiz json değerinin veri yapısını belirlediğimiz sınıftır.

DirectionResponse

HMS Directions API’ nin yol tarifi ile ilgili api’ sinden bize dönen cevap içindeki json değerinin veri yapısını belirlediğimiz sınıftır. Aşağıda da görüldüğü üzere bu sınıf içinde bazı custom alt sınıflarda yer almaktadır.

  • Route
  • Path
  • Bound
  • Step
  • LatLng

getDirections() Metodu

Bu metot içerisinde yol tarifi almak için gerekli olan kodlar yer almaktadır. API isteği oluşturmak için öncelikle DirectionRequest sınıfından bir nesne üretmemiz gerekmektedir. Bu nesne ile yol tarifi almak istediğimiz iki konumu API’ ye aktarmış olacağız. Bunun dışında API isteği için ihtiyacımız olan API_KEY, Constants isimli sınıfımızda tanımlıdır. Ayrıca sürüş rotası almak istediğimiz için statik olarak “driving” parametresi API isteği için kullanılmıştır.

broadcastRoute() Metodu

HMS Direction API’ den cevap olarak dönen yol tarifi bilgileri, Intent aracılığı ile broadcast edilerek ara yüzdeki iki sekmedeki ekranlara iletilecektir.

Yol Tarifi İle İlgili Bilgilerin Listelenmesi

Yol tarifi ile ilgili tüm detayları kullanıcı ara yüzümüzdeki “INSTRUCTIONS” sekmesinde göstereceğiz. Yol tarifi ile ilgili broadcast yayını geldikten sonra yol tarifi adımlarını RecyclerView üzerinde listeleyeceğiz. Bunun dışında yol tarifinin bitiş noktası, toplam uzunluğu ve tahmini varış süresi gibi bilgiler ekranın altında gösterilecektir. Listeleme ve diğer bilgilerin ekranda gösterilmesiyle ilgili detaylı kodları, kaynak kodlar içerisinde inceleyebilirsiniz.

Yol Tarifinin Harita Üzerinde Gösterilmesi

Yol tarifiyle ilgili detayları harita üzerinde “PREVIEW” sekmesinde göstereceğiz. Bu ekrandaki harita ve üzerinde yapacağımız işlemler için HMS Map Kit’ i kullanacağız. Kullanacağımız metot ve kod parçalarını aşağıda paylaşıyorum.

initMap() Metodu

Harita ile ilgili işlemlerimizi yapabilmek için öncelikle haritayı başlatmamız gerekiyor. Bu metot içinde haritanın başlatılmasıyla ilgili kodlar yer almaktadır. Haritayı başlatabilmemiz için API_KEY değerine ihtiyacımız olacaktır. Bu değer App Gallery Connect üzerinden ya da agconnect-services.json dosyası içinden bulunabilir.

Activity/Fragment Metotları

Haritamızı, Activity/Fragment yaşam döngüsü çerçevesinde, herhangi bir sorun yaşamadan kullanabilmemiz için gerekli olan kod parçalarını aşağıda bulabilirsiniz.

Harita Üzerine Pin Ekleme Metotları

Yol tarifi ile ilgili broadcast yayını geldikten sonra rotanın başlangıç ve bitiş noktalarını harita üzerinde göstermek için haritaya pin’ ler ekleyeceğiz. Yukarıda da belirttiğim üzere başlangıç noktası kullanıcının, bitiş noktası ise kullanıcının mekanlar listesinden seçtiği mekanın konumu olacaktır.

  • addMarker() Metodu

Harita üzerine pin ekleme işlemini bu metot ile sağlayacağız. Burada ekleyeceğimiz pin’ e özel olarak drawable klasöründe bulunan bir xml ikon kullanıyoruz. Bu xml ikonu kullanabilmemiz için gerekli olan dönüşüm metodunun detayını kaynak kodlarda bulabilirsiniz.

  • createVenueMarker() Metodu

Oluşturacağımız pin seçilen mekana uygun olacak şekilde bu metot içinde ayarlanmaktadır.

addRoutePolylines() Metodu

Yol tarifi ile ilgili broadcast yayını geldikten sonra rotayı harita üzerine çizmemiz için gereken kodlar bu metot içinde yer almaktadır. Burada rota çizgisini ihtiyacımıza uygun olarak özelleştirebiliriz. Biz bu kodda sadece, rota çizgisinin rengini ve kalınlığını ayarlıyoruz.

animateCamera() Metodu

Haritanın kamerasını tüm rotayı görecek şekilde ayarlamamızı sağlayan metottur.

Yol Tarifi Adımlarını Görüntüleme Metotları

Yol tarifi belli rota adımlarından oluşmaktadır. Kullanıcının bu adımlar arasında gezinmesini sağlayabilmek için sayfa altına yerleştireceğimiz ViewPager’ ı kullanacağız. Bu yapıyla, harita üzerinde yapacağımız işlemleri gerçekleştirebilmemiz için gerekli metotları aşağıda paylaşacağım. Sayfa altında bulunan ViewPager yapısı ve algoritmasıyla ilgili detaylı kodları kaynak kod içerisinde bulabilirsiniz.

  • focusStep() Metodu

Bu metot ile görüntülenmesini istediğimiz rota adımına göre kamera pozisyonunu ayarlayacağız. Burada kameranın pozisyonu ile ilgili özelleştirmeler yapacağız. Bunlardan bir tanesi tilt değeridir. Bu değer kameranın eğimini ayarlamamıza yarar. Bir başka değer bearing değeridir. Bu değer ile kameranın dönmesi gereken yönü belirliyoruz. Bu yön rota adımına göre her adımda değişecek 0 ile 360 arasında bir değerdir. Bir diğer değer ise kameranın zoom değeridir. Bu değeri, kameranın, gösterdiği noktaya olan uzaklığını ayarlamaya yarayan değer gibi düşünebiliriz.

  • getDegrees() Metodu

İlgili rota adımına göre bearing değerini hesaplamamızı sağlayan kodlar bu metotta yer almaktadır.

  • animateCamera() Metodu

Bu yazımda, Huawei’ in Location Kit, Map Kit ve Directions API servisini örnek bir proje üzerinde açıklamaya çalıştım. Umarım herkes için faydalı olmuştur. Lütfen sorularınız olursa sormaktan çekinmeyin. Bir sonraki yazımda görüşmek üzere :’)

--

--