When I search from the Google Places Autocomplete, it gives suggestions/predictions from all around the world. However I want to get suggestions based on user's location. I have tried to change my location manually in the emulator, but it still does not work. I think I may be lacking something in my code, but I don't know what. Please help.
Code:
My Dependencies
compile 'com.google.android.gms:play-services-places:10.2.1'
compile 'com.google.android.gms:play-services-location:10.2.1'
compile 'com.google.android.gms:play-services:10.2.1'
FindLocation Activity
public class FindLocation extends AppCompatActivity
implements GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener {
private int PLACE_AUTOCOMPLETE_REQUEST_CODE = 1;
private GoogleApiClient mGoogleApiClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_find_location);
mGoogleApiClient = new GoogleApiClient
.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(Places.GEO_DATA_API)
.addApi(Places.PLACE_DETECTION_API)
.enableAutoManage(this, this)
.build();
try {
Intent intent =
new PlaceAutocomplete.IntentBuilder(PlaceAutocomplete.MODE_OVERLAY)
.build(this);
startActivityForResult(intent, PLACE_AUTOCOMPLETE_REQUEST_CODE);
} catch (GooglePlayServicesRepairableException e) {
// TODO: Handle the error.
} catch (GooglePlayServicesNotAvailableException e) {
// TODO: Handle the error.
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == PLACE_AUTOCOMPLETE_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
Place place = PlaceAutocomplete.getPlace(this, data);
//Log.i(TAG, "Place: " + place.getName());
} else if (resultCode == PlaceAutocomplete.RESULT_ERROR) {
Status status = PlaceAutocomplete.getStatus(this, data);
// TODO: Handle the error.
//Log.i(TAG, status.getStatusMessage());
} else if (resultCode == RESULT_CANCELED) {
// The user canceled the operation.
}
}
}
@Override
public void onConnected(@Nullable Bundle bundle) {
//refreshPlacesData();
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
}
My Activity's XML
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.android.project_water.FindLocation">
</android.support.constraint.ConstraintLayout>
Set LatLongBounds to PlaceAutoComplete for show result of user current location like
below line gives bounds of current location
or you can set static latlongbounds like
then set filter to Place Autocomplete
and pass that
LatLongBounds
andAutocompleteFilter
toPlaceAutocomplete
IntentI have found the solution, and thanks to Mahesh Gawhane and Patrick R for helping me. But in order to answer my question fully, I had to first get the user's current location in terms of Latitude and Longitude. I followed this tutorial to get the user's location in terms of Lat and Lng (depending on what your application is, you can customise the code to your need).
Then, I had to input this Lat and Lng coordinates into a LatLngBounds object, of which, I followed this tutorial to do so. Once I had the LatLngBounds object, I called the
setBoundsBias()
method into the Places Autocomplete, see guide here.Now, the Places Autocomplete will give 'bias' suggestions based on a certain 'bounded' area around the user's location! By 'bias' I mean relative to places not within this 'bounded' area.
Updated code:
Hope it helps