Kendi Android Yeriniz için seçiciyi (Java) oluşturun

1. Başlamadan önce

Kullanıcılarınıza mevcut konumlarını tanımlamak için Yerler listesi sunmak amacıyla Google Haritalar Platformu'nu ve Android için Yerler SDK'sını nasıl kullanacağınızı öğrenin.

bd07a9ad2cb27a06.png

Ön koşullar

  • Temel Java becerileri

Yapacaklarınız

  • Bir Android uygulamasına harita ekleyin.
  • Kullanıcıyı coğrafi konuma getirmek için konum izinlerini kullanın.
  • Kullanıcının geçerli konumunun yakınındaki Yerleri getir.
  • Halihazırda nerede olduğunu belirlemek için kullanıcıya potansiyel Yerleri gösterin.

Derlemeniz istenen nedir?

Android uygulamanızı sıfırdan oluşturursunuz, ancak hata ayıklama sırasında karşılaştırmak için örnek kodu indirebilirsiniz. GitHub'dan örnek kodu indirin veya komut satırı kullanımı için Git kurulumunu yaptıysanız aşağıdakileri girin:

git clone https://github.com/googlecodelabs/current-place-picker-android.git

Bu codelab'den yararlanırken herhangi bir sorunla (kod hataları, dil bilgisi hataları, anlaşılır ifadeler veya başka bir şey) karşılaşırsanız lütfen codelab'in sol alt köşesindeki Hata bildir bağlantısını kullanarak sorunu bildirin.

2. Başlayın

Bu codelab'i başlatmadan önce şunları ayarlamanız gerekir:

Android Studio

https://developer.android.com/studio adresinden Android Studio'yu indirin.

Android Studio'yu kullanıyorsanız Android Studio > Güncellemeleri kontrol et... seçeneğini tıklayarak en son sürüme sahip olduğunuzdan emin olun.

1f36bae83b64e33.png

Bu laboratuvar Android Studio 3.4 kullanılarak yazılmıştır.

Android SDK

Android Studio'da, SDK Yöneticisi'ni kullanarak istediğiniz SDK'ları yapılandırabilirsiniz. Bu laboratuvarda Android Q SDK kullanılmaktadır.

  1. Android Studio karşılama ekranında Yapılandır > SDK Yöneticisi'ni tıklayın.

d3fa03c269ec231c.png

  1. İstediğiniz SDK onay kutusunu işaretleyin ve ardından Uygula'yı tıklayın.

Henüz SDK'nız yoksa bu işlem, SDK'nın makinenize indirilmesini başlatır.

884e0aa1314f70d.png

Google Play hizmetleri

SDK yöneticisinden Google Play hizmetlerini de yüklemeniz gerekir.

  1. SDK Tools (SDK Araçları) sekmesini tıklayın ve Google Play hizmetleri onay kutusunu işaretleyin.

Durum bölümünde Güncelleme mevcut yazıyorsa güncelleyin.

ad6211fd78f3b629.png

3. Emülatörü hazırlama

Uygulamayı çalıştırmak için kendi cihazınızı bağlayabilir veya Android Emülatör'ü kullanabilirsiniz.

Kendi cihazınızı kullanıyorsanız bu sayfanın sonunda Gerçek cihaz talimatları: Google Play Hizmetleri'ni güncelleyin bölümüne geçin.

Emülatör ekleme

  1. Android Studio karşılama ekranında Yapılandır > AVD Manager'ı tıklayın.

5dd2d14c9c56d3f9.png

Android Virtual Device Manager iletişim kutusu açılır.

  1. Aralarından seçim yapabileceğiniz cihazların listesini açmak için Sanal Cihaz Oluştur... seçeneğini tıklayın.

2d44eada384f8b35.png

  1. Play Store sütununda Play d5722488d80cd6be.png simgesinin bulunduğu bir cihaz seçin ve İleri'yi tıklayın.

e0248f1c6e85ab7c.png

Yükleyebileceğiniz bir grup sistem resmi görürsünüz. Android 9.+ (Google Play) dilini hedefleyen Q öğesinin yanında İndir kelimesi varsa İndir'i tıklayın.

316d0d1efabd9f24.png

  1. Sanal cihazınıza bir ad vermek için İleri'yi ve ardından Son'u tıklayın.

Sanal Cihazlarınız listesine dönersiniz.

  1. Yeni cihazınızın yanındaki Başlat ba8adffe56d3b678.png simgesini tıklayın:

7605864ed27f77ea.png

Birkaç dakika sonra emülatör açılır.

Emulator talimatları - Google Play hizmetlerini güncelleme

  1. Emülatör başladıktan sonra, görüntülenen gezinme çubuğunda ... simgesini tıklayın**.**

2e1156e02643d018.png

Genişletilmiş denetimler iletişim kutusu açılır.

  1. Menüde Google Play'i tıklayın.

Güncelleme varsa Güncelle'yi tıklayın.

5afd2686c5cad0e5.png

  1. Google Hesabı ile emülatörde oturum açın.

Testinizi kişisel bilgilerinizden ayrı tutmak için kendi hesabınızı kullanabilir veya ücretsiz olarak yeni bir hesap oluşturabilirsiniz.

Ardından Google Play, Google Play Hizmetleri'ni açar.

  1. Google Play Hizmetleri'nin son sürümünü edinmek için Güncelle'yi tıklayın.

f4bc067e80630b9c.png

Hesap kurulumunuzu tamamlamanız ve ödeme seçeneği eklemeniz istenirse Atla'yı tıklayın.

Emülatördeki konumu ayarlama

  1. Emülatör başlatıldıktan sonra Google Haritalar uygulamasının simgesini açmak için ana ekrandaki arama çubuğuna "haritalar" yazın.

2d996aadd53685a6.png

  1. Başlatmak için simgeyi tıklayın.

Varsayılan harita gösterilir.

  1. Haritanın sağ alt kısmında, Konumunuz'u tıklayınc5b4e2fda57a7e71.png.

Telefonun konumu kullanmasına izin vermeniz istenir.

f2b68044eabca151.png

  1. Genişletilmiş Kontroller menüsünü açmak için ... düğmesini tıklayın.
  2. Konum sekmesini tıklayın.
  3. Bir enlem ve boylam girin.

İstediğiniz her şeyi buraya girin, ancak çok fazla yerin bulunduğu bir bölgede olduğundan emin olun.

(Hawaii'deki Maui'de bulunan Kihei kasabası için 20.7818 ve Longitude -156.4624 enlemlerini kullanarak bu codelab'den elde edilen sonuçları kopyalayabilirsiniz.)

  1. Gönder'i tıklayın. Harita bu konumla güncellenir.

f9576b35218f4187.png

Uygulamanızı çalıştırıp konumla test etmeye hazırsınız.

Gerçek cihaz talimatları - Google Play hizmetlerini güncelleyin

Gerçek bir Android cihaz kullanıyorsanız aşağıdakileri yapın:

  1. Google Play hizmetlerini aramak ve açmak için ana ekrandaki arama çubuğunu kullanın.
  2. Diğer Ayrıntılar'ı tıklayın.

Varsa Güncelle'yi tıklayın.

ad16cdb975b5c3f7.png baf0379ef8a9c88c.png

4. Google Haritalar etkinliğiyle uygulama kabuğu oluşturun

  1. Android Studio karşılama ekranında Yeni bir Android Studio projesi başlat'ı seçin.
  2. Telefon ve Tablet sekmesinde Google Haritalar Etkinliği'ni seçin.

c9c80aa8211a8761.png

Projenizi yapılandırın iletişim kutusu açılır. Burada uygulamanızı adlandırabilir ve alanınıza göre paketi oluşturabilirsiniz.

com.google.codelab.currentplace paketine karşılık gelen Mevcut Yer adlı uygulamanın ayarları aşağıda verilmiştir.

37f5b93b94ee118c.png

  1. Dil olarak Java'yı, ardından androidx. yapımları kullan*'ı seçin.

Diğer ayarların varsayılanlarını koruyun.

  1. Son'u tıklayın.

5. Google Hizmetleri bağımlılıklarını Gradle derleme dosyasına ekleyin

Android'de konum izinlerine erişmek için Google Play Hizmetleri'nden Google Konum ve Etkinlik Tanıma API'sine ihtiyacınız vardır. Bu ve diğer Google Play Hizmetleri API'larını ekleme hakkında daha fazla bilgi için Google Play Hizmetleri'ni ayarlama konusuna bakın.

Android Studio projelerinde genellikle iki build.gradle dosyası bulunur. Bunlardan biri genel proje, diğeri uygulama içindir. Android Android Proje gezgini Android görünümündeyse her ikisini de Gradle Scripts klasöründe görürsünüz. Google hizmeti eklemek için build.gradle (Module: app) dosyasını düzenlemeniz gerekir.

f3043429cf719c47.png

  1. Konum için Google hizmetlerini ve Places API'yi (bağlam içinde örnek kod) eklemek için dependencies bölümüne iki satır ekleyin.

build.gradle (Modül: uygulama)

plugins {
  id 'com.android.application'
}

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.google.codelab.currentplace"
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'com.google.android.gms:play-services-maps:16.1.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'

    implementation 'com.google.android.gms:play-services-location:16.0.0'
    implementation 'com.google.android.libraries.places:places:1.1.0'
}

6. Google Maps Platform API'lerini etkinleştirin ve API anahtarı alın

Aşağıdaki etkinleştirme adımı için Android için Maps SDK'yı ve Places API'yi etkinleştirmeniz gerekir.

Google Haritalar Platformu'nu kurma

Henüz bir Google Cloud Platform hesabınız ve faturalandırmanın etkin olduğu bir projeniz yoksa faturalandırma hesabı ve proje oluşturmak için lütfen Google Haritalar Platformu'nu Kullanmaya Başlama kılavuzuna bakın.

  1. Cloud Console'da proje açılır menüsünü tıklayın ve bu codelab için kullanmak istediğiniz projeyi seçin.

  1. Google Cloud Marketplace'te bu codelab için gerekli olan Google Haritalar Platformu API'lerini ve SDK'larını etkinleştirin. Bunu yapmak için bu video veya bu dokümanlardaki adımları uygulayın.
  2. Cloud Console'un Kimlik Bilgileri sayfasında API anahtarı oluşturun. Bu video veya bu dokümanlardaki adımları uygulayabilirsiniz. Google Haritalar Platformu'na gönderilen tüm istekler bir API anahtarı gerektirir.

Yeni oluşturduğunuz API anahtarını kopyalayın. Android Studio'ya geri dönün ve Android > app > res > values altında google_maps_api.xml dosyasını bulun.

YOUR_KEY_HERE öğesini, kopyaladığınız API anahtarıyla değiştirin.

aa576e551a7a1009.png

Uygulamanız artık yapılandırılmış durumda.

7. Düzen dosyasını düzenleme

  1. Proje gezgininizde Android > app > res > layout içinde activity_maps.xml dosyasını açın.

4e0d986480c57efa.png

  1. Ekranın sağ tarafında temel arayüzü görürsünüz. Alt kısımda sekmeleriniz, düzeniniz için Tasarım veya Metin düzenleyiciyi seçmenize olanak tanır. Metin'i seçin ve düzen dosyasının tüm içeriğini şununla değiştirin:

activity_maps.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:orientation="vertical">

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:minHeight="?attr/actionBarSize"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:titleTextColor="@android:color/white"
        android:background="@color/colorPrimary" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <fragment
            android:id="@+id/map"
            android:name="com.google.android.gms.maps.SupportMapFragment"
            android:layout_width="match_parent"
            android:layout_height="349dp"
            tools:context=".MapsActivity" />

        <ListView
            android:id="@+id/listPlaces"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>

</LinearLayout>

Bu size aşağıdaki gibi bir kullanıcı arayüzü sağlar:

1bf786808a4697ce.png

8. Uygulama çubuğunu ayarlama

Kullanıcının geçerli yerini seçmek istediği zaman tıklaması için bir düğme vermek üzere, ilgili kullanıcının bulunduğu yeri bulan ve yakındaki olası yerleri gösteren bir simgeye sahip uygulama çubuğu ekleyin. Bu arayüz şöyle görünür:

3a17c92b613a26c5.png

Telefonda yalnızca simge gösterilir. Metin, daha fazla alana sahip bir tablette de dahil edilir.

Simgeyi oluşturma

  1. Proje gezgininde Android > uygulama'yı tıklayın, ardından res klasörünü sağ tıklayın ve Yeni > Resim Öğesi'ni seçin.

Asset Studio açılır.

  1. Simge Türü menüsünde İşlem Çubuğu ve Sekme Simgeleri'ni tıklayın.
  2. Öğenize ic_geolocate için ad verin.
  3. Öğe türü olarak Küçük Resim'i seçin**.**
  4. Küçük Resim'in yanındaki grafiği tıklayın.

Bu işlem, Simge Seç penceresini açar.

  1. Bir simge seçin.

Niyetinizle ilgili simgeleri bulmak için arama çubuğunu kullanabilirsiniz.

  1. location ifadesini arayın ve konumla ilgili bir simge seçin.

Konumum simgesi, bir kullanıcı kamerayı mevcut konumuna çekmek istediğinde Google Haritalar uygulamasında kullanılan simgeyle aynıdır.

  1. Tamam > İleri > Son'u tıklayın ve drawable adında yeni simge dosyalarınızı içeren yeni bir klasör olduğunu doğrulayın.

b9e0196137ed18ae.png

Dize kaynağı ekleme

  1. Proje gezgininde Android > app > res > values öğesini tıklayın ve strings.xml dosyasını açın.
  2. <string name="title_activity_maps">Map</string> adlı satırdan sonra aşağıdaki satırları ekleyin:

dizeler.xml

    <string name="action_geolocate">Pick Place</string>
    <string name="default_info_title">Default Location</string>
    <string name="default_info_snippet">No places found, because location permission is disabled.</string>

İlk satır, simgenin yanına metin etiketi eklemek için yeterli alan olduğunda uygulama çubuğunda kullanılır. Diğerleri, haritaya eklediğiniz işaretçiler için kullanılır.

Dosyadaki kod şu şekilde görünür:

<resources>
    <string name="app_name">Current Place</string>
    <string name="title_activity_maps">Map</string>
    <string name="action_geolocate">Pick Place</string>
    <string name="default_info_title">Default Location</string>
    <string name="default_info_snippet">No places found, because location permission is disabled.</string>
</resources>

Uygulama çubuğunu ekleme

  1. Proje gezgininde Android > app'i tıklayın, ardından res klasörünü sağ tıklayın ve app/src/main/res altında yeni bir alt dizin oluşturmak için Yeni > Dizin'i seçin.
  2. Dizini menu olarak adlandırın.
  3. menu klasörünü sağ tıklayın ve Yeni > Dosya'yı seçin.
  4. Dosyaya menu.xml adını verin.
  5. Şu kodu yapıştırın:
<?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">

    <!-- "Locate me", should appear as action button if possible -->
    <item
        android:id="@+id/action_geolocate"
        android:icon="@drawable/ic_geolocate"
        android:title="@string/action_geolocate"
        app:showAsAction="always|withText" />

</menu>

Uygulama çubuğu stilini güncelleme

  1. Proje gezgininde Android > app > res > values öğesini genişletin ve içindeki styles.xml dosyasını açın.
  2. <style> etiketinde, üst mülkü "Theme.AppCompat.NoActionBar" olacak şekilde düzenleyin.
  3. Sonraki adımda kullandığınız name özelliğine dikkat edin.

styles.xml

<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">

AndroidManifest.xml dosyasındaki uygulama temasını güncelleme

  1. Android > app > manifests öğesini tıklayın ve AndroidManifest.xml dosyasını açın.
  2. android:theme satırını bulup değeri @style/AppTheme olacak şekilde düzenleyin veya onaylayın.

AndroidManifest.xml

   <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

Artık kodlamaya başlamaya hazırsınız.

9. Uygulamayı ilk kullanıma hazırla

  1. Proje gezgininizde MapsActivity.java dosyasını bulun.

1. adımda uygulamanız için oluşturduğunuz pakete karşılık gelen klasörde yer alır.

8b0fa27d417f5f55.png

  1. Dosyayı açın ve Java kod düzenleyicidesiniz.

Yerler SDK'sını ve diğer bağımlıları içe aktarma

Bu satırları mevcut içe aktarma ifadelerinin yerine MapsActivity.java öğesinin üst kısmına ekleyin.

Mevcut içe aktarmaları içerir ve bu codelab'de kodda kullanılan birçok öğeyi ekler.

MapsActivity.java

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import android.content.pm.PackageManager;
import android.location.Location;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import com.google.android.gms.common.api.ApiException;
import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;
import com.google.android.libraries.places.api.Places;
import com.google.android.libraries.places.api.model.Place;
import com.google.android.libraries.places.api.model.PlaceLikelihood;
import com.google.android.libraries.places.api.net.FindCurrentPlaceRequest;
import com.google.android.libraries.places.api.net.FindCurrentPlaceResponse;
import com.google.android.libraries.places.api.net.PlacesClient;

import java.util.Arrays;
import java.util.List;

Sınıf imzasını güncelleme

Places API, geriye dönük uyumlu destek için AndroidX bileşenlerini kullandığından, AppCompatActivity öğesini genişletmek için tanımlamanız gerekir. Bu harita etkinliği için varsayılan olarak tanımlanan FragmentActivity uzantısının yerini alır.

public class MapsActivity extends AppCompatActivity implements OnMapReadyCallback {

Sınıf değişkenleri ekleyin

Ardından, farklı sınıf yöntemlerinde kullanılan çeşitli sınıf değişkenlerini bildirin. Bunlar, kullanıcı arayüzü öğelerini ve durum kodlarını içerir. Bunlar, GoogleMap mMap için değişken beyanının hemen altında olmalıdır.

    // New variables for Current Place picker
    private static final String TAG = "MapsActivity";
    ListView lstPlaces;
    private PlacesClient mPlacesClient;
    private FusedLocationProviderClient mFusedLocationProviderClient;

    // The geographical location where the device is currently located. That is, the last-known
    // location retrieved by the Fused Location Provider.
    private Location mLastKnownLocation;

    // A default location (Sydney, Australia) and default zoom to use when location permission is
    // not granted.
    private final LatLng mDefaultLocation = new LatLng(-33.8523341, 151.2106085);
    private static final int DEFAULT_ZOOM = 15;
    private static final int PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION = 1;
    private boolean mLocationPermissionGranted;

    // Used for selecting the Current Place.
    private static final int M_MAX_ENTRIES = 5;
    private String[] mLikelyPlaceNames;
    private String[] mLikelyPlaceAddresses;
    private String[] mLikelyPlaceAttributions;
    private LatLng[] mLikelyPlaceLatLngs;

onCreate yöntemini güncelleyin

Konum hizmetleri için çalışma zamanı kullanıcı izinlerini işlemek, kullanıcı arayüzü öğelerini ayarlamak ve Places API istemcisini oluşturmak üzere onCreate yöntemini güncellemeniz gerekir.

Mevcut onCreate() yönteminin sonuna işlem araç çubuğu, görünüm kurulumu ve Yerler istemcisiyle ilgili aşağıdaki kod satırlarını ekleyin.

MapsActivity.java onCreate()

   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

        //
        // PASTE THE LINES BELOW THIS COMMENT
        //
        
        // Set up the action toolbar
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        // Set up the views
        lstPlaces = (ListView) findViewById(R.id.listPlaces);

        // Initialize the Places client
        String apiKey = getString(R.string.google_maps_key);
        Places.initialize(getApplicationContext(), apiKey);
        mPlacesClient = Places.createClient(this);
        mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
    }

Uygulama çubuğu menünüz için kod ekleyin

Bu iki yöntemde uygulama çubuğu menüsü (tek bir öğe, Yer Seç simgesiyle) eklenir ve kullanıcının simgeyi tıklaması sağlanır.

Bu iki yöntemi onCreate yönteminden sonra dosyanıza kopyalayın.

MapsActivity.java onCreateOptionsMenu() ve onOptionsItemSelected()

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu, menu);

        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
           case R.id.action_geolocate:
                
                // COMMENTED OUT UNTIL WE DEFINE THE METHOD
                // Present the current place picker
                // pickCurrentPlace();
                return true;

            default:
                // If we got here, the user's action was not recognized.
                // Invoke the superclass to handle it.
                return super.onOptionsItemSelected(item);

        }
    }

Test etme

  1. Android Studio'da Çalıştır veya Çalıştır > Run "uygulama''yı tıklayın.

28bea91c68c36fb2.png

  1. Dağıtım hedefinizi seçmeniz istenir. Çalışan emülatör bu listede görünecektir. Uygulamayı seçtiğinizde Android Studio uygulamayı sizin için emülatöre dağıtır.

f44658ca91f6f41a.png

Birkaç dakika sonra uygulama açılır. Tek düğme ve doldurulmamış yerler listesinin yer aldığı, haritayı Sidney, Avustralya merkezli olarak görürsünüz.

68eb8c70f4748350.png

Cihazın konumuna erişim izni istemediğiniz sürece haritanın odak noktası kullanıcının konumuna taşınmaz.

10. Konum izinlerini isteme ve yönetme

Harita hazır olduğunda konum izni iste

  1. Kullanıcı izinleri isteyen getLocationPermission adlı bir yöntem tanımlayın.

Bu kodu yeni oluşturduğunuz onOptionsSelected yönteminin altına yapıştırın.

MapsActivity.java getLocationPermission()

    private void getLocationPermission() {
        /*
         * Request location permission, so that we can get the location of the
         * device. The result of the permission request is handled by a callback,
         * onRequestPermissionsResult.
         */
        mLocationPermissionGranted = false;
        if (ContextCompat.checkSelfPermission(this.getApplicationContext(),
                android.Manifest.permission.ACCESS_FINE_LOCATION)
                == PackageManager.PERMISSION_GRANTED) {
            mLocationPermissionGranted = true;
        } else {
            ActivityCompat.requestPermissions(this,
                    new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION},
                    PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
        }
    }
  1. Yakınlaştırma kontrollerini etkinleştirmek ve kullanıcıdan konum izni istemek için mevcut onMapReady yönteminin sonuna iki satır ekleyin.

MapsActivity.java onMapReady()

   @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        // Add a marker in Sydney and move the camera
        LatLng sydney = new LatLng(-34, 151);
        mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));

        //
        // PASTE THE LINES BELOW THIS COMMENT
        //

        // Enable the zoom controls for the map
        mMap.getUiSettings().setZoomControlsEnabled(true);

        // Prompt the user for permission.
        getLocationPermission();

    }

İstenilen izinlerden elde edilen sonucu işleme

Kullanıcı, istek izni iletişim kutusuna yanıt verdiğinde bu geri çağırma Android tarafından çağrılır.

Bu kodu getLocationPermission() yönteminden sonra yapıştırın:

MapsActivity.java onRequestPermissionsResult()

   /**
     * Handles the result of the request for location permissions
     */
    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           @NonNull String permissions[],
                                           @NonNull int[] grantResults) {
        mLocationPermissionGranted = false;
        switch (requestCode) {
            case PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    mLocationPermissionGranted = true;
                }
            }
        }
    }

11. Mevcut konumu al ve olası yerleri getir

Kullanıcı, uygulama çubuğunda Yer Seçin'i tıkladığında uygulama, daha önce tanımladığınız getDeviceLocation() yöntemini çağıran pickCurrentPlace() yöntemini çağırır. getDeviceLocation yöntemi, en son cihaz konumunu aldıktan sonra getCurrentPlaceLikelihoods, adlı başka bir yöntemi çağırır.

findCurrentPlace API'yi çağırıp yanıtı gerçekleştirin

getCurrentPlaceLikelihoods, bir findCurrentPlaceRequest oluşturur ve Places API findCurrentPlace görevini çağırır. Görev başarılı olursa placeLikelihood nesnesinin listesini içeren bir findCurrentPlaceResponse döndürür. Bunların her birinde, yerin adı, adresi ve o konumda bulunma olasılığınız (0 ile 1 arasında çift değer) dahil olmak üzere çeşitli özellikler bulunur. Bu yöntem, placeLikelihoods öğesinden yer ayrıntıları listeleri oluşturarak yanıtı işler.

Bu kod, en olası beş yeri tekrar ederek bir listeye 0'dan daha büyük olasılıklı eklemeler yapar. Beşten fazla veya daha az öğe görüntülemek isterseniz M_MAX_ENTRIES sabit değerini düzenleyin.

Bu kodu onMapReady yönteminden sonra yapıştırın.

MapsActivity.java getCurrentPlaceLikeliisms()

   private void getCurrentPlaceLikelihoods() {
        // Use fields to define the data types to return.
        List<Place.Field> placeFields = Arrays.asList(Place.Field.NAME, Place.Field.ADDRESS,
                Place.Field.LAT_LNG);

        // Get the likely places - that is, the businesses and other points of interest that
        // are the best match for the device's current location.
        @SuppressWarnings("MissingPermission") final FindCurrentPlaceRequest request =
                FindCurrentPlaceRequest.builder(placeFields).build();
        Task<FindCurrentPlaceResponse> placeResponse = mPlacesClient.findCurrentPlace(request);
        placeResponse.addOnCompleteListener(this,
                new OnCompleteListener<FindCurrentPlaceResponse>() {
                    @Override
                    public void onComplete(@NonNull Task<FindCurrentPlaceResponse> task) {
                        if (task.isSuccessful()) {
                            FindCurrentPlaceResponse response = task.getResult();
                            // Set the count, handling cases where less than 5 entries are returned.
                            int count;
                            if (response.getPlaceLikelihoods().size() < M_MAX_ENTRIES) {
                                count = response.getPlaceLikelihoods().size();
                            } else {
                                count = M_MAX_ENTRIES;
                            }

                            int i = 0;
                            mLikelyPlaceNames = new String[count];
                            mLikelyPlaceAddresses = new String[count];
                            mLikelyPlaceAttributions = new String[count];
                            mLikelyPlaceLatLngs = new LatLng[count];

                            for (PlaceLikelihood placeLikelihood : response.getPlaceLikelihoods()) {
                                Place currPlace = placeLikelihood.getPlace();
                                mLikelyPlaceNames[i] = currPlace.getName();
                                mLikelyPlaceAddresses[i] = currPlace.getAddress();
                                mLikelyPlaceAttributions[i] = (currPlace.getAttributions() == null) ?
                                        null : TextUtils.join(" ", currPlace.getAttributions());
                                mLikelyPlaceLatLngs[i] = currPlace.getLatLng();

                                String currLatLng = (mLikelyPlaceLatLngs[i] == null) ?
                                        "" : mLikelyPlaceLatLngs[i].toString();

                                Log.i(TAG, String.format("Place " + currPlace.getName()
                                        + " has likelihood: " + placeLikelihood.getLikelihood()
                                        + " at " + currLatLng));

                                i++;
                                if (i > (count - 1)) {
                                    break;
                                }
                            }


                            // COMMENTED OUT UNTIL WE DEFINE THE METHOD
                            // Populate the ListView
                            // fillPlacesList();
                        } else {
                            Exception exception = task.getException();
                            if (exception instanceof ApiException) {
                                ApiException apiException = (ApiException) exception;
                                Log.e(TAG, "Place not found: " + apiException.getStatusCode());
                            }
                        }
                    }
                });
    }

Harita kamerasını cihazın mevcut konumuna taşıyın

Kullanıcı izin verirse uygulama kullanıcının en son konumunu getirir ve kamerayı bu konumun ortasına taşır.

Kullanıcı izni reddederse uygulama, kamerayı bu sayfanın başında sabit değerler arasında tanımlanan varsayılan konuma taşır (örnek kodda Sidney, Avustralya'dır).

Bu kodu getPlaceLikelihoods() yönteminden sonra yapıştırın:

MapsActivity.java getDeviceLocation()

    private void getDeviceLocation() {
        /*
         * Get the best and most recent location of the device, which may be null in rare
         * cases when a location is not available.
         */
        try {
            if (mLocationPermissionGranted) {
                Task<Location> locationResult = mFusedLocationProviderClient.getLastLocation();
                locationResult.addOnCompleteListener(this, new OnCompleteListener<Location>() {
                    @Override
                    public void onComplete(@NonNull Task<Location> task) {
                        if (task.isSuccessful()) {
                            // Set the map's camera position to the current location of the device.
                            mLastKnownLocation = task.getResult();
                            Log.d(TAG, "Latitude: " + mLastKnownLocation.getLatitude());
                            Log.d(TAG, "Longitude: " + mLastKnownLocation.getLongitude());
                            mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(
                                    new LatLng(mLastKnownLocation.getLatitude(),
                                            mLastKnownLocation.getLongitude()), DEFAULT_ZOOM));
                        } else {
                            Log.d(TAG, "Current location is null. Using defaults.");
                            Log.e(TAG, "Exception: %s", task.getException());
                            mMap.moveCamera(CameraUpdateFactory
                                    .newLatLngZoom(mDefaultLocation, DEFAULT_ZOOM));
                        }

                       getCurrentPlaceLikelihoods();
                    }
                });
            }
        } catch (SecurityException e)  {
            Log.e("Exception: %s", e.getMessage());
        }
    }

Kullanıcı Yer Seçin'i tıkladığında konum izinlerini kontrol edin

Kullanıcı Yer Seç'e dokunduğunda, bu yöntem konum izinlerini kontrol eder ve izin verilmediyse kullanıcıdan izin ister.

Kullanıcı izin verdiyse yöntem, olası en güncel yerleri alma işlemini başlatmak için getDeviceLocation çağrısı yapar.

  1. Bu yöntemi getDeviceLocation() tarihinden sonra ekleyin:

MapsActivity.java selectCurrentPlace()

   private void pickCurrentPlace() {
        if (mMap == null) {
            return;
        }

        if (mLocationPermissionGranted) {
            getDeviceLocation();
        } else {
            // The user has not granted permission.
            Log.i(TAG, "The user did not grant location permission.");

            // Add a default marker, because the user hasn't selected a place.
            mMap.addMarker(new MarkerOptions()
                    .title(getString(R.string.default_info_title))
                    .position(mDefaultLocation)
                    .snippet(getString(R.string.default_info_snippet)));

            // Prompt the user for permission.
            getLocationPermission();
        }
    }
  1. pickCurrentPlace öğesi tanımlandığına göre onOptionsItemSelected() içinde pickCurrentPlace çağrısı yapan satırı bulun ve yorumunu kaldırın.

MapsActivity.java onOptionItemSelected()

           case R.id.action_geolocate:

                // COMMENTED OUT UNTIL WE DEFINE THE METHOD
                // Present the Current Place picker
                pickCurrentPlace();
                return true;

Test etme

Uygulamayı şimdi çalıştırır ve Yer Seçin'e dokunursanız konum izinleri istenir.

  • İzin verirseniz bu tercih kaydedilir ve sizden onay istenmez. İzni reddederseniz düğmeye tekrar dokunduğunuzda size sorulur.
  • getPlaceLikelihoods, olası geçerli yerleri getirmiş olsa da ListView, bunları henüz göstermez. Android Studio'da, yeni yöntemlerinizin düzgün şekilde çalıştığını doğrulamak üzere Logcat'teki günlüklerde MapsActivity etiketli ifadeler olup olmadığını kontrol etmek için ⌘6 simgesini tıklayabilirsiniz.
  • İzin verdiyseniz günlüklerde Latitude: için bir ifade ve cihazın algılanan konumunu gösteren Longitude: için bir ifade var. Emülatör için konum belirtmek amacıyla Google Haritalar'ı ve emülatörün genişletilmiş menüsünü daha önce kullandıysanız bu ifadeler bu konumu gösterir.
  • findCurrentPlace çağrısı başarılı olduysa günlüklerde, en olası beş yerin adını ve konumunu yazdıran beş ifade bulunur.

d9896a245b81bf3.png

12. Mevcut Yer seçiciyi doldurun

Seçili yerler için bir işleyici ayarlama

Kullanıcı ListView öğesindeki bir öğeyi tıkladığında ne olmasını istediğimizi düşünelim. Kullanıcının şu anda bulunduğu yeri seçmesini onaylamak için o yerde haritaya bir işaretçi ekleyebilirsiniz. Kullanıcı bu işaretçiyi tıklarsa yerin adını ve adresini gösteren bir bilgi penceresi açılır.

Bu tıklama işleyicisini pickCurrentPlace yönteminden sonra yapıştırın.

MapsActivity.java listClickedHandler

    private AdapterView.OnItemClickListener listClickedHandler = new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView parent, View v, int position, long id) {
            // position will give us the index of which place was selected in the array
            LatLng markerLatLng = mLikelyPlaceLatLngs[position];
            String markerSnippet = mLikelyPlaceAddresses[position];
            if (mLikelyPlaceAttributions[position] != null) {
                markerSnippet = markerSnippet + "\n" + mLikelyPlaceAttributions[position];
            }

            // Add a marker for the selected place, with an info window
            // showing information about that place.
            mMap.addMarker(new MarkerOptions()
                    .title(mLikelyPlaceNames[position])
                    .position(markerLatLng)
                    .snippet(markerSnippet));

           // Position the map's camera at the location of the marker.
            mMap.moveCamera(CameraUpdateFactory.newLatLng(markerLatLng));
        }
    };

ListView'u doldurma

Artık kullanıcının ziyaret ettiği en olası yerleri içeren listenizi oluşturduktan sonra, ListView içinde bu seçenekleri kullanıcıya sunabilirsiniz. Tanımladığınız tıklama işleyicisini kullanmak için ListView tıklama dinleyicisini de ayarlayabilirsiniz.

Bu yöntemi tıklama işleyiciden sonra yapıştırın:

MapsActivity.java FillPlacesList()

    private void fillPlacesList() {
        // Set up an ArrayAdapter to convert likely places into TextViews to populate the ListView
        ArrayAdapter<String> placesAdapter =
                new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mLikelyPlaceNames);
        lstPlaces.setAdapter(placesAdapter);
        lstPlaces.setOnItemClickListener(listClickedHandler);
    }

fillPlacesList tanımlı olduğuna göre, findPlaceLikelihoods sonuna doğru fillPlacesList çağrısı yapan satırı bulun ve yorumunu kaldırın.

MapsActivity.java FillPlaceLikeliisms()

               // COMMENTED OUT UNTIL WE DEFINE THE METHOD
                // Populate the ListView
                fillPlacesList();

Mevcut Yer seçici için gereken tüm kod bu!

13. Uygulamayı çalıştır

Yer seçmeyi test etme

  1. Uygulamayı tekrar çalıştırın.

Bu sefer Yer Seç'e dokunduğunuzda, uygulama listeyi konuma yakın olan adlandırılmış yerlerle doldurur. Maui'deki bu yerin yakınında Ululani''s Hawaiian Ice ve Sugar Beach Bake Shop gibi mekanlar vardır. Birkaç yer konum koordinatlarına çok yakın olduğundan, bulunabileceğiniz yerlerin bir listesi aşağıda verilmiştir.

  1. ListView içinde bir yer adını tıklayın.

Haritaya bir işaretçi eklenmiştir.

  1. İşaretçiye dokunun.

Yer Ayrıntıları'nı görebilirsiniz.

e52303cc0de6a513.png 864c74342fb52a01.png

Farklı bir konumu test etme

Konumunuzu değiştirmek istiyorsanız ve emülatör kullanıyorsanız emülatörün genişletilmiş menüsündeki konum koordinatlarını güncellediğinizde cihaz konumu otomatik olarak güncellenmez.

Bu sorunu çözmek için yerel Google Haritalar uygulamasını emülatörün konumuna yapılan güncellemeleri zorunlu kılmak için kullanmak üzere şu adımları izleyin:

  1. Google Haritalar'ı açın.
  2. Enlem ve boylamı yeni koordinatlarla değiştirmek için ... > Konum'a, ardından Gönder'e dokunun.
  3. Örneğin, konumu Vancouver, Kanada şehir merkezine ayarlamak için Latitude: 49.2768 ve Longitude: -123.1142'yi kullanabilirsiniz.
  4. Google Haritalar'ın yeni koordinatlarınıza bağlandığını doğrulayın. Yeniden adlandırma isteğinde bulunmak için Google Haritalar uygulamasında Konumum düğmesine dokunmanız gerekebilir.
  5. Mevcut yer uygulamanıza dönün ve haritayı yeni koordinatlar hakkında bilgi almak ve mevcut yerlerin yeni listesini görmek için Yer Seç'e dokunun.

9adb99d1ce25c184.png

Hepsi bu kadar! Mevcut konumdaki yerleri kontrol eden ve hangi konumda olduğunuzu gösteren bir basit uygulama geliştirdiniz. Keyfini çıkarın!

Şimdi bu bonus adımı tamamlamak için yaptığınız değişikliklerin yer aldığı uygulamayı çalıştırın.

14. Sonraki adımlar

API anahtarınızın çalınmasını önlemek için anahtarı yalnızca Android uygulamanızın anahtarı kullanabilmesi için güvenliği sağlamanız gerekir. Kısıtlanmamış bırakılırsa, anahtarınızı bilen herkes Google Haritalar Platformu API'lerini çağırmak ve faturalandırılmanıza neden olmak için bu anahtarı kullanabilir.

SHA-1 sertifikanızı alın

Daha sonra API anahtarlarınızı kısıtladığınızda buna ihtiyacınız vardır. Aşağıda, hata ayıklama sertifikanızı almak için bir dizi talimat sunulmuştur.

Linux veya macOS için bir terminal penceresi açın ve aşağıdakileri girin:

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

Windows Vista ve Windows 7 için aşağıdaki komutu çalıştırın:

keytool -list -v -keystore "%USERPROFILE%\.android\debug.keystore" -alias androiddebugkey -storepass android -keypass android

Aşağıdakine benzer bir çıkış görürsünüz:

Alias name: androiddebugkey
Creation date: Jan 01, 2013
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=Android Debug, O=Android, C=US
Issuer: CN=Android Debug, O=Android, C=US
Serial number: 4aa9b300
Valid from: Mon Jan 01 08:04:04 UTC 2013 until: Mon Jan 01 18:04:04 PST 2033
Certificate fingerprints:
     MD5:  AE:9F:95:D0:A6:86:89:BC:A8:70:BA:34:FF:6A:AC:F9
     SHA1: BB:0D:AC:74:D3:21:E1:43:07:71:9B:62:90:AF:A1:66:6E:44:5D:75
     Signature algorithm name: SHA1withRSA
     Version: 3

SHA1 ile başlayan satır, sertifikanın SHA-1 parmak izini içerir. Parmak izi, iki nokta üst üste ile ayrılmış 20 çift basamaklı onaltılık sayı dizisidir.

Bir uygulamayı yayınlamaya hazır olduğunuzda, sürüm sertifikanızı almak için bu dokümanlardaki talimatları kullanın.

API anahtarınıza kısıtlamalar ekleme

  1. Cloud Console'da API'ler ve Hizmetler > Kimlik Bilgileri bölümüne gidin.

Bu uygulama için kullandığınız anahtar API Anahtarları altında listelenmelidir.

  1. Anahtar ayarlarını düzenlemek için 6454a04865d551e6.png öğesini tıklayın.

316b052c621ee91c.png

  1. API anahtarı sayfasında Anahtar kısıtlamalarından sonra, aşağıdakileri yaparak Uygulama kısıtlamalarını ayarlayın:
  2. Android uygulamaları'nı seçin ve talimatları uygulayın.
  3. Öğe ekle'yi tıklayın.
  4. Paketinizin adını ve SHA-1 sertifikası dijital parmak izini (bir önceki bölümde alınmış) girin.

Örneğin:

com.google.codelab.currentplace
BB:0D:AC:74:D3:21:E1:43:07:71:9B:62:90:AF:A1:66:6E:44:5D:75s
  1. Daha fazla koruma için aşağıdaki işlemleri gerçekleştirerek API kısıtlamalarını belirleyin.
  2. API kısıtlamalarından sonra Anahtarı kısıtla'yı seçin.
  3. Android ve Places API için Haritalar SDK'sını seçin.
  4. Bitti'yi ve Kaydet'i tıklayın.

15. Tebrikler

Geçerli konumda en olası yerleri kontrol eden basit bir uygulama oluşturdunuz ve kullanıcının seçtiği yer için haritaya bir işaretçi ekledi.

Daha fazla bilgi