Search code examples
androidgoogle-places-apigoogle-placesgoogle-places-autocomplete

migrating to Places API, cannot resolve GEO_DATA_API GeoDataApi


I'm going through the process of migrating from depricated Places SDK to the Places API as described here, using the compatibility library. Everything had been working fine prior to attempting the migration. I've

1) Updated my dependencies

2) Changes my import statements

3) Min SDK was already 21

I am getting two (seemingly related) errors. cannot find symbol variable GEO_DATA_API and cannot find symbol variable GeoDataApi

the code

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

and

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

Solution

  • An entire re write of code is required. Here is working code for getting lat, lng, and name (for example)

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

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