Aktualne miejsce

Wybierz platformę: Android iOS

Za pomocą pakietu Places SDK na Androida możesz znaleźć miejsce w zgłoszonej obecnie lokalizacji urządzenia. Przykłady miejsc to firmy działające lokalnie, ciekawe miejsca lub lokalizacje geograficzne.

Uprawnienia

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

Jeśli Twoja aplikacja nie używa PlacesClient.findCurrentPlace(), bezpośrednio usuń uprawnienia ACCESS_FINE_LOCATION i ACCESS_COARSE_LOCATION wprowadzone przez bibliotekę, dodając do pliku manifestu ten tekst:

<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>

Przeczytaj więcej o uprawnieniach i rozważ użycie EasyPermissions, aby rozpocząć.

Pobierz bieżącą lokalizację

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

  1. Wywołaj ContextCompat.checkSelfPermission, aby sprawdzić, czy użytkownik udzielił zgody na dostęp do lokalizacji swojego urządzenia. Aplikacja musi też zawierać kod, który prosi użytkownika o zgodę i obsługuje wynik. Więcej informacji znajdziesz w artykule o wysyłaniu próśb o uprawnienia aplikacji.
  2. Utwórz FindCurrentPlaceRequest, przekazując List o wartości Place.Field, określając typy danych o miejscach, których ma żądać aplikacja.
  3. Wywołaj PlacesClient.findCurrentPlace(), przekazując FindCurrentPlaceRequest utworzoną w poprzednim kroku.
  4. Pobierz listę elementów PlaceLikelihood z: FindCurrentPlaceResponse.

Pola odpowiadają wynikom wyszukiwania miejsc i są podzielone na 3 kategorie płatności: Podstawowe, Kontakt i Atmosfera. Pola podstawowe są rozliczane według stawki podstawowej i nie powodują naliczania dodatkowych opłat. Za pola Kontakt i Atmosfera opłaty są naliczane według wyższej stawki. Więcej informacji o opłatach za żądania danych dotyczących miejsc znajdziesz w artykule Korzystanie z danych i rozliczenia.

Interfejs API zwraca FindCurrentPlaceResponse w Task. FindCurrentPlaceResponse zawiera listę obiektów PlaceLikelihood reprezentujących miejsca, w których prawdopodobnie znajdzie się urządzenie. W przypadku każdego miejsca wynik wskazuje na prawdopodobieństwo, że dane miejsce jest właściwe. Jeśli nie istnieje znane miejsce odpowiadające 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 miejsca. Wyższa wartość oznacza większe prawdopodobieństwo, że dane miejsce jest najlepiej dopasowane.

Poniższa próbka kodu pobiera listę miejsc, w których najprawdopodobniej zostanie umieszczone urządzenie, oraz rejestruje 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 dotyczące wartości prawdopodobieństwa:

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

Aby na przykład przedstawić 55-procentowe prawdopodobieństwo, że prawidłowe miejsce będzie miejscem A, a 35%, że będzie 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świetl atrybucję w swojej aplikacji

Gdy aplikacja wyświetla informacje uzyskane z narzędzia PlacesClient.findCurrentPlace(), musi też wyświetlać informacje o atrybucji. Zobacz dokumentację na temat atrybucji.