при переходе на Places API не удается разрешить GEO_DATA_API GeoDataApi

Я выполняю процесс перехода с устаревшего SDK Places на API Places, как описано здесь, используя библиотеку совместимости. Все работало нормально до попытки миграции. я

1) Обновлены мои зависимости

2) Изменяет мои операторы импорта

3) Мин SDK был уже 21

Я получаю две (по-видимому, связанные) ошибки. cannot find symbol variable GEO_DATA_API и cannot find symbol variable GeoDataApi

код

googleApiClient = new GoogleApiClient.Builder(PlacesActivity.this)
            .addApi(Places.GEO_DATA_API)  //***HERE***
            .enableAutoManage(this, GOOGLE_API_CLIENT_ID, this)
            .addConnectionCallbacks(this)
            .build();

а также

private ArrayList<PlaceAutocomplete> getPredictions(CharSequence constraint) {
    if (googleApiClient !=null) {
        PendingResult<AutocompletePredictionBuffer> results = Places.GeoDataApi.getAutocompletePredictions(  // ***AND HERE***
                googleApiClient,
                constraint.toString(),
                latLngBounds,
                autocompleteFilter
        );

        // Wait for predictions, set the timeout.
        AutocompletePredictionBuffer autocompletePredictions = results.await(60, TimeUnit.SECONDS);

        final Status status = autocompletePredictions.getStatus();
        if (!status.isSuccess()) {
            //auto complete fail
            autocompletePredictions.release();
            return null;
        }
        //auto complete success
        Iterator<AutocompletePrediction> iterator = autocompletePredictions.iterator();
        ArrayList<PlaceAutocomplete> resultList = new ArrayList<>(autocompletePredictions.getCount());
        while (iterator.hasNext()) {
            AutocompletePrediction prediction = iterator.next();
            resultList.add(new PlaceAutocomplete(prediction.getPlaceId(), prediction.getFullText(null)));
        }
        // Buffer release
        autocompletePredictions.release();
        return resultList;
    }
    return null;
}

person seekingStillness    schedule 04.05.2019    source источник


Ответы (3)


Требуется полная переработка кода. Вот рабочий код для получения lat, lng и имени (например)

public class MainActivity extends AppCompatActivity {
    String TAG = "placeautocomplete";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Initialize Places.
    Places.initialize(getApplicationContext(), "YOUR_API_KEY");
    // Create a new Places client instance.
    PlacesClient placesClient = Places.createClient(this);

    // Initialize the AutocompleteSupportFragment.
    AutocompleteSupportFragment autocompleteFragment = (AutocompleteSupportFragment)
            getSupportFragmentManager().findFragmentById(R.id.autocomplete_fragment);

    // Specify the types of place data to return.
    autocompleteFragment.setPlaceFields(Arrays.asList(
         Place.Field.NAME,
         Place.Field.LAT_LNG
    ));

    // Set up a PlaceSelectionListener to handle the response.
    autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() {
        @Override
        public void onPlaceSelected(Place place) {
            // TODO: Get info about the selected place.
            String name = place.getName();
            double lat, lng;
            if (place.getLatLng() !=null){
                lat =place.getLatLng().latitude;
                lng =place.getLatLng().longitude;
            }

            //do something
        }

        @Override
        public void onError(Status status) {
            // TODO: Handle the error.
            Log.i(TAG, "An error occurred: " + status);
        }
    });
}
}

пример xml

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    >
    <android.support.v7.widget.CardView
        android:id="@+id/idCardView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        app:cardCornerRadius="4dp"
        >
        <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"
            />
    </android.support.v7.widget.CardView>
</LinearLayout>
person seekingStillness    schedule 05.05.2019
comment
Как я могу получить компоненты адреса, такие как штат, город, булавка, через API места, когда мы используем геокодирование? - person Tarun Sharma; 11.10.2019

Проблема 1: не удается найти символьную переменную GEO_DATA_API

Решение 1. Прежде всего давайте разберемся с использованием Places.GEO_DATA_API.

В нем говорится, что «API Geo Data обеспечивает доступ к получению информации о местах по идентификатору места, автозаполнению поискового запроса пользователя по имени или адресу и добавлению новых мест в базу данных Google Places».

источник (https://developers.google.com/android/reference/com/google/android/gms/location/places/GeoDataApi)

Итак, если мы хотим получить информацию о месте из идентификатора места, мы должны использовать следующий код:

// Define a Place ID.
String placeId = "INSERT_PLACE_ID_HERE";

// Specify the fields to return (in this example all fields are returned).
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();

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

Проблема 2: не удается найти символьную переменную GeoDataApi

Решение 2. API новых мест указывает, что «Используйте findAutocompletePredictions() для возврата прогнозов мест в ответ на поисковые запросы пользователей. Функции findAutocompletePredictions() аналогичны getAutocompletePredictions()».

источник (https://developers.google.com/places/android-sdk/client-migration)

Итак, чтобы получить автоматически полные прогнозы, мы можем использовать следующий код:

// 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")
   .setTypeFilter(TypeFilter.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());
   }
});
person android    schedule 04.05.2019

  1. Замените GoogleApiClient на GeoDataClient.

    mGoogleApiClient = Places.getGeoDataClient(this, null);

  2. Замените AutocompletePredictionBuffer на AutocompletePredictionBufferResponse.

частный ArrayList getAutocomplete (ограничение CharSequence) {

    if (mGoogleApiClient != null) {
        // Submit the query to the autocomplete API and retrieve a PendingResult that will
        // contain the results when the query completes.
        Task<AutocompletePredictionBufferResponse> results = mGoogleApiClient.getAutocompletePredictions(constraint.toString(), null, mPlaceFilter);

            // This method should have been called off the main UI thread. Block and wait for at most 60s
            // for a result from the API.
            try {
                Tasks.await(results, 60, TimeUnit.SECONDS);
            } catch (ExecutionException | InterruptedException | TimeoutException e) {
                Utils.handleException(e);
            }

            AutocompletePredictionBufferResponse autocompletePredictions = results.getResult();

            // Freeze the results immutable representation that can be stored safely.
            return DataBufferUtils.freezeAndClose(autocompletePredictions);
        }
        return null;
    }
person thanhbinh84    schedule 11.10.2019