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 Places SDK na Androida są wycofane 31 marca 2022 r. Wersja 2.6.0 to ostatnia wersja 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:
Jeśli korzystasz obecnie z biblioteki zgodności Miejsc:
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'
Jeśli obecnie używasz pakietu SDK Miejsc na Androida dla Usług Google Play:
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'
Zsynchronizuj projekt Gradle.
Ustaw
minSdkVersion
dla projektu aplikacji na 16 lub wyższą.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
Utwórz aplikację. Jeśli zauważysz błędy kompilacji w związku z konwersją na pakietu SDK Miejsc na Androida, dowiesz się więcej 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 ono 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:
Wywołaj
fetchPlace()
, przekazując obiektFetchPlaceRequest
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();
Wywołaj
addOnSuccessListener()
, aby obsłużyćFetchPlaceResponse
. Jeden Zwracany jestPlace
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:
Zadzwoń pod numer
fetchPlace()
. Pamiętaj, aby dodać parametr PolePHOTO_METADATAS
w żądaniu:List<Place.Field> fields = Arrays.asList(Place.Field.PHOTO_METADATAS);
Pobierz obiekt Place (w tym przykładzie użyto
fetchPlace()
, ale możesz też użyćfindCurrentPlace()
):FetchPlaceRequest placeRequest = FetchPlaceRequest.builder(placeId, fields).build();
Dodaj
OnSuccessListener
, aby pobrać metadane zdjęcia z wynikuPlace
wFetchPlaceResponse
, 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:
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 .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();
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 naAutocomplete
.- Nazwa
PlaceAutocomplete.getPlace
została zmieniona naAutocomplete.getPlaceFromIntent
. - Nazwa
PlaceAutocomplete.getStatus
została zmieniona naAutocomplete.getStatusFromIntent
.
- Nazwa
- Nazwa
PlaceAutocomplete.RESULT_ERROR
została zmieniona naAutocompleteActivity.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:
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" />
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); } });
- Zainicjuj
Użyj intencji do uruchomienia działania autouzupełniania
- Zainicjuj
Places
, przekazując kontekst aplikacji i klucz interfejsu API - Użyj metody
Autocomplete.IntentBuilder
, aby utworzyć intencję, która przekazuje odpowiednią trybPlaceAutocomplete
(pełnoekranowy lub nakładka). Intencja musi wywoływać metodęstartActivityForResult
, przekazując w odpowiedzi kod żądania identyfikujący intencji. - 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 spowoduje: wyświetli się komunikat o błędzie. Nowy pakiet SDK nie obsługuje selektora miejsc.