Aktualne miejsce

Wybierz platformę: Android iOS

Za pomocą pakietu SDK Places na Androida możesz znaleźć miejsce w aktualnie zgłaszanej lokalizacji urządzenia. Mogą to być na przykład lokalne firmy, ciekawe miejsca i lokalizacje geograficzne.

Uprawnienia

Aby korzystać z biblioteki, nie musisz deklarować żadnych dodatkowych uprawnień w pliku manifestu aplikacji, ponieważ biblioteka deklaruje wszystkie używane przez nią uprawnienia w swoim manifeście. Jeśli jednak Twoja aplikacja używa PlacesClient.findCurrentPlace(), musisz poprosić o dostęp do lokalizacji w czasie działania.

Jeśli aplikacja nie korzysta z PlacesClient.findCurrentPlace(), wyraźnie usuń uprawnienia ACCESS_FINE_LOCATION i ACCESS_COARSE_LOCATION wprowadzone przez bibliotekę, dodając do pliku manifestu te dane:

<manifest ... xmlns:tools="http://schemas.android.com/tools">
    ...
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" tools:node="remove"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" tools:node="remove"/>
    ...
</manifest>

Dowiedz się więcej o uprawnieniach i rozważ użycie na początek Łatwego dostępu.

Pobierz bieżącą lokalizację

Aby znaleźć firmę lokalną lub inne miejsce, w którym znajduje się obecnie urządzenie, wykonaj te czynności:

  1. Wywołaj ContextCompat.checkSelfPermission, aby sprawdzić, czy użytkownik zezwolił na dostęp do lokalizacji swojego urządzenia. Aplikacja musi też zawierać kod monitujący o zgodę użytkownika i obsługę wyniku. Więcej informacji znajdziesz w sekcji Uzyskiwanie uprawnień aplikacji.
  2. Utwórz FindCurrentPlaceRequest, który przekazuje List o wartości Place.Field s, określając typy danych miejsc, o które powinna prosić aplikacja.
  3. Wywołaj PlacesClient.findCurrentPlace(), przekazując wartość FindCurrentPlaceRequest utworzoną w poprzednim kroku.
  4. Pobierz listę PlaceLikelihood z komponentu FindCurrentPlaceResponse.

Pola odpowiadają wynikom wyszukiwania miejsc i są podzielone na 3 kategorie rozliczeń: Podstawowe, Kontakt i Atmosfera. Pola podstawowe są rozliczane według stawki podstawowej i nie powodują naliczenia żadnych dodatkowych opłat. Pola Kontakt i Atmosfera są rozliczane według wyższej stawki. Więcej informacji o naliczaniu opłat za żądania dotyczące danych miejsc znajdziesz w artykule Korzystanie i płatności.

Interfejs API zwraca FindCurrentPlaceResponse w Task. FindCurrentPlaceResponse zawiera listę obiektów PlaceLikelihood reprezentujących miejsca, w których prawdopodobnie znajduje się urządzenie. W przypadku każdego miejsca wynik zawiera wskaźnik prawdopodobieństwa, że dane miejsce jest właściwe. Jeśli nie ma znanego miejsca odpowiadającego danej lokalizacji urządzenia, lista może być pusta.

Możesz wywołać PlaceLikelihood.getPlace(), aby pobrać obiekt Place, lub PlaceLikelihood.getLikelihood(), aby uzyskać ocenę prawdopodobieństwa dla danego miejsca. Wyższa wartość oznacza większe prawdopodobieństwo, że dane miejsce jest najlepiej dopasowane.

Poniższy przykładowy kod pobiera listę miejsc, w których urządzenie prawdopodobnie się znajdzie, oraz zapisuje nazwę i prawdopodobieństwo dla każdego miejsca.

Kotlin



// Use fields to define the data types to return.
val placeFields: List<Place.Field> = listOf(Place.Field.NAME)

// Use the builder to create a FindCurrentPlaceRequest.
val request: FindCurrentPlaceRequest = FindCurrentPlaceRequest.newInstance(placeFields)

// Call findCurrentPlace and handle the response (first check that the user has granted permission).
if (ContextCompat.checkSelfPermission(this, permission.ACCESS_FINE_LOCATION) ==
    PackageManager.PERMISSION_GRANTED) {

    val placeResponse = placesClient.findCurrentPlace(request)
    placeResponse.addOnCompleteListener { task ->
        if (task.isSuccessful) {
            val response = task.result
            for (placeLikelihood: PlaceLikelihood in response?.placeLikelihoods ?: emptyList()) {
                Log.i(
                    TAG,
                    "Place '${placeLikelihood.place.name}' has likelihood: ${placeLikelihood.likelihood}"
                )
            }
        } else {
            val exception = task.exception
            if (exception is ApiException) {
                Log.e(TAG, "Place not found: ${exception.statusCode}")
            }
        }
    }
} else {
    // A local method to request required permissions;
    // See https://developer.android.com/training/permissions/requesting
    getLocationPermission()
}

      

Java


// Use fields to define the data types to return.
List<Place.Field> placeFields = Collections.singletonList(Place.Field.NAME);

// Use the builder to create a FindCurrentPlaceRequest.
FindCurrentPlaceRequest request = FindCurrentPlaceRequest.newInstance(placeFields);

// Call findCurrentPlace and handle the response (first check that the user has granted permission).
if (ContextCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
    Task<FindCurrentPlaceResponse> placeResponse = placesClient.findCurrentPlace(request);
    placeResponse.addOnCompleteListener(task -> {
        if (task.isSuccessful()){
            FindCurrentPlaceResponse response = task.getResult();
            for (PlaceLikelihood placeLikelihood : response.getPlaceLikelihoods()) {
                Log.i(TAG, String.format("Place '%s' has likelihood: %f",
                    placeLikelihood.getPlace().getName(),
                    placeLikelihood.getLikelihood()));
            }
        } else {
            Exception exception = task.getException();
            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();
}

      

Uwagi na temat wartości prawdopodobieństwa:

  • Prawdopodobieństwo określa względne prawdopodobieństwo, że dane miejsce jest najlepszym dopasowaniem na liście zwróconych miejsc w przypadku danego żądania. Nie możesz porównywać prawdopodobieństwa w przypadku różnych żądań.
  • Wartość prawdopodobieństwa mieści się w zakresie od 0,0 do 1,0.

Aby na przykład przedstawić 55% prawdopodobieństwa, że poprawnym miejscem jest miejsce A, a 35%, że jest to miejsce B, odpowiedź ma 2 członków: miejsce A z prawdopodobieństwem 0,55 i miejsce B z prawdopodobieństwem 0,35.

Wyświetlaj atrybucje w swojej aplikacji

Jeśli aplikacja wyświetla informacje uzyskane z PlacesClient.findCurrentPlace(), musi też wyświetlać atrybucje. Zapoznaj się z dokumentacją dotyczącą atrybucji.