Gelişmiş Android 09.1: Google Haritalar

1. Hoş geldiniz

Bu codelab, Google Developers Training ekibi tarafından geliştirilen Advanced Android Development eğitim kursunun bir parçasıdır. Bu kurstan en iyi şekilde yararlanmak için codelab'leri sırayla tamamlamanız önerilir.

Kursla ilgili tüm ayrıntılar için İleri Düzey Android Geliştirme'ye genel bakış başlıklı makaleyi inceleyin.

Giriş

Google Haritalar ile uygulama geliştirerek uygulamanıza uydu görüntüleri, güçlü kullanıcı arayüzü kontrolleri, konum takibi ve konum işaretçileri gibi özellikler ekleyebilirsiniz. Kendi veri kümenizdeki bilgileri (ör. iyi bilinen balık tutma veya tırmanma alanlarının konumları) göstererek standart Google Haritalar'a değer katabilirsiniz. Ayrıca, Pokémon Go gibi gerçek dünyayla bağlantılı oyunlar da oluşturabilirsiniz.

Bu uygulamalı derste Wander adlı bir Google Haritalar uygulaması oluşturacaksınız.

Bilmeniz gerekenler

Aşağıdaki konular hakkında bilgi sahibi olmanız gerekir:

  • Google Haritalar'ın temel işlevleri
  • Çalışma zamanında istenen izinler.
  • Android Studio'da uygulama oluşturma, geliştirme ve çalıştırma
  • build.gradle dosyanıza harici kitaplıklar ekleme

Neler öğreneceksiniz?

  • Uygulamanıza Google Haritası entegre edin.
  • Farklı harita türlerini görüntüleyin.
  • Google Haritası'nı stilize edin.
  • Haritanıza işaretçi ekleyin.
  • Kullanıcının önemli bir yere (ÖY) işaretçi yerleştirmesine olanak tanır.
  • Konum izlemeyi etkinleştirin.
  • Google Street View'u etkinleştirin.

Yapacaklarınız

  • Google API Konsolu'ndan bir API anahtarı alın ve anahtarı uygulamanıza kaydedin.
  • Yerleştirilmiş bir Google Haritası içeren Wander uygulamasını oluşturun.
  • Uygulamanıza işaretçiler, stil ve konum izleme gibi özel özellikler ekleyin.
  • Uygulamanızda konum izlemeyi ve Street View'u etkinleştirin.

2. Uygulamaya genel bakış

Bu uygulamalı çalışmada, stilize edilmiş bir Google Haritası olan Wander uygulamasını oluşturacaksınız. Wander uygulamasıyla konumlara işaretçi bırakabilir, konumunuzu anlık olarak görebilir ve Street View panoramalarına bakabilirsiniz.

Stil özellikli bir Google Haritası

Android uygulamasında Google Street View

3. 1. görev: Projeyi ayarlama ve API anahtarı alma

Google Maps API (ör. Places API) için API anahtarı gerekir. API anahtarını almak için projenizi Google API Konsolu'na kaydedersiniz. API anahtarı, uygulamayı yazarına bağlayan bir dijital sertifikaya bağlıdır. Dijital sertifikaları kullanma ve uygulamanızı imzalama hakkında daha fazla bilgi için Sign Your App (Uygulamanızı İmzalama) başlıklı makaleyi inceleyin.

Bu uygulamada, hata ayıklama sertifikasının API anahtarını kullanırsınız. Hata ayıklama sertifikası, Hata ayıklama derlemenizi imzalama bölümünde açıklandığı gibi tasarım gereği güvenli değildir. Google Haritalar API'sini kullanan yayınlanmış Android uygulamaları için ikinci bir API anahtarı gerekir: sürüm sertifikasının anahtarı. Yayın sertifikası alma hakkında daha fazla bilgi için API anahtarı alma başlıklı makaleyi inceleyin.

Android Studio'da, faydalı şablon kodu oluşturan bir Google Haritalar Etkinliği şablonu bulunur. Şablon kodu, API anahtarı almayı kolaylaştıran bir bağlantı içeren google_maps_api.xml dosyası içerir.

1.1 Haritalar şablonuyla Wander projesini oluşturma

  1. Yeni bir Android Studio projesi oluşturun.
  2. Yeni uygulamaya "Wander" adını verin. Etkinlik Ekle sayfasına ulaşana kadar varsayılan ayarları kabul edin.
  3. Google Haritalar Etkinliği şablonunu seçin.
  4. Varsayılan Etkinlik Adı ve Düzen Adı'nı değiştirmeyin.
  5. Başlık'ı "Wander" olarak değiştirin ve Bitir'i tıklayın.

Android Studio, haritalarla ilgili çeşitli ek dosyalar oluşturur:

google_maps_api**.xml**

API anahtarınızı tutmak için bu yapılandırma dosyasını kullanırsınız. Şablon, biri hata ayıklama ve diğeri yayın için olmak üzere iki google_maps_api.xml dosyası oluşturur. Hata ayıklama sertifikasının API anahtarı dosyası src/debug/res/values konumunda bulunur. Yayın sertifikasının API anahtarı dosyası src/release/res/values konumunda bulunur. Bu uygulamada yalnızca hata ayıklama sertifikası kullanılır.

activity_maps.xml

Bu düzen dosyası, ekranın tamamını dolduran tek bir parça içerir. SupportMapFragment sınıfı, Fragment sınıfının bir alt sınıfıdır. Ek bir özellik ile birlikte herhangi bir ViewGroup içinde <fragment> etiketi kullanarak bir düzen dosyasına SupportMapFragment ekleyebilirsiniz:

android:name="com.google.android.gms.maps.SupportMapFragment"

MapsActivity.java

MapsActivity.java dosyası, SupportMapFragment sınıfını başlatır ve Google Harita'yı hazırlamak için sınıfın getMapAsync() yöntemini kullanır. SupportMapFragment öğesini içeren etkinlik, OnMapReadyCallback arayüzünü ve bu arayüzün onMapReady() yöntemini uygulamalıdır. getMapAsync() yöntemi, haritanın yüklendiğini belirten bir GoogleMap nesnesi döndürür.

1.2 API anahtarını alma

  1. google_maps_api.xml dosyasının hata ayıklama sürümünü açın.

Dosyada uzun bir URL içeren yorum var. URL'nin parametreleri, uygulamanızla ilgili belirli bilgileri içerir.

  1. URL'yi kopyalayıp bir tarayıcıya yapıştırın.
  2. Google API Konsolu'nda proje oluşturmak için istemleri uygulayın. Sağlanan URL'deki parametreler nedeniyle API Konsolu, Google Haritalar Android API'yi otomatik olarak etkinleştireceğini bilir.
  3. Bir API anahtarı oluşturun ve anahtarın kullanımını Android uygulamalarıyla kısıtlamak için Anahtarı Kısıtla'yı tıklayın. Oluşturulan API anahtarı AIza ile başlamalıdır.
  4. google_maps_api.xml dosyasında, anahtarı YOUR_KEY_HERE yazan google_maps_key dizesine yapıştırın.
  5. Uygulamanızı çalıştırın. Etkinliğinizde, Avustralya'nın Sidney şehrinde işaretçi ayarlanmış bir yerleştirilmiş harita var. (Sydney işaretçisi şablonun bir parçasıdır ve daha sonra değiştirebilirsiniz.)

4. 2. görev: Harita türleri ve işaretçiler ekleme

Google Haritalar'da normal, karma, uydu, arazi ve "yok" olmak üzere çeşitli harita türleri bulunur. Bu görevde, kullanıcının harita türünü değiştirmesine olanak tanıyan bir seçenekler menüsü içeren bir uygulama çubuğu ekleyeceksiniz. Haritanın başlangıç konumunu kendi evinizin konumuna taşırsınız. Ardından, haritada tek konumları gösteren ve etiket içerebilen işaretçiler için destek eklersiniz.

2.1 Harita türü ekleme

Kullanıcınızın istediği harita türü, ihtiyaç duyduğu bilgi türüne bağlıdır. Aracınızda navigasyon için haritaları kullanırken sokak adlarını net bir şekilde görmek faydalıdır. Yürüyüş yaparken muhtemelen dağın tepesine ulaşmak için ne kadar tırmanmanız gerektiğiyle daha çok ilgilenirsiniz. Bu adımda, kullanıcının harita türünü değiştirmesine olanak tanıyan bir seçenekler menüsü içeren bir uygulama çubuğu ekleyeceksiniz.

  1. Yeni bir menü XML dosyası oluşturmak için res dizininizi sağ tıklayın ve Yeni > Android Kaynak Dosyası'nı seçin.
  2. İletişim kutusunda dosyaya ad verin map_options. Kaynak türü olarak Menü'yü seçin. Tamam'ı tıklayın.
  3. Harita seçeneklerini oluşturmak için yeni dosyadaki kodu aşağıdaki kodla değiştirin. "Hiçbiri" sonuçta harita olmamasıyla sonuçlandığı için "hiçbiri" harita türü atlanır.
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto">
   <item android:id="@+id/normal_map"
       android:title="@string/normal_map"
       app:showAsAction="never"/>
   <item android:id="@+id/hybrid_map"
       android:title="@string/hybrid_map"
       app:showAsAction="never"/>
   <item android:id="@+id/satellite_map"
       android:title="@string/satellite_map"
       app:showAsAction="never"/>
   <item android:id="@+id/terrain_map"
       android:title="@string/terrain_map"
       app:showAsAction="never"/>
</menu>
  1. title özellikleri için dize kaynakları oluşturun.
  2. MapsActivity dosyasında, FragmentActivity sınıfını genişletmek yerine AppCompatActivity sınıfını genişletecek şekilde sınıfı değiştirin. AppCompatActivity tuşunu kullandığınızda uygulama çubuğu ve dolayısıyla menü gösterilir.
  3. MapsActivity içinde onCreateOptionsMenu() yöntemini geçersiz kılın ve map_options dosyasını ayrıştırın:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
   MenuInflater inflater = getMenuInflater();
   inflater.inflate(R.menu.map_options, menu);
   return true;
}
  1. Harita türünü değiştirmek için GoogleMap nesnesinde setMapType() yöntemini kullanın ve harita türü sabitlerinden birini iletin.

onOptionsItemSelected() yöntemini geçersiz kılın. Kullanıcı bir menü seçeneğini belirlediğinde harita türünü değiştirmek için aşağıdaki kodu yapıştırın:

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
       // Change the map type based on the user's selection.
       switch (item.getItemId()) {
           case R.id.normal_map:
               mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
               return true;
           case R.id.hybrid_map:
               mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
               return true;
           case R.id.satellite_map:
               mMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
               return true;
           case R.id.terrain_map:
               mMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
               return true;
           default:
               return super.onOptionsItemSelected(item);
       }
    }
  1. Uygulamayı çalıştırın. Harita türünü değiştirmek için uygulama çubuğundaki menüyü kullanın. Haritanın görünümünün nasıl değiştiğine dikkat edin.

2.2 Varsayılan harita konumunu taşıma

Varsayılan olarak onMapReady() geri çağırma işlevi, Google Haritalar'ın oluşturulduğu yer olan Sidney, Avustralya'ya bir işaretçi yerleştiren kodu içerir. Varsayılan geri çağırma, haritayı Sidney'e kaydıracak şekilde animasyon da yapar. Bu adımda, haritayı işaretçi yerleştirmeden evinizin konumuna kaydırır, ardından belirttiğiniz düzeye yakınlaştırırsınız.

  1. onMapReady() yönteminde, işaretçiyi Sidney'e yerleştiren ve kamerayı hareket ettiren kodu kaldırın.
  2. Tarayıcınızda www.google.com/maps adresine gidip evinizi bulun.
  3. Konumu sağ tıklayın ve Burada ne var? seçeneğini belirleyin.

Ekranın alt kısmına yakın bir yerde, enlem ve boylam bilgileri de dahil olmak üzere konum bilgilerinin yer aldığı küçük bir pencere açılır.

  1. home adlı yeni bir LatLng nesnesi oluşturun. LatLng nesnesinde, tarayıcıda Google Haritalar'dan bulduğunuz koordinatları kullanın.
  2. float adlı bir zoom değişkeni oluşturun ve değişkeni istediğiniz ilk yakınlaştırma seviyesine ayarlayın. Aşağıdaki listede, her yakınlaştırma düzeyinde gösterilen ayrıntı düzeyi hakkında bilgi verilmektedir:
  • 1: Dünya
  • 5: Karalar/kıta
  • 10: Şehir
  • 15: Sokaklar
  • 20: Binalar
  1. CameraUpdate nesnesi oluşturmak için CameraUpdateFactory.newLatLngZoom() kullanın, LatLng nesnenizi ve zoom değişkeninizi iletin. GoogleMap nesnesinde moveCamera() işlevini çağırarak ve yeni CameraUpdate nesnesini ileterek kamerayı kaydırın ve yakınlaştırın:
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(home, zoom));
  1. Uygulamayı çalıştırın. Harita, evinizin bulunduğu yere kaydırılmalı ve istenen düzeye yakınlaştırılmalıdır.

2.3 Harita işaretçileri ekleme

Google Haritalar, Marker sınıfını kullanarak oluşturduğunuz bir işaretçiyle konumu belirleyebilir. Varsayılan işaretçi, standart Google Haritalar simgesini kullanır: Google Haritalar işaretçisi

İçeriğe dayalı bilgileri bilgi pencerelerinde göstermek için işaretçileri genişletebilirsiniz.

Bu adımda, kullanıcı haritada bir konuma dokunup basılı tuttuğunda işaretçi ekliyorsunuz. Ardından, işaretçiye dokunulduğunda işaretçinin koordinatlarını gösteren bir InfoWindow eklersiniz.

Bırakılan bir raptiye için bilgi penceresi

  1. MapsActivity içinde setMapLongClick() adlı bir yöntem saplaması oluşturun. Bu yöntem, bağımsız değişken olarak final GoogleMap alır ve void döndürür:
private void setMapLongClick(final GoogleMap map) {}
  1. Kullanıcının dokunup basılı tuttuğu yere işaretçi yerleştirmek için GoogleMap nesnesinin setOnMapLongClickListener() yöntemini kullanın. onMapLongClick() yöntemini geçersiz kılan yeni bir OnMapLongClickListener örneği iletin. Gelen bağımsız değişken, kullanıcının bastığı konumun koordinatlarını içeren bir LatLng nesnesidir:
private void setMapLongClick(final GoogleMap map) {
   map.setOnMapLongClickListener(new GoogleMap.OnMapLongClickListener() {
       @Override
       public void onMapLongClick(LatLng latLng) {
       }
   });
}
  1. onMapLongClick() içinde addMarker() yöntemini çağırın. Konumu, iletilen LatLng olarak ayarlanmış yeni bir MarkerOptions nesnesi iletin:
map.addMarker(new MarkerOptions().position(latLng));
  1. onMapReady() yönteminin sonunda setMapLongClick() çağrısı. mMap uygulamasında kart geçişi.
  2. Uygulamayı çalıştırın. Haritada bir yere dokunup basılı tutarak işaretçi yerleştirin.
  3. İşaretçiye dokunarak ekranın ortasına getirin.

Ekranın sol alt kısmında gezinme düğmeleri gösterilir. Bu düğmeler sayesinde kullanıcı, işaretli konuma gitmek için Google Haritalar uygulamasını kullanabilir.

İşaretçi için bilgi penceresi eklemek üzere:

  1. MarkerOptions nesnesinde title alanını ve snippet alanını ayarlayın.
  2. onMapLongClick() bölümünde, title alanını "Sabitlenmiş nokta" olarak ayarlayın. snippet alanını addMarker() yöntemindeki konum koordinatlarına ayarlayın.
map.setOnMapLongClickListener(new GoogleMap.OnMapLongClickListener() {
   @Override
   public void onMapLongClick(LatLng latLng) {
       String snippet = String.format(Locale.getDefault(),
               "Lat: %1$.5f, Long: %2$.5f",
               latLng.latitude,
               latLng.longitude);

       map.addMarker(new MarkerOptions()
               .position(latLng)
               .title(getString(R.string.dropped_pin))
               .snippet(snippet));
   }
});
  1. Uygulamayı çalıştırın. Konum işaretçisi bırakmak için haritaya dokunup basılı tutun. Bilgi penceresini göstermek için işaretçiye dokunun.

2.4 ÖY dinleyicisi ekleme

Varsayılan olarak, ilgi alanları (İA'lar) haritada ilgili simgeleriyle birlikte görünür. Önemli yerler arasında parklar, okullar, devlet binaları ve daha fazlası yer alır. Harita türü normal olarak ayarlandığında işletme ÖY'leri de haritada görünür. İşletme ÖY'leri, mağaza, restoran ve otel gibi işletmeleri temsil eder.

Bu adımda, haritaya GoogleMap.OnPoiClickListener ekleyeceksiniz. Bu tıklama dinleyicisi, dokunup basılı tutma işleminin tamamlanmasını beklemek yerine haritaya hemen bir işaretçi yerleştirir. Tıklama dinleyicisi, ÖY adını içeren bilgi penceresini de gösterir.

Önemli yer işaretçisi

  1. MapsActivity içinde setPoiClick() adlı bir yöntem saplaması oluşturun. Bu yöntem, bağımsız değişken olarak final GoogleMap alır ve void döndürür:
private void setPoiClick(final GoogleMap map) {}
  1. setPoiClick() yönteminde, iletilen GoogleMap üzerinde bir OnPoiClickListener ayarlayın:
map.setOnPoiClickListener(new GoogleMap.OnPoiClickListener() {
   @Override
   public void onPoiClick(PointOfInterest poi) {
   }
});
  1. onPoiClick() yönteminde, ÖY konumuna bir işaretçi yerleştirin. Başlığı, ÖY'nin adı olarak ayarlayın. Sonucu poiMarker adlı bir değişkene kaydedin.
public void onPoiClick(PointOfInterest poi) {
   Marker poiMarker = mMap.addMarker(new MarkerOptions()
       .position(poi.latLng)
       .title(poi.name);
}
  1. Bilgi penceresini hemen göstermek için poiMarker üzerinde showInfoWindow() işlevini çağırın.
poiMarker.showInfoWindow();
  1. onMapReady() sonunda setPoiClick()'ı arayın. mMap uygulamasında kart geçişi.
  2. Uygulamanızı çalıştırın ve park gibi bir ÖY bulun. Üzerine işaretçi yerleştirmek ve ÖY'nin adını bilgi penceresinde göstermek için ÖY'ye dokunun.

5. 3. görev: Haritanızın stilini ayarlama

Google Haritalar'ı birçok şekilde özelleştirerek haritanıza benzersiz bir görünüm ve tarz katabilirsiniz.

Diğer tüm parçaları özelleştirdiğiniz gibi, kullanılabilir XML özelliklerini kullanarak MapFragment nesnesini özelleştirebilirsiniz. Ancak bu adımda, GoogleMap nesnesindeki yöntemleri kullanarak MapFragment içeriğinin görünümünü ve tarzını özelleştirirsiniz. Haritanıza stil eklemek ve işaretçilerinizi özelleştirmek için online Stil Sihirbazı'nı kullanırsınız. Ayrıca, ev konumunuza haritayla birlikte ölçeklenen ve dönen bir GroundOverlay ekleyebilirsiniz.

3.1 Haritanıza stil ekleme

Haritanız için özelleştirilmiş bir stil oluşturmak üzere, haritadaki özelliklerin nasıl görüntüleneceğini belirten bir JSON dosyası oluşturursunuz.Bu JSON dosyasını manuel olarak oluşturmanız gerekmez: Google, haritanızı görsel olarak stillendirdikten sonra JSON'u sizin için oluşturan Stil Sihirbazı'nı sağlar. Bu uygulamada, haritayı "gece modu" için şekillendiriyorsunuz. Bu, haritanın gece kullanılmak üzere soluk renkler ve düşük kontrast kullandığı anlamına gelir.

  1. Tarayıcınızda https://mapstyle.withgoogle.com/ adresine gidin.
  2. Stil Oluştur'u seçin.
  3. Gece temasını seçin.
  4. Menünün alt kısmında Diğer Seçenekler'i tıklayın.
  5. Özellik türü listesinin alt kısmında Su > Doldur'u seçin. Suyun rengini koyu mavi olarak değiştirin (örneğin, #160064).
  6. Son'u tıklayın. Sonuç olarak açılan pop-up penceredeki JSON kodunu kopyalayın.
  7. Android Studio'da, res dizininde raw adlı bir kaynak dizini oluşturun. res/raw içinde map_style.json adlı bir dosya oluştur.
  8. JSON kodunu yeni kaynak dosyasına yapıştırın.
  9. JSON stilini haritaya ayarlamak için GoogleMap nesnesinde setMapStyle() işlevini çağırın. JSON dosyasını yükleyen bir MapStyleOptions nesnesi iletin. setMapStyle() yöntemi, stil oluşturmanın başarılı olup olmadığını gösteren bir boole değeri döndürür. Dosya yüklenemezse yöntem bir Resources.NotFoundException oluşturur.

Haritaya stil uygulamak için aşağıdaki kodu onMapReady() yöntemine kopyalayın. Günlük ifadeleriniz için bir TAG dizesi oluşturmanız gerekebilir:

     try {
        // Customize the styling of the base map using a JSON object defined
        // in a raw resource file.
        boolean success = googleMap.setMapStyle(
           MapStyleOptions.loadRawResourceStyle(
                   this, R.raw.map_style));

        if (!success) {
            Log.e(TAG, "Style parsing failed.");
        }
     } catch (Resources.NotFoundException e) {
        Log.e(TAG, "Can't find style. Error: ", e);
     }
  1. Uygulamanızı çalıştırın. Harita normal modundayken yeni stil görünür olmalıdır.

Gece modu stilinde Google Harita

3.2 İşaretçinizi biçimlendirme

Harita işaretçilerine stil vererek haritanızı daha da kişiselleştirebilirsiniz. Bu adımda, varsayılan kırmızı işaretçileri gece modu renk şemasına uyacak şekilde değiştirirsiniz.

  1. onMapLongClick() yönteminde, varsayılan işaretçiyi kullanmak ancak rengini mavi olarak değiştirmek için MarkerOptions() oluşturucusuna aşağıdaki kod satırını ekleyin:
.icon(BitmapDescriptorFactory.defaultMarker
       (BitmapDescriptorFactory.HUE_BLUE))
  1. Uygulamayı çalıştırın. Yerleştirdiğiniz işaretçiler artık uygulamanın gece modu temasıyla daha tutarlı olan mavi renkte gölgelendirilir.

onPoiClick() yöntemine stil eklemediğiniz için ÖY işaretçilerinin hâlâ kırmızı olduğunu unutmayın.

3.3 Yer paylaşımı ekleme

Google Harita'yı özelleştirmenin bir yolu, haritanın üzerine çizim yapmaktır. Bu teknik, popüler balık tutma yerleri gibi belirli bir konum türünü vurgulamak istediğinizde kullanışlıdır. Üç tür yer paylaşımı desteklenir:

  • Şekiller: Haritaya çoklu çizgiler, poligonlar ve daireler ekleyebilirsiniz.
  • TileOverlay nesneleri: Karo yer paylaşımı, temel harita karolarının üzerine eklenen bir dizi görüntüyü tanımlar. Döşeme yer paylaşımları, haritaya kapsamlı görüntüler eklemek istediğinizde kullanışlıdır. Tipik bir döşeme yerleşimi, geniş bir coğrafi alanı kapsar.
  • GroundOverlay nesneleri: Zemin yer paylaşımı, haritaya sabitlenmiş bir resimdir. Yer paylaşımları, işaretçilerden farklı olarak ekrana değil, Dünya yüzeyine yönlendirilir. Haritayı döndürme, eğme veya yakınlaştırma, görüntünün yönünü değiştirir. Yer paylaşımları, tek bir görüntüyü haritada belirli bir alana sabitlemek istediğinizde kullanışlıdır.

Bu adımda, evinizin bulunduğu konuma Android şeklinde bir yer paylaşımı ekleyeceksiniz.

  1. Bu Android görüntüsünü indirip res/drawable klasörünüze kaydedin.
  2. onMapReady() içinde, kamerayı başlangıç konumuna taşıma çağrısından sonra bir GroundOverlayOptions nesnesi oluşturun. Nesneyi homeOverlay adlı bir değişkene atayın:
GroundOverlayOptions homeOverlay = new GroundOverlayOptions();
  1. Yukarıdaki resimden BitmapDescriptor nesnesi oluşturmak için BitmapDescriptorFactory.fromResource() yöntemini kullanın. Nesneyi GroundOverlayOptions nesnesinin image() yöntemine iletin:
GroundOverlayOptions homeOverlay = new GroundOverlayOptions()
    .image(BitmapDescriptorFactory.fromResource(R.drawable.android));
  1. position() yöntemini çağırarak GroundOverlayOptions nesnesi için position özelliğini ayarlayın. home LatLng nesnesini ve istenen yer paylaşımının metre cinsinden genişliği için bir float iletin. Bu örnekte 100 m genişlik iyi sonuç verir:
GroundOverlayOptions homeOverlay = new GroundOverlayOptions()
     .image(BitmapDescriptorFactory.fromResource(R.drawable.android))
       .position(home, 100);
  1. GoogleMap nesnesinde addGroundOverlay() işlevini çağırın. GroundOverlayOptions nesnenizi iletin:
mMap.addGroundOverlay(homeOverlay);
  1. Uygulamayı çalıştırın. Evinizin konumuna yakınlaştırdığınızda Android resmini yer paylaşımı olarak görürsünüz.

6. 4. görev: Konum izlemeyi ve Street View'u etkinleştirme

Kullanıcılar genellikle mevcut konumlarını görmek için Google Haritalar'ı kullanır. Konum Hizmetleri API'sini kullanarak cihaz konumunu elde edebilirsiniz. Location verilerini daha fazla kullanmadan cihaz konumunu haritanızda göstermek için konum verisi katmanını kullanabilirsiniz.

Konum verileri katmanı, haritanın sağ üst tarafına Konumum düğmesini ekler. Kullanıcı düğmeye dokunduğunda harita, cihazın konumuna göre ortalanır. Cihaz sabitse konum mavi nokta, hareket hâlindeyse mavi şerit olarak gösterilir.

Konum izleme özelliği içeren stilize edilmiş bir Google Haritası

Belirli bir konumun gezilebilir panoramik fotoğrafı olan Google Street View'u kullanarak bir konum hakkında ek bilgi sağlayabilirsiniz.

Bu görevde, kullanıcının ÖY işaretçisinin bilgi penceresine dokunduğunda haritanın Street View moduna geçmesi için konum verileri katmanını ve Street View'u etkinleştirirsiniz.

4.1 Konum izlemeyi etkinleştirme

Google Haritalar'da konum izlemeyi etkinleştirmek için tek bir kod satırı gerekir. Ancak kullanıcının konum izinleri verdiğinden (çalışma zamanı izni modelini kullanarak) emin olmanız gerekir.

Bu adımda konum izinleri istenir ve konum izleme etkinleştirilir.

  1. AndroidManifest.xml dosyasında FINE_LOCATION izninin zaten mevcut olduğunu doğrulayın. Android Studio, Google Haritalar şablonunu seçtiğinizde bu izni ekledi.
  2. Uygulamanızda konum takibini etkinleştirmek için MapsActivity içinde enableMyLocation() adlı bir yöntem oluşturun. Bu yöntem herhangi bir bağımsız değişken almaz ve herhangi bir değer döndürmez.
  3. enableMyLocation() yöntemini tanımlayın. ACCESS_FINE_LOCATION iznini kontrol edin. İzin verildiyse konum katmanını etkinleştirin. Aksi takdirde, izni isteyin:
private void enableMyLocation() {
   if (ContextCompat.checkSelfPermission(this,
           Manifest.permission.ACCESS_FINE_LOCATION)
           == PackageManager.PERMISSION_GRANTED) {
       mMap.setMyLocationEnabled(true);
   } else {
       ActivityCompat.requestPermissions(this, new String[]
                       {Manifest.permission.ACCESS_FINE_LOCATION},
               REQUEST_LOCATION_PERMISSION);
   }
}
  1. Konum katmanını etkinleştirmek için onMapReady() geri arama özelliğini kullanarak enableMyLocation() numaralı telefonu arayın.
  2. onRequestPermissionsResult() yöntemini geçersiz kılın. İzin verildiyse enableMyLocation() numaralı telefonu arayın:
@Override
public void onRequestPermissionsResult(int requestCode,
       @NonNull String[] permissions,
       @NonNull int[] grantResults) {
   // Check if location permissions are granted and if so enable the
   // location data layer.
   switch (requestCode) {
       case REQUEST_LOCATION_PERMISSION:
           if (grantResults.length > 0
                   && grantResults[0]
                   == PackageManager.PERMISSION_GRANTED) {
               enableMyLocation();
               break;
           }
   }
}
  1. Uygulamayı çalıştırın. Sağ üst köşede artık cihazın mevcut konumunu gösteren Konumum düğmesi bulunur.

4.2 Street View'u etkinleştirme

Google Haritalar, belirli bir yolda gezinmek için kontroller içeren bir konumun panoramik görünümü olan Street View'u sunar. Street View'un dünya genelinde kapsamı yoktur.

Bu adımda, kullanıcı bir ÖY'nin bilgi penceresine dokunduğunda etkinleştirilen bir Street View panoraması etkinleştirirsiniz. Yapmanız gereken iki işlem var:

  1. Uygulamanızın işlevinin yalnızca ÖY işaretçilerinde çalışmasını istediğiniz için ÖY işaretçilerini diğer işaretçilerden ayırt edin. Bu şekilde, kullanıcı bir ÖY bilgi penceresine dokunduğunda Street View'i başlatabilirsiniz ancak kullanıcı başka bir işaretçi türüne dokunduğunda başlatamazsınız.

Marker sınıfı, veri eklemenize olanak tanıyan bir setTag() yöntemi içerir. (Veriler, Object ile başlayan her şey olabilir.) Kullanıcılar ÖY'leri tıkladığında oluşturulan işaretçilere bir etiket yerleştirirsiniz.

  1. Kullanıcı bir OnInfoWindowClickListener içinde etiketlenmiş bir bilgi penceresine dokunduğunda MapFragment yerine StreetViewPanoramaFragment yerleştirin. (Aşağıdaki kod, API 12'den önceki Android sürümlerini desteklemek için SupportMapFragment ve SupportStreetViewPanoramaFragment kullanır.)

Çalışma zamanında parçalardan herhangi biri değişirse bunları XML'de statik olarak değil, kapsayan Activity sınıfına eklemeniz gerekir.

ÖY işaretçisini etiketleme

  1. onPoiClick() geri arama işleminde poiMarker tarihinde setTag() numaralı telefonu arayın. İstediğiniz dizeyi iletin:
poiMarker.setTag("poi");

Statik SupportMapFragment'ı çalışma zamanı örneğiyle değiştirme

  1. activity_maps.xml öğesini açın ve öğeyi, parçalarınız için kapsayıcı görevi görecek bir çerçeve düzenine değiştirin:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/fragment_container"
   android:layout_width="match_parent"
   android:layout_height="match_parent" />
  1. MapsActivity içindeki onCreate() bölümünde, XML'de artık statik SupportMapFragment olmadığı için kimliğe göre SupportMapFragment bulan kodu kaldırın. Bunun yerine, SupportMapFragment.newInstance() işlevini çağırarak SupportMapFragment öğesinin yeni bir çalışma zamanı örneğini oluşturun:
SupportMapFragment mapFragment = SupportMapFragment.newInstance();
  1. FrameLayout öğesine FragmentManager ile parça işlemi kullanarak parçayı ekleyin:
getSupportFragmentManager().beginTransaction()
       .add(R.id.fragment_container, mapFragment).commit();
  1. Haritanın eşzamansız yüklenmesini tetikleyen kod satırını koruyun:
mapFragment.getMapAsync(this);

OnInfoWindowClickListener ayarlama ve işaretçi etiketini kontrol etme

  1. MapsActivity içinde setInfoWindowClickToPanorama() adlı bir yöntem kaba kodu oluşturun. Bu yöntem, bağımsız değişken olarak GoogleMap alır ve void döndürür:
private void setInfoWindowClickToPanorama(GoogleMap map) {}
  1. GoogleMap için OnInfoWindowClickListener ayarlayın:
map.setOnInfoWindowClickListener(
       new GoogleMap.OnInfoWindowClickListener() {
           @Override
           public void onInfoWindowClick(Marker marker) {
           }
       });
  1. onInfoWindowClick() yönteminde, işaretçinin onPoiClick() yönteminde ayarladığınız dize etiketini içerip içermediğini kontrol edin:
if (marker.getTag() == "poi") {}

SupportMapFragment'ı SupportStreetViewPanoramaFragment ile değiştirin

  1. İşaretçi etiketi içeriyorsa StreetViewPanoramaOptions nesnesini kullanarak Street View panoramasının konumunu belirtin. Nesnenin position özelliğini, iletilen işaretçinin konumuna ayarlayın:
StreetViewPanoramaOptions options =
       new StreetViewPanoramaOptions().position(
               marker.getPosition());
  1. Oluşturduğunuz options nesnesini ileterek SupportStreetViewPanoramaFragment için yeni bir örnek oluşturun:
SupportStreetViewPanoramaFragment streetViewFragment
       = SupportStreetViewPanoramaFragment
       .newInstance(options);
  1. Parça işlemi başlatın. Parça kapsayıcısının içeriğini yeni parça streetViewFragment ile değiştirin. İşlemi geri yığına ekleyin. Böylece geri düğmesine basıldığında uygulamadan çıkmak yerine SupportMapFragment sayfasına geri dönülür:
getSupportFragmentManager().beginTransaction()
       .replace(R.id.fragment_container,
               streetViewFragment)
       .addToBackStack(null).commit();
  1. setPoiClick(). ile görüşme bittikten sonra onMapReady() bölgesinde setInfoWindowClickToPanorama(mMap)'ı arayın
  2. Uygulamayı çalıştırın. Mountain View (Google genel merkezinin bulunduğu yer) gibi Street View kapsamı olan bir şehri yakınlaştırın ve park gibi bir ÖY bulun. İşaretçi yerleştirmek ve bilgi penceresini göstermek için ÖY'ye dokunun. İşaretçinin bulunduğu konum için Street View moduna girmek üzere bilgi penceresine dokunun. Harita parçasına dönmek için geri düğmesine basın.

Android uygulamasında Google Street View

7. Çözüm kodu

Wander çözüm kodu.

8. Kodlama yarışması

Sorun: Street View kapsamı olmayan bir konumdaki ÖY'nin bilgi penceresine dokunduğunuzda siyah ekran görünüyor.

9. Özet

  • Maps API'yi kullanmak için Google API Konsolu'ndan bir API anahtarı almanız gerekir.
  • Android Studio'da Google Haritalar Etkinliği şablonunu kullanmak, uygulamanın düzeninde tek bir Activity ile SupportMapFragment oluşturur. Şablon ayrıca uygulama manifestine ACCESS_FINE_PERMISSION öğesini ekler, etkinliğinizde OnMapReadyCallback öğesini uygular ve gerekli onMapReady() yöntemini geçersiz kılar.

Çalışma zamanında bir GoogleMap öğesinin harita türünü değiştirmek için GoogleMap.setMapType() yöntemini kullanın. Google Haritası aşağıdaki harita türlerinden biri olabilir:

  • Normal: Normal yol haritası. Yolları, insanlar tarafından inşa edilen bazı yapıları ve nehirler gibi önemli doğal özellikleri gösterir. Yol ve özellik etiketleri de görünür.
  • Hibrit: Uydu fotoğrafı verilerine yol haritaları eklenir. Yol ve özellik etiketleri de görünür.
  • Uydu: Fotoğraf verileri. Yol ve özellik etiketleri görünmüyor.
  • Arazi: Topografik veriler. Haritada renkler, kontur çizgileri ve etiketler ile perspektif gölgelendirme yer alır. Bazı yollar ve etiketler de görünür.
  • Yok**:** Harita yok.

Google Haritalar hakkında:

  • İşaretçi, belirli bir coğrafi konumun göstergesidir.
  • İşaretçiye dokunulduğunda varsayılan olarak konumla ilgili bilgilerin yer aldığı bir bilgi penceresi gösterilir.
  • Varsayılan olarak, ilgi çekici yerler (İÇY'ler) temel haritada ilgili simgeleriyle birlikte gösterilir. Önemli yerler arasında parklar, okullar, devlet binaları ve daha fazlası yer alır.
  • Ayrıca, harita türü normal olduğunda işletme ÖY'leri (mağazalar, restoranlar, oteller vb.) varsayılan olarak haritada görünür.
  • OnPoiClickListener kullanarak ÖY'lerdeki tıklamaları yakalayabilirsiniz.
  • Stil Sihirbazı'nı kullanarak Google Haritası'ndaki neredeyse tüm öğelerin görsel görünümünü değiştirebilirsiniz. Stil Sihirbazı, setMapStyle() yöntemini kullanarak Google Harita'ya ilettiğiniz bir JSON dosyası oluşturur.
  • Varsayılan rengi değiştirerek veya varsayılan işaretçi simgesini özel bir resimle değiştirerek işaretçilerinizi özelleştirebilirsiniz.

Diğer önemli bilgiler:

  • Bir resmi coğrafi konuma sabitlemek için yer paylaşımı kullanın.
  • Resmi, resmin metre cinsinden boyutunu ve resmin konumunu belirtmek için GroundOverlayOptions nesnesini kullanın. Yer paylaşımını haritaya ayarlamak için bu nesneyi GoogleMap.addGroundOverlay() yöntemine iletin.
  • Uygulamanızda ACCESS_FINE_LOCATION izni varsa mMap.setMyLocationEnabled(true) yöntemini kullanarak konum takibini etkinleştirebilirsiniz.
  • Google Street View, kapsama alanı boyunca belirlenmiş yollardan 360 derecelik panoramik görünümler sunar.
  • Yeni bir Street View parçası oluşturmak için StreetViewPanoramaFragment.newInstance() yöntemini kullanın.
  • Görünüm seçeneklerini belirtmek için StreetViewPanoramaOptions nesnesi kullanın. Nesneyi newInstance() yöntemine iletin.

10. Daha fazla bilgi

İlgili kavram belgeleri 9.1: Google Maps API bölümünde yer almaktadır.

Android geliştirici belgeleri:

Referans belgeleri:

11. Ev ödevi

Bu bölümde, bir eğitmenin yönettiği kurs kapsamında bu codelab'i tamamlayan öğrenciler için olası ödevler listelenir. Eğitmen, aşağıdakileri yapmalıdır:

  • Gerekirse ev ödevi atayın.
  • Öğrencilere ev ödevi ödevlerini nasıl göndereceklerini bildirin.
  • Ev ödevlerine not verin.

Eğitmenler bu önerileri istedikleri ölçüde kullanabilir ve uygun olduğunu düşündükleri diğer ev ödevlerini verebilirler.

Bu codelab'i kendi başınıza tamamlıyorsanız bilginizi test etmek için bu ödevleri kullanabilirsiniz.

Uygulama oluşturma ve çalıştırma

  1. Uygulama başlatıldığında Google Haritalar'ı yükleyen Google Haritalar Etkinliği şablonunu kullanan yeni bir uygulama oluşturun.
  2. Google Harita yüklendiğinde kamerayı okulunuzun, evinizin veya sizin için anlamı olan başka bir konumun bulunduğu yere taşıyın.
  3. Haritaya iki işaretçi ekleyin. Biri okulunuzun bulunduğu yere, diğeri ise evinize veya anlamlı başka bir yere olsun.
  4. Varsayılan rengi değiştirerek veya varsayılan işaretçi simgesini özel bir resimle değiştirerek işaretçi simgelerini özelleştirin.

İpucu: onMapReady (GoogleMap googleMap) belgelerine bakın.

Bu soruları yanıtlayın

1. Soru

Harita yüklendiğinde ve uygulamada kullanılmaya hazır olduğunda hangi yöntem çağrılır?

2. Soru

Uygulamanıza Google Haritalar'ı dahil etmek için hangi Android bileşenlerini kullanabilirsiniz?

  • MapView ve MapFragment
  • MapFragment ve MapActivity
  • MapView ve MapActivity
  • Yalnızca MapFragment

3. Soru

Google Haritalar Android API'si ne tür haritalar sunar?

  • Normal, hibrit, arazi, uydu ve yol haritası
  • Normal, hibrit, arazi, uydu ve "yok"
  • Hibrit, arazi, uydu, yol haritası ve "yok"
  • Normal, arazi, uydu, resim haritası ve "yok"

4. Soru

Bir önemli yere (ÖY) tıklama işlevi eklemek için hangi arayüzü kullanıyorsunuz?

  • GoogleMap.OnPoiListener
  • GoogleMap.OnPoiClickListener
  • GoogleMap.OnPoiClick
  • GoogleMap.OnPoiClicked

Uygulamanızı notlandırma için gönderme

Değerlendirme uzmanları için rehberlik

Uygulamada aşağıdaki özelliklerin bulunduğundan emin olun:

  • Uygulama başlatıldığında Google Harita doğru şekilde gösterilir. Bu, API anahtarının düzgün şekilde oluşturulduğunu gösterir.
  • Google Harita yüklendikten sonra kamera, öğrencinin evine veya okuluna doğru hareket eder. Kodda bu adım onMapReady (GoogleMap googleMap) geri çağırma yönteminde gerçekleşmelidir.
  • İşaretçiler, öğrencinin okulunun bulunduğu konumda ve öğrencinin evi gibi başka bir konumda gösterilir.
  • İki işaretçi özelleştirilir. Örneğin, işaretçiler varsayılan kırmızı renk dışında bir renk kullanıyor veya özel bir simge kullanıyor.

12. Sonraki Codelab

Advanced Android Development eğitim kursundaki tüm codelab'leri görmek için Advanced Android Development codelab'leri açılış sayfasını ziyaret edin.