Yeni Yerler SDK İstemcisine Taşıma

Bu kılavuzda, Yerler ile Google Haritalar arasındaki uyumluluk kitaplığını ve yeni bağımsız sürümünün Android için Yerler SDK'sı. Android için Yerler SDK'sının yeni bağımsız sürümünü kullanarak, bu kılavuzda Android için Yerler SDK'sının yeni sürümünü kullanmak üzere projelerinizi nasıl güncelleyeceğinizi öğrenin.

Android için Yerler SDK'sındaki özelliklere ve hata düzeltmelerine erişmenin tek yolu yukarıdaki Sürüm 2.6.0'dan sonraki sürümler Android için Yerler SDK'sını kullanacaktır. Google, uyumluluk kitaplığından yeni En kısa zamanda Android için Yerler SDK'sını yükleyin.

Neler değişti?

Değişimin yaşandığı başlıca alanlar aşağıdaki gibidir:

  • Android için Yerler SDK'sının yeni sürümü dağıtıldı kitaplığını otomatik olarak ekler. Ocak 2019'dan önce Android için Yerler SDK'sı Google Play Hizmetleri üzerinden kullanıma sunuldu. O zamandan beri, Rehber uyumluluk kitaplığı ile birlikte yeni ve iOS mobil uygulama Android için Yerler SDK'sı.
  • Yepyeni yöntemler mevcuttur.
  • Alan maskeleri, bolca fırsat sunuyor. Kullanılacak yer verisi türlerini belirtmek için alan maskelerini kullanabilirsiniz. dön.
  • Hataları bildirmek için kullanılan durum kodları iyileştirildi.
  • Otomatik tamamlama artık oturum jetonlarını destekliyor.
  • Yer Seçici artık kullanılamıyor.

Rehber uyumluluk kitaplığı hakkında

Ocak 2019'da Android için bağımsız Yerler SDK'sının 1.0 sürümünün yayınlanmasıyla birlikte Google, taşıma işlemine yardımcı olmak için bir uyumluluk kitaplığı sağladı Android için Yerler SDK'sının kullanımdan kaldırılmış Google Play Hizmetleri sürümünden (com.google.android.gms:play-services-places).

Bu uyumluluk kitaplığı, yönlendirme ve çeviri için geçici olarak sağlanmıştır Yeni bağımsız sürüme Google Play Hizmetleri sürümünü hedefleyen API çağrıları kullanmak için kendi kodlarını taşıyabilene kadar son sürümü bağımsız SDK'dır. Android için Yerler SDK'sının Google Analytics 4'e karşılık gelen sürüm 1.0 ile Sürüm 2.6.0 arasında kullanıma sunulduğu andan itibaren Google Rehber uyumluluk kitaplığının işlevi görür.

Yerler uyumluluk kitaplığını dondurma ve kullanımdan kaldırma

Android için Yerler SDK'sına ilişkin uyumluluk kitaplığının tüm sürümleri 31 Mart 2022 itibarıyla kullanımdan kaldırılmıştır. Sürüm 2.6.0, Yer uyumluluk kitaplığı. Rehber'deki özelliklere ve hata düzeltmelerine erişmenin tek yolu Android için Sürüm 2.6.0'dan sonraki SDK, Android için Yerler SDK'sını kullanacaktır.

Google, Android için Yerler SDK'sına geçmenizi önerir 'ni ziyaret edin. Şu anda uyumluluk kitaplığını kullanıyorsanız aşağıdaki sayfada Taşıma işleminde Android için Yerler SDK'sını yükleme bölümünü yükleme Android için Yerler SDK'sına.

İstemci kitaplığını yükleme

Android için Yerler SDK'sının yeni sürümü statik istemci kitaplığıdır.

Maven'i kullanarak Android Studio projenize Android için Yerler SDK'sı:

  1. Şu anda Rehber uyumluluk kitaplığını kullanıyorsanız:

    1. dependencies bölümünde aşağıdaki satırı değiştirin:

          implementation 'com.google.android.libraries.places:places-compat:X.Y.Z'

      Bu satırı kullanarak Android için Yerler SDK'sına geçiş yapın:

          implementation 'com.google.android.libraries.places:places:3.3.0'

  2. Şu anda Android için Yerler SDK'sının Play Hizmetleri sürümünü kullanıyorsanız:

    1. dependencies bölümünde aşağıdaki satırı değiştirin:

          implementation 'com.google.android.gms:play-services-places:X.Y.Z'

      Bu satırı kullanarak Android için Yerler SDK'sına geçiş yapın:

          implementation 'com.google.android.libraries.places:places:3.3.0'

  3. Gradle projenizi senkronize edin.

  4. Uygulama projenizin minSdkVersion değerini 16 veya daha yüksek bir değere ayarlayın.

  5. "Google Tarafından Desteklenmektedir" öğeler:

    @drawable/powered_by_google_light // OLD
    @drawable/places_powered_by_google_light // NEW
    @drawable/powered_by_google_dark // OLD
    @drawable/places_powered_by_google_dark // NEW
    
  6. Uygulamanızı oluşturun. Android için Yerler SDK'sı hakkında bilgi edinmek için aşağıdaki bölümlere bakın anlatacağım.

Yeni Yerler SDK'sı istemcisini başlatma

Aşağıdaki örnekte gösterildiği gibi yeni Yerler SDK'sı istemcisini başlatın:

// Add an import statement for the client library.
import com.google.android.libraries.places.api.Places;

...

// Initialize Places.
Places.initialize(getApplicationContext(), apiKey);

// Create a new Places client instance.
PlacesClient placesClient = Places.createClient(this);

Durum kodları

QPS sınırı hatalarının durum kodu değişti. QPS sınırı hataları şimdi PlaceStatusCodes.OVER_QUERY_LIMIT üzerinden iade edildi. Artık QPD sınırı yok.

Aşağıdaki durum kodları eklendi:

  • REQUEST_DENIED - İstek reddedildi. Bunun olası nedenleri şunlardır:

    • API anahtarı belirtilmedi.
    • Geçersiz bir API anahtarı girildi.
    • Places API, Cloud konsolunda etkinleştirilmedi.
    • Sağlanan anahtar kısıtlamaları yanlış olan bir API anahtarı.
  • INVALID_REQUEST: İstek, eksik veya geçersiz olduğundan dolayı geçersiz bağımsız değişkeninin önüne geçer.

  • NOT_FOUND — Belirtilen istek için sonuç bulunamadı.

Yeni yöntemler

Android için Yerler SDK'sının yeni sürümünde yepyeni özellikler bu yöntemi kullanabilirsiniz. Tüm yeni yöntemler şu kurallara uyun:

  • Uç noktalar artık get fiilini kullanmıyor.
  • İstek ve yanıt nesneleri, bunlara karşılık gelen istemci yöntemidir.
  • İstek nesnelerinin artık derleyicileri var; gerekli parametreler istek olarak iletilir oluşturucu parametrelerini içerir.
  • Arabellekler artık kullanılmıyor.

Bu bölümde yeni yöntemler tanıtılmakta ve bunların nasıl çalıştığı gösterilmektedir.

Kimliğe göre bir yer getir

fetchPlace() kullanın belirli bir yer hakkındaki ayrıntıları almak için. fetchPlace() işlevi şuna benzer: getPlaceById()

Bir yeri getirmek için şu adımları uygulayın:

  1. Bir Yer belirten FetchPlaceRequest nesnesi ileterek fetchPlace() çağrısı yapın Döndürülecek yer verilerini belirten kimlik ve alanların listesi.

    // Define a Place ID.
    String placeId = "INSERT_PLACE_ID_HERE";
    
    // Specify the fields to return.
    List<Place.Field> placeFields = Arrays.asList(Place.Field.ID, Place.Field.NAME);
    
    // Construct a request object, passing the place ID and fields array.
    FetchPlaceRequest request = FetchPlaceRequest.builder(placeId, placeFields)
            .build();
    
    
  2. FetchPlaceResponse için addOnSuccessListener() numaralı telefonu arayın. Tek Place sonucu döndürülür.

    // Add a listener to handle the response.
    placesClient.fetchPlace(request).addOnSuccessListener((response) -> {
      Place place = response.getPlace();
      Log.i(TAG, "Place found: " + place.getName());
    }).addOnFailureListener((exception) -> {
        if (exception instanceof ApiException) {
            ApiException apiException = (ApiException) exception;
            int statusCode = apiException.getStatusCode();
            // Handle error with given status code.
            Log.e(TAG, "Place not found: " + exception.getMessage());
        }
    });
    

Bir yerin fotoğrafını getir

fetchPhoto() kullanın bir yerin fotoğrafını çekin. fetchPhoto(), bir yere ait fotoğrafları döndürür. Desen fotoğraf isteme işlemi basitleştirildi. Artık PhotoMetadata isteyebilirsiniz doğrudan Place nesnesinden; ayrı bir istekte bulunmanıza gerek yoktur. Fotoğrafların genişliği veya yüksekliği maksimum 1.600 piksel olabilir. fetchPhoto() işlev getPhoto() ile benzerdir.

Yer fotoğraflarını getirmek için şu adımları uygulayın:

  1. fetchPlace() için arama ayarlayın. Açıklama kısmına İsteğinizdeki PHOTO_METADATAS alanı:

    List<Place.Field> fields = Arrays.asList(Place.Field.PHOTO_METADATAS);
    
  2. Bir Yer nesnesi alın (bu örnekte fetchPlace() kullanılmaktadır, ancak findCurrentPlace()):

    FetchPlaceRequest placeRequest = FetchPlaceRequest.builder(placeId, fields).build();
    
  3. Sonuçtan fotoğraf meta verilerini almak için bir OnSuccessListener ekleyin Place, ardından FetchPlaceResponse içinde oluşturulan fotoğraf meta verilerini kullanarak bit eşlem ve atıf metni alın:

    placesClient.fetchPlace(placeRequest).addOnSuccessListener((response) -> {
        Place place = response.getPlace();
    
        // Get the photo metadata.
        PhotoMetadata photoMetadata = place.getPhotoMetadatas().get(0);
    
        // Get the attribution text.
        String attributions = photoMetadata.getAttributions();
    
        // Create a FetchPhotoRequest.
        FetchPhotoRequest photoRequest = FetchPhotoRequest.builder(photoMetadata)
                .setMaxWidth(500) // Optional.
                .setMaxHeight(300) // Optional.
                .build();
        placesClient.fetchPhoto(photoRequest).addOnSuccessListener((fetchPhotoResponse) -> {
            Bitmap bitmap = fetchPhotoResponse.getBitmap();
            imageView.setImageBitmap(bitmap);
        }).addOnFailureListener((exception) -> {
            if (exception instanceof ApiException) {
                ApiException apiException = (ApiException) exception;
                int statusCode = apiException.getStatusCode();
                // Handle error with given status code.
                Log.e(TAG, "Place not found: " + exception.getMessage());
            }
        });
    });
    

Kullanıcının konumundan bir yeri bulma

findCurrentPlace() kullanın kullanıcının cihazının geçerli konumunu bulabilirsiniz. findCurrentPlace(). kullanıcının cihazının bulunduğu yerleri belirten bir PlaceLikelihood listesi döndürür. konum bulma olasılığı en yüksek olandır. findCurrentPlace() işlevi şuna benzer: getCurrentPlace().

Kullanıcının cihazının geçerli konumunu almak için aşağıdaki adımları uygulayın:

  1. Uygulamanızın ACCESS_FINE_LOCATION ve ACCESS_WIFI_STATE izin. Kullanıcının cihaz konumuna gidin. Uygulama İsteğinde Bulunma bölümüne göz atın İzinler: bolca fırsat sunuyor.

  2. Oluşturulacak yer verisi türlerinin listesi de dahil olmak üzere bir FindCurrentPlaceRequest oluşturun: dön.

      // Use fields to define the data types to return.
      List<Place.Field> placeFields = Arrays.asList(Place.Field.NAME);
    
      // Use the builder to create a FindCurrentPlaceRequest.
      FindCurrentPlaceRequest request =
              FindCurrentPlaceRequest.builder(placeFields).build();
    
  3. findCurrentPlace'i çağırın ve yanıtı işleyerek öncelikle kullanıcı, cihazının konumunu kullanma izni verdi.

      // Call findCurrentPlace and handle the response (first check that the user has granted permission).
      if (ContextCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
          placesClient.findCurrentPlace(request).addOnSuccessListener(((response) -> {
              for (PlaceLikelihood placeLikelihood : response.getPlaceLikelihoods()) {
                  Log.i(TAG, String.format("Place '%s' has likelihood: %f",
                          placeLikelihood.getPlace().getName(),
                          placeLikelihood.getLikelihood()));
                  textView.append(String.format("Place '%s' has likelihood: %f\n",
                          placeLikelihood.getPlace().getName(),
                          placeLikelihood.getLikelihood()));
              }
          })).addOnFailureListener((exception) -> {
              if (exception instanceof ApiException) {
                  ApiException apiException = (ApiException) exception;
                  Log.e(TAG, "Place not found: " + apiException.getStatusCode());
              }
          });
      } else {
          // A local method to request required permissions;
          // See https://developer.android.com/training/permissions/requesting
          getLocationPermission();
      }
    

Otomatik tamamlama tahminlerini bulma

findAutocompletePredictions() kullanın kullanıcı arama sorgularına yanıt olarak yer tahminleri döndürecek. findAutocompletePredictions() işlevi şuna benzer: getAutocompletePredictions().

Aşağıdaki örnekte findAutocompletePredictions() işlevinin çağrılması gösterilmektedir:

// Create a new token for the autocomplete session. Pass this to FindAutocompletePredictionsRequest,
// and once again when the user makes a selection (for example when calling fetchPlace()).
AutocompleteSessionToken token = AutocompleteSessionToken.newInstance();
// Create a RectangularBounds object.
RectangularBounds bounds = RectangularBounds.newInstance(
  new LatLng(-33.880490, 151.184363),
  new LatLng(-33.858754, 151.229596));
// Use the builder to create a FindAutocompletePredictionsRequest.
FindAutocompletePredictionsRequest request = FindAutocompletePredictionsRequest.builder()
// Call either setLocationBias() OR setLocationRestriction().
   .setLocationBias(bounds)
   //.setLocationRestriction(bounds)
   .setCountry("au")
   .setTypesFilter(Arrays.asList(PlaceTypes.ADDRESS))
   .setSessionToken(token)
   .setQuery(query)
   .build();

placesClient.findAutocompletePredictions(request).addOnSuccessListener((response) -> {
   for (AutocompletePrediction prediction : response.getAutocompletePredictions()) {
       Log.i(TAG, prediction.getPlaceId());
       Log.i(TAG, prediction.getPrimaryText(null).toString());
   }
}).addOnFailureListener((exception) -> {
   if (exception instanceof ApiException) {
       ApiException apiException = (ApiException) exception;
       Log.e(TAG, "Place not found: " + apiException.getStatusCode());
   }
});

Oturum jetonları

Oturum jetonları, bir kullanıcı aramasının sorgu ve seçim aşamalarını ayrı ayrı oturum açmanız gerekebilir. Şunun için oturum jetonlarının kullanılmasını öneririz: tüm otomatik tamamlama oturumlarını kullanabilirsiniz. Oturum, kullanıcı bir belirler ve bir yer seçtiğinde sona erer. Her oturumda birden fazla ve ardından tek bir yer seçimi bulunur. Oturum sona erdiğinde, jeton artık geçerli değil; her puan için yeni bir jeton oluşturması gerekir. kabul edilir.

Alan maskeleri

Yer ayrıntılarını döndüren yöntemlerde, ne tür bir yer vereceğinizi her istekle birlikte döndürülecek verileri belirler. Bu sayede, yalnızca tek bir kod ve bunlar için ödeme yaparsınız.

Döndürülecek veri türlerini belirtmek içinPlace.Field FetchPlaceRequest, aşağıdaki örnekte gösterildiği gibi:

// Include address, ID, and phone number.
List<Place.Field> placeFields = Arrays.asList(Place.Field.ADDRESS,
                                              Place.Field.ID,
                                              Place.Field.PHONE_NUMBER);

Aşağıdaki alanlardan birini veya daha fazlasını kullanabilirsiniz:

  • Place.Field.ADDRESS
  • Place.Field.ID
  • Place.Field.LAT_LNG
  • Place.Field.NAME
  • Place.Field.OPENING_HOURS
  • Place.Field.PHONE_NUMBER
  • Place.Field.PHOTO_METADATAS
  • Place.Field.PLUS_CODE
  • Place.Field.PRICE_LEVEL
  • Place.Field.RATING
  • Place.Field.TYPES
  • Place.Field.USER_RATINGS_TOTAL
  • Place.Field.VIEWPORT
  • Place.Field.WEBSITE_URI

Yerler Veri SKU'ları hakkında daha fazla bilgi edinin.

Yer Seçici ve Otomatik Tamamlama güncellemeleri

Bu bölümde, Yerler widget'larında (Yer Seçici ve Otomatik tamamlama).

Programatik otomatik tamamlama

Otomatik tamamlama özelliğinde aşağıdaki değişiklikler yapıldı:

  • PlaceAutocomplete, Autocomplete olarak yeniden adlandırıldı.
    • PlaceAutocomplete.getPlace, Autocomplete.getPlaceFromIntent olarak yeniden adlandırıldı.
    • PlaceAutocomplete.getStatus, Autocomplete.getStatusFromIntent olarak yeniden adlandırıldı.
  • PlaceAutocomplete.RESULT_ERROR, AutocompleteActivity.RESULT_ERROR olarak yeniden adlandırıldı (otomatik tamamlama parçası için hata işleme DEĞİŞTİRİLMEDİ).

Yer Seçici

Yer Seçici 29 Ocak 2019'da kullanımdan kaldırıldı. Kapatıldı 29 Temmuz 2019 tarihinde yapılacak ve artık kullanılamamaktadır. Sürekli kullanıldığında şunlar elde edilir: bir hata mesajı görebilirsiniz. Yeni SDK, Yer Seçici'yi desteklemiyor.

Otomatik tamamlama widget'ları

Otomatik tamamlama widget'ları güncellendi:

  • Place öneki tüm sınıflardan kaldırıldı.
  • Oturum jetonları için destek eklendi. Widget, jetonları sizin için yönetir otomatik olarak arka planda çalışır.
  • Ne tür yer türlerini seçmenize olanak tanıyan alan maskeleri için destek eklendi Kullanıcı bir seçim yaptıktan sonra döndürülecek verileri de içerir.

Aşağıdaki bölümlerde, projenize otomatik tamamlama widget'ının nasıl ekleneceği gösterilmektedir.

AutocompleteFragment yerleştirme

Otomatik tamamlama parçası eklemek için aşağıdaki adımları uygulayın:

  1. Aşağıda gösterildiği gibi, etkinliğinizin XML düzenine bir parça ekleyin örneğine bakalım.

    <fragment
      android:id="@+id/autocomplete_fragment"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:name=
    "com.google.android.libraries.places.widget.AutocompleteSupportFragment"
      />
    
  2. Otomatik tamamlama widget'ını etkinliğe eklemek için aşağıdaki adımları uygulayın:

    • Uygulama bağlamını ve API anahtarınızı ileterek Places uygulamasını başlatın.
    • AutocompleteSupportFragment uygulamasını başlatın.
    • İstediğiniz yer verisi türlerini belirtmek için setPlaceFields() numarasını arayın daha fazla bilgi edinebilirsiniz.
    • Sonuçla ilgili işlem yapmak için bir PlaceSelectionListener ve ve oluşabilecek hataları düzeltme.

    Aşağıdaki örnekte bir etkinliğe otomatik tamamlama widget'ının eklenmesi gösterilmektedir:

    /**
     * Initialize Places. For simplicity, the API key is hard-coded. In a production
     * environment we recommend using a secure mechanism to manage API keys.
     */
    if (!Places.isInitialized()) {
        Places.initialize(getApplicationContext(), "YOUR_API_KEY");
    }
    
    // Initialize the AutocompleteSupportFragment.
    AutocompleteSupportFragment autocompleteFragment = (AutocompleteSupportFragment)
            getSupportFragmentManager().findFragmentById(R.id.autocomplete_fragment);
    
    autocompleteFragment.setPlaceFields(Arrays.asList(Place.Field.ID, Place.Field.NAME));
    
    autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() {
        @Override
        public void onPlaceSelected(Place place) {
            // TODO: Get info about the selected place.
            Log.i(TAG, "Place: " + place.getName() + ", " + place.getId());
        }
    
        @Override
        public void onError(Status status) {
            // TODO: Handle the error.
            Log.i(TAG, "An error occurred: " + status);
        }
    });
    

Otomatik tamamlama etkinliğini başlatmak için bir intent kullan

  1. Uygulama bağlamını ve API anahtarınızı ileterek Places uygulamasını başlatın
  2. İstenen isteği ileterek bir intent oluşturmak için Autocomplete.IntentBuilder kullanın PlaceAutocomplete modu (tam ekran veya yer paylaşımlı). Amaç şunu çağırmalıdır: startActivityForResult, isteyebilirsiniz.
  3. Seçilen yeri almak için onActivityResult geri çağırmasını geçersiz kılın.

Aşağıdaki örnekte, otomatik tamamlamayı başlatmak için intent'in nasıl kullanılacağı gösterilmektedir. ve sonucu işle:

    /**
     * Initialize Places. For simplicity, the API key is hard-coded. In a production
     * environment we recommend using a secure mechanism to manage API keys.
     */
    if (!Places.isInitialized()) {
        Places.initialize(getApplicationContext(), "YOUR_API_KEY");
    }

    ...

    // Set the fields to specify which types of place data to return.
    List<Place.Field> fields = Arrays.asList(Place.Field.ID, Place.Field.NAME);

    // Start the autocomplete intent.
    Intent intent = new Autocomplete.IntentBuilder(
            AutocompleteActivityMode.FULLSCREEN, fields)
            .build(this);
    startActivityForResult(intent, AUTOCOMPLETE_REQUEST_CODE);

    ...

    /**
     * Override the activity's onActivityResult(), check the request code, and
     * do something with the returned place data (in this example its place name and place ID).
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == AUTOCOMPLETE_REQUEST_CODE) {
            if (resultCode == RESULT_OK) {
                Place place = Autocomplete.getPlaceFromIntent(data);
                Log.i(TAG, "Place: " + place.getName() + ", " + place.getId());
            } else if (resultCode == AutocompleteActivity.RESULT_ERROR) {
                // TODO: Handle the error.
                Status status = Autocomplete.getStatusFromIntent(data);
                Log.i(TAG, status.getStatusMessage());
            } else if (resultCode == RESULT_CANCELED) {
                // The user canceled the operation.
            }
        }
    }

Yer Seçici artık kullanılamıyor

Yer Seçici 29 Ocak 2019'da kullanımdan kaldırıldı. Kapatıldı 29 Temmuz 2019 tarihinde yapılacak ve artık kullanılamamaktadır. Sürekli kullanıldığında şunlar elde edilir: bir hata mesajı görebilirsiniz. Yeni SDK, Yer Seçici'yi desteklemiyor.