Migracja do nowego klienta pakietu SDK Miejsc

W tym przewodniku omawiamy zmiany między a nową, samodzielną wersją programu SDK Miejsc na Androida Jeśli zamiast migracji do biblioteki Miejsc Google używasz biblioteki zgodności nową, samodzielną wersję pakietu SDK Miejsc dla systemu Android, w tym przewodniku jak zaktualizować projekty, by używały nowej wersji pakietu SDK Miejsc na Androida.

Jedyny sposób na dostęp do funkcji i poprawek błędów w pakiecie Places SDK na Androida wersji 2.6.0 powyżej wersji 2.6.0 będzie korzystać z pakietu SDK Miejsc dla systemu Android. Google zaleca zaktualizowanie biblioteki zgodności do nowej Jak najszybciej w wersji SDK Miejsc na Androida.

Co się zmieniło?

Oto główne obszary zmian:

  • Rozpowszechniamy nową wersję pakietu Places SDK dla Androida jako statyczną bibliotekę klienta. Przed styczniem 2019 r. pakiet Places SDK na Androida została udostępniona w Usługach Google Play. Od tego czasu witryna Miejsca udostępniliśmy bibliotekę zgodności, aby ułatwić przejście na Pakiet SDK Miejsc na Androida
  • Istnieją zupełnie nowe metody.
  • Maski pól są teraz obsługiwane w przypadku metod zwracających miejsce . Masek pól możesz używać do określania, do jakiego typu danych miejsc mają być .
  • Ulepszyliśmy kody stanu używane do zgłaszania błędów.
  • Autouzupełnianie obsługuje teraz tokeny sesji.
  • Selektor miejsc nie jest już dostępny.

Informacje o bibliotece zgodności Miejsc

W styczniu 2019 r. opublikowaliśmy wersję 1.0 autonomicznego pakietu SDK Miejsc na Androida, Aby ułatwić migrację, udostępniamy bibliotekę zgodności z wycofanej wersji pakietu SDK Miejsc na Androida dla Usług Google Play (com.google.android.gms:play-services-places).

Ta biblioteka zgodności została tymczasowo udostępniona w celu przekierowania i tłumaczenia Wywołania interfejsu API kierowane do nowej, samodzielnej wersji Usług Google Play do czasu, aż programiści będą mogli przenieść swój kod do nowych nazw samodzielnym pakiecie SDK. Dla każdej wersji pakietu Places SDK dla Androida, która została wydana od wersji 1.0 do 2.6.0, Udostępniliśmy bibliotekę zgodności Miejsc, aby zapewnić równoważny funkcji.

Blokowanie i wycofywanie biblioteki zgodności Miejsc

Wszystkie wersje biblioteki zgodności z pakietem SDK Miejsc na Androida są wycofane 31 marca 2022 r. Wersja 2.6.0 to ostatnia wersja programu Biblioteka zgodności Miejsc. Jedyny sposób na dostęp do funkcji i poprawek błędów w Miejscach Google Pakiet SDK na Androida w wersji 2.6.0 będzie korzystać z pakietu SDK Miejsc dla systemu Android.

Google zaleca migrację do pakietu Places SDK dla Androida w celu uzyskania dostępu do nowych funkcji i ważnych poprawek błędów w wersjach nowszych niż 2.6.0. Jeśli obecnie używasz biblioteki zgodności, wykonaj te czynności Zainstaluj pakiet SDK Miejsc na Androida, aby przeprowadzić migrację do pakietu SDK Miejsc na Androida.

Instalowanie biblioteki klienta

Nowa wersja pakietu SDK Miejsc dla Androida jest rozpowszechniana jako statycznej biblioteki klienta.

Użyj Maven, aby dodać makro Miejsca SDK na Androida w projekcie Android Studio:

  1. Jeśli korzystasz obecnie z biblioteki zgodności Miejsc:

    1. Zastąp ten wiersz w sekcji dependencies:

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

      Wiersz tym wierszem służy do przejścia na pakiet SDK Miejsc na Androida:

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

  2. Jeśli obecnie używasz pakietu SDK Miejsc na Androida dla Usług Google Play:

    1. Zastąp ten wiersz w sekcji dependencies:

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

      Wiersz tym wierszem służy do przejścia na pakiet SDK Miejsc na Androida:

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

  3. Zsynchronizuj projekt Gradle.

  4. Ustaw minSdkVersion dla projektu aplikacji na 16 lub wyższą.

  5. Zaktualizuj urządzenie „Technologia Google” zasoby:

    @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. Utwórz aplikację. Jeśli zauważysz błędy kompilacji w związku z konwersją na SDK Miejsc na Androida, informacje znajdziesz w sekcjach poniżej na ich rozwiązanie.

Zainicjuj nowego klienta Places SDK

Zainicjuj nowego klienta Places SDK zgodnie z podanym niżej przykładem:

// 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);

Kody stanu

Zmieniono kod stanu błędów limitu zapytań na sekundę. Błędy limitu zapytań na sekundę są teraz zwrócone przez: PlaceStatusCodes.OVER_QUERY_LIMIT. Nie ma już limitów pytań i odpowiedzi.

Dodano te kody stanu:

  • REQUEST_DENIED – prośba została odrzucona. Możliwe przyczyny:

    • Nie podano klucza interfejsu API.
    • Podano nieprawidłowy klucz interfejsu API.
    • Interfejs Places API nie został włączony w konsoli Google Cloud.
    • Podano klucz interfejsu API z nieprawidłowymi ograniczeniami klucza.
  • INVALID_REQUEST – żądanie jest nieprawidłowe, ponieważ go brakuje lub jest nieprawidłowe. .

  • NOT_FOUND – nie znaleziono wyniku dla danego żądania.

Nowe metody

W nowej wersji pakietu SDK Miejsc na Androida które zostały opracowane z myślą o spójności. Wszystkie nowe metody przestrzegaj tych zasad:

  • W punktach końcowych nie jest już używany czasownik get.
  • Obiekty żądań i odpowiedzi mają taką samą nazwę jak odpowiadające im obiekty .
  • Obiekty żądań mają teraz kreatory; wymagane parametry są przekazywane jako żądanie z parametrami konstruktora.
  • Bufory nie są już używane.

W tej sekcji przedstawiamy nowe metody i pokazujemy, jak działają.

Pobierz miejsce według identyfikatora

Użyj formatu fetchPlace() aby uzyskać szczegółowe informacje o konkretnym miejscu. Funkcja fetchPlace() działa podobnie jak getPlaceById()

Aby pobrać miejsce, wykonaj te czynności:

  1. Wywołaj fetchPlace(), przekazując obiekt FetchPlaceRequest określający miejsce Identyfikator i lista pól określających dane miejsca do zwrócenia.

    // 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. Wywołaj addOnSuccessListener(), aby obsłużyć FetchPlaceResponse. Jeden Zwracany jest Place wynik.

    // 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());
        }
    });
    

Pobierz zdjęcie miejsca

Użyj formatu fetchPhoto() aby pobrać zdjęcie miejsca. fetchPhoto() zwraca zdjęcia miejsca. Wzór uprościliśmy proces wysyłania prośby o zdjęcie. Teraz możesz poprosić o PhotoMetadata bezpośrednio z obiektu Place; oddzielne żądanie nie jest już konieczne. Maksymalna szerokość lub wysokość zdjęć to 1600 pikseli. fetchPhoto() funkcje podobnie jak getPhoto().

Aby pobrać zdjęcia miejsc, wykonaj te czynności:

  1. Zadzwoń pod numer fetchPlace(). Pamiętaj, aby dodać parametr Pole PHOTO_METADATAS w żądaniu:

    List<Place.Field> fields = Arrays.asList(Place.Field.PHOTO_METADATAS);
    
  2. Pobierz obiekt Place (w tym przykładzie użyto fetchPlace(), ale możesz też użyć findCurrentPlace()):

    FetchPlaceRequest placeRequest = FetchPlaceRequest.builder(placeId, fields).build();
    
  3. Dodaj OnSuccessListener, aby pobrać metadane zdjęcia z wyniku Place w FetchPlaceResponse, a następnie użyj wynikowych metadanych zdjęcia do pobierz bitmapę i tekst źródła:

    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());
            }
        });
    });
    

Znalezienie miejsca na podstawie lokalizacji użytkownika

Użyj formatu findCurrentPlace() aby znaleźć bieżącą lokalizację urządzenia użytkownika. findCurrentPlace() zwraca listę wartości PlaceLikelihood wskazujących miejsca, w których urządzenie użytkownika ma największe szanse na zlokalizowanie. Funkcja findCurrentPlace() działa podobnie jak getCurrentPlace()

Aby poznać bieżącą lokalizację urządzenia użytkownika, wykonaj te czynności:

  1. Upewnij się, że aplikacja prosi o uprawnienia ACCESS_FINE_LOCATION i Uprawnienia: ACCESS_WIFI_STATE. Użytkownik musi udzielić zgody na dostęp do swojego bieżącej lokalizacji urządzenia. Zobacz artykuł o prośbach o dostęp do aplikacji Uprawnienia .

  2. Utwórz obiekt FindCurrentPlaceRequest wraz z listą typów danych miejsc do .

      // 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. Wywołaj funkcję findCurrentPlace i przetwórz odpowiedź, sprawdzając najpierw, czy użytkownik zezwolił na korzystanie z lokalizacji urządzenia.

      // 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();
      }
    

Znajdowanie podpowiedzi autouzupełniania

Użyj formatu findAutocompletePredictions() w odpowiedzi na zapytania użytkowników. Funkcja findAutocompletePredictions() działa podobnie jak getAutocompletePredictions()

Ten przykład pokazuje wywołanie funkcji findAutocompletePredictions():

// 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());
   }
});

Tokeny sesji

Tokeny sesji grupują fazy zapytania i wyboru wyszukiwania użytkownika w dyskretną sesję do celów rozliczeniowych. Zalecamy korzystanie z tokenów sesji wszystkich sesji autouzupełniania. Sesja rozpoczyna się, gdy użytkownik zaczyna wpisywać i kończy, gdy użytkownik wybierze miejsce. Każda sesja może mieć wiele a następnie wybór jednego miejsca. Po zakończeniu sesji token straci ważność; aplikacja musi wygenerować nowy token dla każdego .

Maski pola

W metodach zwracających informacje o miejscu musisz określić, jakiego typu które będziesz przesyłać z każdym żądaniem. Dzięki temu będziesz mieć pewność, że wysyłasz tylko żądania (i za które płacisz).

Aby określić typy danych do zwrócenia, przekaż tablicę Place.Field w FetchPlaceRequest zgodnie z poniższym przykładem:

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

Możesz użyć jednego lub kilku z tych pól:

  • 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

Dowiedz się więcej o kodach SKU danych z Miejsc.

Aktualizacje selektora miejsc i autouzupełniania

W tej sekcji opisano zmiany w widżetach Miejsca (selektor miejsc i Autouzupełnianie).

Automatyczne autouzupełnianie

W funkcji autouzupełniania wprowadzono te zmiany:

  • Nazwa PlaceAutocomplete została zmieniona na Autocomplete.
    • Nazwa PlaceAutocomplete.getPlace została zmieniona na Autocomplete.getPlaceFromIntent.
    • Nazwa PlaceAutocomplete.getStatus została zmieniona na Autocomplete.getStatusFromIntent.
  • Nazwa PlaceAutocomplete.RESULT_ERROR została zmieniona na AutocompleteActivity.RESULT_ERROR (obsługa błędów dla fragmentu autouzupełniania NIE uległa zmianie).

Selektor miejsc

Selektor miejsc został wycofany 29 stycznia 2019 r. Wyłączono 29 lipca 2019 r. i nie jest już dostępna. Dalsze korzystanie z tej usługi spowoduje: wyświetli się komunikat o błędzie. Nowy pakiet SDK nie obsługuje selektora miejsc.

Widżety autouzupełniania

Widżety autouzupełniania zostały zaktualizowane:

  • Prefiks Place został usunięty ze wszystkich zajęć.
  • Dodano obsługę tokenów sesji. Widżet zarządza tokenami za Ciebie automatycznie w tle.
  • Dodaliśmy obsługę masek pól, które pozwalają wybrać rodzaj miejsca dane do zwrócenia po dokonaniu wyboru przez użytkownika.

W sekcjach poniżej pokazujemy, jak dodać do projektu widżet autouzupełniania.

Umieszczanie elementu AutocompleteFragment

Aby dodać fragment autouzupełniania, wykonaj te czynności:

  1. Dodaj fragment do układu XML aktywności, jak w przykładzie poniżej przykład.

    <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. Aby dodać widżet autouzupełniania do aktywności, wykonaj te czynności:

    • Zainicjuj Places, przekazując kontekst aplikacji i swój klucz interfejsu API.
    • Zainicjuj interfejs AutocompleteSupportFragment.
    • Wywołaj setPlaceFields(), aby wskazać typy danych o miejscach, których chcesz używać aby dostać.
    • Dodaj PlaceSelectionListener, aby wykonać działanie z wynikiem. naprawiania ewentualnych błędów.

    Poniższy przykład pokazuje dodawanie widżetu autouzupełniania do aktywności:

    /**
     * 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);
        }
    });
    

Użyj intencji do uruchomienia działania autouzupełniania

  1. Zainicjuj Places, przekazując kontekst aplikacji i klucz interfejsu API
  2. Użyj metody Autocomplete.IntentBuilder, aby utworzyć intencję, która przekazuje odpowiednią tryb PlaceAutocomplete (pełnoekranowy lub nakładka). Intencja musi wywoływać metodę startActivityForResult, przekazując w odpowiedzi kod żądania identyfikujący intencji.
  3. Zastąp wywołanie zwrotne onActivityResult, aby otrzymać wybrane miejsce.

Z przykładu poniżej dowiesz się, jak użyć intencji do uruchomienia autouzupełniania, a potem przetwórz wynik:

    /**
     * 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.
            }
        }
    }

Selektor miejsc nie jest już dostępny

Selektor miejsc został wycofany 29 stycznia 2019 r. Wyłączono 29 lipca 2019 r. i nie jest już dostępna. Dalsze korzystanie z tej usługi spowoduje: wyświetli się komunikat o błędzie. Nowy pakiet SDK nie obsługuje selektora miejsc.