Bu codelab hakkında
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.
Ö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.
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.
- Android Studio karşılama ekranında Yapılandır > SDK Yöneticisi'ni tıklayın.
- İ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.
Google Play hizmetleri
SDK yöneticisinden Google Play hizmetlerini de yüklemeniz gerekir.
- 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.
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
- Android Studio karşılama ekranında Yapılandır > AVD Manager'ı tıklayın.
Android Virtual Device Manager iletişim kutusu açılır.
- Aralarından seçim yapabileceğiniz cihazların listesini açmak için Sanal Cihaz Oluştur... seçeneğini tıklayın.
- Play Store sütununda Play
simgesinin bulunduğu bir cihaz seçin ve İleri'yi tıklayın.
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.
- 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.
- Yeni cihazınızın yanındaki Başlat
simgesini tıklayın:
Birkaç dakika sonra emülatör açılır.
Emulator talimatları - Google Play hizmetlerini güncelleme
- Emülatör başladıktan sonra, görüntülenen gezinme çubuğunda ... simgesini tıklayın**.**
Genişletilmiş denetimler iletişim kutusu açılır.
- Menüde Google Play'i tıklayın.
Güncelleme varsa Güncelle'yi tıklayın.
- 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.
- Google Play Hizmetleri'nin son sürümünü edinmek için Güncelle'yi tıklayın.
Hesap kurulumunuzu tamamlamanız ve ödeme seçeneği eklemeniz istenirse Atla'yı tıklayın.
Emülatördeki konumu ayarlama
- 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.
- Başlatmak için simgeyi tıklayın.
Varsayılan harita gösterilir.
- Haritanın sağ alt kısmında, Konumunuz'u tıklayın
.
Telefonun konumu kullanmasına izin vermeniz istenir.
- Genişletilmiş Kontroller menüsünü açmak için ... düğmesini tıklayın.
- Konum sekmesini tıklayın.
- 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.)
- Gönder'i tıklayın. Harita bu konumla güncellenir.
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:
- Google Play hizmetlerini aramak ve açmak için ana ekrandaki arama çubuğunu kullanın.
- Diğer Ayrıntılar'ı tıklayın.
Varsa Güncelle'yi tıklayın.
4. Google Haritalar etkinliğiyle uygulama kabuğu oluşturun
- Android Studio karşılama ekranında Yeni bir Android Studio projesi başlat'ı seçin.
- Telefon ve Tablet sekmesinde Google Haritalar Etkinliği'ni seçin.
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.
- Dil olarak Java'yı, ardından androidx. yapımları kullan*'ı seçin.
Diğer ayarların varsayılanlarını koruyun.
- 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.
- 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.
- Cloud Console'da proje açılır menüsünü tıklayın ve bu codelab için kullanmak istediğiniz projeyi seçin.
- 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.
- 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.
Uygulamanız artık yapılandırılmış durumda.
7. Düzen dosyasını düzenleme
- Proje gezgininizde Android >
app
>res
>layout
içindeactivity_maps.xml
dosyasını açın.
- 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:
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:
Telefonda yalnızca simge gösterilir. Metin, daha fazla alana sahip bir tablette de dahil edilir.
Simgeyi oluşturma
- 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.
- Simge Türü menüsünde İşlem Çubuğu ve Sekme Simgeleri'ni tıklayın.
- Öğenize
ic_geolocate
için ad verin. - Öğe türü olarak Küçük Resim'i seçin**.**
- Küçük Resim'in yanındaki grafiği tıklayın.
Bu işlem, Simge Seç penceresini açar.
- Bir simge seçin.
Niyetinizle ilgili simgeleri bulmak için arama çubuğunu kullanabilirsiniz.
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.
- 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.
Dize kaynağı ekleme
- Proje gezgininde Android > app > res > values öğesini tıklayın ve
strings.xml
dosyasını açın. <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
- Proje gezgininde Android > app'i tıklayın, ardından
res
klasörünü sağ tıklayın veapp/src/main/res
altında yeni bir alt dizin oluşturmak için Yeni > Dizin'i seçin. - Dizini
menu
olarak adlandırın. menu
klasörünü sağ tıklayın ve Yeni > Dosya'yı seçin.- Dosyaya
menu.xml
adını verin. - Şu kodu yapıştırın:
menu.xml
<?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
- Proje gezgininde Android >
app
>res
>values
öğesini genişletin ve içindekistyles.xml
dosyasını açın. <style>
etiketinde, üst mülkü"Theme.AppCompat.NoActionBar"
olacak şekilde düzenleyin.- 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
- Android >
app
>manifests
öğesini tıklayın veAndroidManifest.xml
dosyasını açın. 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
- 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.
- 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
- Android Studio'da Çalıştır veya Çalıştır > Run "uygulama''yı tıklayın.
- 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.
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.
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
- 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);
}
}
- 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.
- 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();
}
}
pickCurrentPlace
öğesi tanımlandığına göreonOptionsItemSelected()
içindepickCurrentPlace
ç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 daListView
, 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österenLongitude:
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.
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
- 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.
ListView
içinde bir yer adını tıklayın.
Haritaya bir işaretçi eklenmiştir.
- İşaretçiye dokunun.
Yer Ayrıntıları'nı görebilirsiniz.
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:
- Google Haritalar'ı açın.
- Enlem ve boylamı yeni koordinatlarla değiştirmek için ... > Konum'a, ardından Gönder'e dokunun.
- Örneğin, konumu Vancouver, Kanada şehir merkezine ayarlamak için Latitude: 49.2768 ve Longitude: -123.1142'yi kullanabilirsiniz.
- 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.
- 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.
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
- 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.
- Anahtar ayarlarını düzenlemek için
öğesini tıklayın.
- API anahtarı sayfasında Anahtar kısıtlamalarından sonra, aşağıdakileri yaparak Uygulama kısıtlamalarını ayarlayın:
- Android uygulamaları'nı seçin ve talimatları uygulayın.
- Öğe ekle'yi tıklayın.
- 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
- Daha fazla koruma için aşağıdaki işlemleri gerçekleştirerek API kısıtlamalarını belirleyin.
- API kısıtlamalarından sonra Anahtarı kısıtla'yı seçin.
- Android ve Places API için Haritalar SDK'sını seçin.
- 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
- Geliştirmenizi hızlandırmak için Android Yardımcı Program Kitaplığı Haritalar SDK'sından yararlanın. Bu yardımcı programlar, Google Haritalar Platformu'nu kullanan uygulamalar için en popüler görevlerden bazılarını yoğunlaştırır.
- Android için Google Haritalar Platformu SDK'larının çoğu özelliğini gösteren daha fazla kod örneğinde Android örnekleri için Haritalar SDK'sı ve Android demoları için Yerler SDK'sı ifadelerinin klonlanması gerekir.
- Android Q'da üç eyaletli konum izinlerini nasıl kullanacağınızı öğrenmek için Kotlin ile Android'de konum güncellemelerini alma codelab'ini tamamlayın.