Mobil Programlama

Android

Android'de Haritalar Servisi

Lisans: Creative Commons 11.12.2020 tarihinde güncellendi
Bakabileceğiniz Etiketler: Eğitmen: Geleceği Yazanlar Ekibi

Günümüzde konum servisleri birçok mobil uygulamanın önemli ve ayırt edici özelliklerinden biridir. Google, konum servisleri ile birlikte Android için uygulama geliştirenlere, kullanıcıya bulunduğu yeri göstermek ya da aradığı bir mekânı harita üzerinde göstermek gibi işlemler için Google Play Services adında bir servisin içinde Google Maps Android API'yi sunar.

Bu bölümde Google haritalarını uygulamamızın bir parçası haline getirmeyi ve harita üzerinde basit işlemleri nasıl gerçekleştirebileceğimizi göreceğiz. Bunun için şu adımları yerine getirmeliyiz:

 

Google Play Services ve Google Maps Android API

Google, yazılım geliştiricilerin Google Haritalar servisini Android ortamında kullanabilmesi için Google Maps Android API'yi aracı kılıyor. Google Maps Android API v2, Google Play Services'ın bir parçası durumunda. Dolayısıyla Google Haritalar ve benzeri Google servislerini kullanan uygulamalar geliştirebilmek için ilk önce Google Play Services'ı edinmemiz gerekir.

 

1. Google Play Services'ı indirmek

Google Play Services'ı edinmek için öncelikle Android SDK Manager'ı açıp Extras altındaki Google Play Services paketini kurunuz.

 

2. Kütüphane projesini çalışma alanına almak

Google Play Services'ın kütüphane projesini projemize bağlamak için önce bu kütüphane projesini çalışma alanımıza (workspace) dâhil etmeliyiz. Bunun için Android Studio'da, Import Project (Eclipse, ADT, Gradle, etc.) seçeneğini seçiyoruz. 

Bu adımdan sonra açılan pencerede /extras/google/google_play_services/samples/maps yolunu seçiyoruz. Bu dizin altında Google Play Services'in bize sunduğu örnek proje yer alır.

Burada OK ile proje dâhil etme işlemine başlıyoruz.

 

Varsayılan tüm içe aktarma özelliklerini kabul edip devam ettiğimizde proje Android Studio'ya aktarılmış olacak.

 

3. Google'dan API anahtarı almak

Şimdi sıra geldi uygulamamızda Google Haritalar bileşenlerini kullanabilmek için bazı yapılandırmaları yapmaya. Uygulamamızı Google Haritalar servisiyle "konuşturabilmek" için Google üzerinden uygulamamıza has bir API anahtarı (API Key) almamız gerekiyor.

Google, söz konusu API anahtarını uygulamamıza özel oluşturacaktır. Bu sebeple Google'a uygulamamızın ayırt edici bir özelliğini vermeliyiz ki kimlik doğrulamasını yapabilelim. Uygulamamızı imzalarken kullandığımız sertifika ve uygulamanın paket adını bunun için kullanabiliriz.

Debug Key - Release Key

Bir Android uygulaması geliştirirken, uygulamayı build ettiğinizde yani inşa ettiğinizde, projenizin /bin dizini içinde bir apk dosyası oluşur. Bildiğiniz üzere bu dosya, projenizin sanal ya da gerçek cihaza yüklenip çalıştırılabilir halidir. Ancak bu paket dosyası debug mode etkinken yani geliştirme ve hata ayıklama işlemi sürerken oluşturulmuş ve ona göre imzalanmıştır. İmzalama için bir debug key kullanılır.

Uygulamanızı Google Play Store üzerinden yaymak (release) istediğinizde bir release key oluşturursunuz. Bu anahtar dosyasını uygulamanızı güncellediğinizde de kullanırsınız. (Dolayısıyla kaybetmemeniz uygulamanız için hayati önem taşır)

Bu belgede imza sertifikası olarak debug amacıyla oluşturduğumuz debug.keystore dosyasını kullanacağız. Bunun için keytoolisimli araçtan faydalanacağız.

 

Windows ile debug key oluşturmak

Windows kullanıyorsanız keytool aracını "C:\Program Files\Java\jdk1.7.0_25\bin" dizininde bulabilirsiniz. (Kullandığınız JDK sürümüne göre bu yol değişecektir)

Bunun için önce

cd "C:\Program Files\Java\jdk1.7.0_25\bin"

komutuyla keytool aracının olduğu dizine girelim. Ardından debug.keystore imza sertifikasıyla imzalama işini gerçekleştirelim:

keytool.exe -v -list -alias androiddebugkey -keystore C:\Users\Artistanbul\.android\debug.keystore -storepass android -keypass android

Burada bize dönen SHA-1 türündeki parmak izini saklamamız gerekiyor.

 

Linux ya da Mac OS X ile debug key oluşturmak

Linux ve Mac OS X kullanıcıları Terminal uygulamasını açıp şu komutları vermeli:

 

cd ~

 

keytool -list -alias androiddebugkey -keystore .android/debug.keystore -storepass android -keypass android -v

Buradaki SHA-1 anahtarının değerini saklamalısınız.

İmzalama sertifikamızı ve uygun anahtarları oluşturduğumuza göre bunları Google'a tanıtmayla devam edebiliriz.

 

Google Developers Console'u kullanmak

Eski adıyla Google APIs Console, yeni adıyla Google Developers Console bize bu olanağı veriyor. Öncelikle buradan Google Developers Console'a giriş yapıyoruz. İlk defa giriş yapıyorsanız, kullanım şartları sözleşmesini onaylamanız gerekiyor. Bunun ardından sizi API Project isimli, varsayılan olarak gelen projenin sayfasına yönlendirecektir:

 

Buradan Create Project düğmesine tıklayalım ve projemizin adı ve eşsiz olması gereken ID verisini dolduralım:

Buradaki Project ID değeri, projenizi diğer tüm Google API'si kullanan projelerden ayırır. İsterseniz yenile düğmesine basarak rastgele bir şeyler çıkmasını sağlayabilirsiniz. Daha iyi olabilir.

Project ID değerimizin yanındaki hareketli top, ID değerinin eşsizliğinin denetlenme sırasındaki ilerlemesini gösteriyor. Bir sorun çıkmadığına göre Create'e basıp, projemizin sorunsuz bir şekilde oluşturulmasını sağlayabiliriz. Karşımıza boş bir proje ekranı çıkacaktır:

Uygulamamız Google Map yeteneklerini içinde kullanabilmek için onun API'sini kullanmalı ve buna ek olarak bu API'yi kullanırken kendini doğrulayabiliyor olmalı. Bunun için soldaki menüden API & Auth öğesine tıklayalım. Karşımıza kullanmaya uygun Google servislerinin API listesi çıkacaktır:

 

Gördüğünüz üzere bazı servislerin API'leri varsayılan olarak açık geliyor. Listeyi biraz aşağı kaydıralım ve Google Maps Android API v2'yi OFF durumundan ON durumuna getirelim. Google API ve Google Maps/Earth API'leri kullanım sözleşmesini onaylayıp Accept ile devam edelim. Artık etkin API'ler listemiz şöyle olacak:

Şimdi sıra geldi uygulamamızı bu servisi kullanır hale getirmek için Google'a bazı kimlik bilgilerini vermeye. Bunun için sol menüde gördüğünüz "Credentials" öğesine tıklayınız. Açılan sayfa kayıtlı uygulamalarınızın listelendiği sayfa olacaktır.

Create new Client ID ve Create new Key düğmesine tıklayınız ve açılan sayfadan Android uygulamanızla ilgili gerekli bilgileri doldurunuz

 

Şu an bir Android uygulaması oluşturduğumuz için Android key seçeneğine tıklıyoruz.

Burada Android Identification (Android Kimliklendirmesi) kısmı önemli. Paket adı uygulamanızın paket adıyla birebir aynı olmalı. SHA1 parmak izi değeri de yukarıda keytool aracılığıyla oluşturduğunuz "SHA1 fingerprint" olmalı. Bu eşsiz bir sayı dizisidir. Bu değeri doğrudan konsol ekranından kopyalayıp buraya yapıştırabilirsiniz. 

Uygulamanız için yeni bir anahtar oluştururken SHA1 parmak iziyle paket adı arasına ";" (noktalı virgül) bulundurmalısınız.

Buradaki API KEY bizim için önemli. Bunu saklayalım. Bunu Android Studio içindeki projemiz içinde kullanacağız.

ÖNEMLİ NOT: Yukarıda uygulamamızı Google Play Store üzerinden yayınlamak için bir "release key" oluşturmamız gerektiğinden bahsettik. Google Haritalar servisini kullanan bir uygulamayı Google Play Store'a koymak istiyorsanız, yukarıdaki ekranda ilgili yere "+" düğmesiyle release key'in verdiği SHA-1 parmak izini de eklemelisiniz. Böylelikle kullanıcılar sizin release key ile imzalanmış ve cihazlarında çalıştırdıkları uygulamalarında bir sorun olmadan Google Haritalar bileşenini kullanabilecektir.

 

4. API anahtarını projeye dâhil etmek

Şimdi Google'dan aldığımız API anahtarını uygulamamıza dâhil edelim.

Öncelikle uygulamamızın AndroidManifest.xml dosyasında bazı düzenlemeler yapmalıyız. İlk adım olarak Google Cloud Console'dan aldığımız API anahtarını bölgesine girelim.

<!-- Google Maps için API anahtarı -->
<meta-data
    android:name="com.google.android.maps.v2.API_KEY"
    android:value="AIzaSyC9OJ_x6SJ5ckTEts2TAG5EL7_4o0EibHE" />

Ek olarak projemizin çalışabilmesi için bazı izinleri tanımlamalıyız. Bunlarla beraber projemizin Androidmanifest.xml dosyasının son hali şöyle olacaktır:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.turkcell.mapexample"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="9"
        android:targetSdkVersion="19" />

    <!-- Harita verisini indirebilmek için izinler -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />

    <!-- Cihazdan Google Servislerine erişmek için izin -->
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />

    <!-- İndirilenlerin tutulması için izinler -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <!-- OpenGL ES 2.0 Google Maps Android API v2 için gerekiyor -->
    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />

    <application
        android:allowBackup="true"
        android:hardwareAccelerated="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

        <!-- Google Maps için API anahtarı -->
        <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="AIzaSyC9OJ_x6SJ5ckTEts2TAG5EL7_4o0EibHE" />
        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />

        <activity
            android:name="com.turkcell.mapexample.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

"com.google.android.gms.version" meta verisini elementinin bir parçası olarak eklememizin nedeni şudur: uygulamamız, kütüphane projesiyle gelen Google Play Service ile derleneceği için bu kütüphanenin sürümünü meta veri olarak bulundurmamız gerekiyor. Bu durum, uygulamanın çalışacağı cihazdaki Google Play Services ile ilgilidir.

NOT: Google Haritalar, çalışmak için Google Play Services'a ihtiyaç duyar. Dolayısıyla onu kullanan uygulamalar da çalıştırılacağı cihazda Google Play Services'ın kurulu olması şartıyla çalışır.

AndroidManifest.xml dosyasında gerekli eklemeleri yaptığımıza göre şimdi haritamızı kullanıcı arayüzünde göstermek için gerekli eklemeleri yapabiliriz.

res/layout/activity_main.xml dosyasını şöyle düzenleyebiliriz:


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <fragment
        android:id="@+id/haritafragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="com.google.android.gms.maps.SupportMapFragment" />

</RelativeLayout>

Bu yerleşim dosyasıyla, haritamızı bir SupportMapFragment'ta göstermiş olacağız. SupportMapFragment, MapFragment'ın Google Support Library için yeniden yazılmış halidir. Böylelikle API 11'den önceki Android sürümleri için Fragment olarak harita kullanabilir hale gelmiştir.

Şimdi projemizdeki MainActivity.java dosyasına gelelim ve haritayı MapFragment olarak göstermek için şu kodu yazalım:

//Dosya Adı: MainActivity.java

package com.turkcell.mapexample;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

public class MainActivity extends FragmentActivity {

private GoogleMap googleHarita;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mainlayout);

    if (googleHarita == null) {
        googleHarita = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.haritafragment))
                .getMap();
        if (googleHarita != null) {
            //İstanbul, Kız Kulesi olsun.
            LatLng istanbulKoordinat = new LatLng(41.021161,29.004065);
            googleHarita.addMarker(new MarkerOptions().position(istanbulKoordinat).title("Kız Kulesi"));
            googleHarita.moveCamera(CameraUpdateFactory.newLatLngZoom(istanbulKoordinat, 13));         
        }
    }

}
}

Burada önce GoogleMap türünde bir değişken tanımlayıp bunu Activity oluştuğunda null olup olmadığı hususunda kontrol ediyoruz. Bu yolla uygulamadan çıkıp tekrar dönerseniz haritanın tekrar yüklenmesinin önüne geçmiş olursunuz.

findFragmentById() ile Fragment'ı bulup SupportMapFragment olarak cast ediyoruz. Harita nesnemizi oluştuktan sonra da üzerine bir marker (imleyici) yerleştiriyoruz. Ek olarak haritanın yaklaşmasını bir animasyon haline getiriyoruz.

Projeyi derleyip çalıştırdığımızda şöyle bir uygulama görebilirsiniz:

Harita kullanan uygulamalardaki bir diğer önemli nokta, gösterilecek olan haritanın tipidir. Bu işlem için GoogleMap sınıfından türettiğimiz googleHarita nesnemizin setMapType metodunu kullanacağız. Bu işlem için GoogleMap sınıfının sunduğu sabitler şunlar:

  • MAP_TYPE_NORMAL (Yukarıda gördüğümüz harita)
  • MAP_TYPE_HYBRID (Büyük yer isimleri ve uydu görünümü beraber harita)
  • MAP_TYPE_SATELLITE (Uydu görünümü)
  • MAP_TYPE_TERRAIN (Daha çok coğrafi amaçlarla kullanılacak bir harita)

Örneğin uydu görünümlü bir harita için kodumuza şunu ekleyebiliriz:

googleHarita.setMapType(GoogleMap.MAP_TYPE_SATELLITE);

Bazen haritada kullanıcının konumunu da göstermeniz gerekebilir. Bunun için GoogleMap sınıfından örneklediğimiz googleHarita nesnesine ait setMyLocationEnabled() metodunu kullanabiliriz:

googleHarita.setMyLocationEnabled(true);

Bu sayede kullanıcının konumu küçük mavi bir nokta olarak gösterilecektir:

Kullanıcının konumuna erişmek için gerekli izinleri AndroidManifest.xml dosyasında tanımlamalıyız:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

ACCESS_FINE_LOCATION şeklinde izin almamızın sebebi kullanıcının tam konumuna erişmeye çalışmamızdır.

Kullanıcının konumunu gösterirken haritanın sağ üstündeki düğmeyi setMyLocationButtonEnabled metoduyla aktif ya da pasif yapabilirsiniz. Varsayılan olarak setMyLocationEnabled() metoduyla true parametre gönderildiğinde bu düğme de gösterilecektir. Kapatmak isterseniz

googleHarita.getUiSettings().setMyLocationButtonEnabled(false);

şeklinde parametre geçmeniz yeterli olacaktır. Bu eğitim içeriğinde anlatılan örneği soldaki bölmeden indirebilirsiniz.

Google Haritalar ve onu kullanan uygulamaların çalışabilmesi için cihazda Google Play Services kurulu olmalıdır. Dolayısıyla bu uygulamayı standart Android emülatörlerinde çalıştıramazsınız. Debug ve deneme için gerçek bir Android cihazına ihtiyacınız olacak.