Aktualne miejsce

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.
Wybierz platformę: Android iOS

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

Uprawnienia

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

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

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

Aby rozpocząć, dowiedz się więcej o uprawnieniach i rozważ użycie EasyEasy.

Pobierz bieżącą lokalizację

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

  1. Wywołaj ContextCompat.checkSelfPermission, aby sprawdzić, czy użytkownik udzielił dostępu do lokalizacji urządzenia. Aplikacja musi też zawierać kod, który pyta użytkownika o zgodę i obsługuje wynik. Więcej informacji znajdziesz w sekcji Prośba o uprawnienia aplikacji.
  2. Utwórz FindCurrentPlaceRequest, przekazując List z Place.Field, określając typy danych miejsc, o które prosi Twoja aplikacja.
  3. Wywołaj PlacesClient.findCurrentPlace(), podając właściwość FindCurrentPlaceRequest utworzoną w poprzednim kroku.
  4. Uzyskaj listę PlaceLikelihood z FindCurrentPlaceResponse.

Pola odpowiadają wynikom wyszukiwania miejsc i są podzielone na 3 kategorie płatności: Podstawowe, Kontakty i Atmosfera. Pola podstawowe są rozliczane według stawki podstawowej i nie ponoszą żadnych dodatkowych opłat. Koszty w polach kontaktu i atmosfery są wyższe. Więcej informacji o naliczaniu opłat za żądania danych o miejscach znajdziesz w artykule Użycie i płatności.

Interfejs API zwraca błąd FindCurrentPlaceResponse w obiekcie Task. FindCurrentPlaceResponse zawiera listę obiektów PlaceLikelihood reprezentujących miejsca, w których prawdopodobnie znajduje się urządzenie. W przypadku każdego miejsca wynik wskazuje prawdopodobieństwo, że to miejsce jest właściwe. Lista może być pusta, jeśli nie istnieje znane miejsce odpowiadające danej lokalizacji urządzenia.

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

Ten przykładowy kod pobiera listę miejsc, w których prawdopodobnie zlokalizowano urządzenie, i rejestruje nazwę oraz prawdopodobieństwo dla każdego miejsca.

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

      

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

      

Uwagi dotyczące wartości prawdopodobieństwa:

  • Prawdopodobieństwo to względne prawdopodobieństwo, że dane miejsce najlepiej pasuje do listy zwróconych miejsc dla pojedynczego żądania. Nie można porównywać prawdopodobieństwa w przypadku różnych żądań.
  • Wartość prawdopodobieństwa będzie mieścić się w zakresie od 0,0 do 1,0.

Aby na przykład dać 55% prawdopodobieństwa, że właściwe miejsce to Miejsce A, a 35% prawdopodobieństwo, że miejsce B to 2 członki, odpowiedź A oznacza prawdopodobieństwo 0,55, a miejsce B – prawdopodobieństwo 0,35.

Wyświetlaj informacje o atrybucji w swojej aplikacji

Gdy aplikacja wyświetla informacje uzyskane ze strony PlacesClient.findCurrentPlace(), musi też zawierać informacje o atrybucji. Zapoznaj się z dokumentacją na temat atrybucji.