2017-08-17 1 views
2

Lorsque j'effectue une recherche à partir de la saisie semi-automatique de Google Adresses, des suggestions/prévisions provenant du monde entier sont diffusées. Cependant, je veux obtenir des suggestions en fonction de l'emplacement de l'utilisateur. J'ai essayé de changer ma position manuellement dans l'émulateur, mais cela ne fonctionne toujours pas. Je pense qu'il me manque peut-être quelque chose dans mon code, mais je ne sais pas quoi. S'il vous plaît aider.L'API Google Places ne renvoie pas les suggestions en fonction de l'emplacement

Code:

Mes dépendances

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

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

    } 
} 

XML de mon activité

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

Répondre

0

J'ai trouvé la solution, et grâce à Mahesh Gawhane et Patrick R pour me aider. Mais pour répondre pleinement à ma question, je devais d'abord obtenir l'emplacement actuel de l'utilisateur en termes de latitude et de longitude. J'ai suivi this tutoriel pour obtenir l'emplacement de l'utilisateur en termes de Lat et Lng (en fonction de ce que votre application est, vous pouvez personnaliser le code à votre besoin).

Puis, j'ai dû entrer ces coordonnées Lat et Lng dans un objet LatLngBounds, dont j'ai suivi le tutoriel this pour le faire. Une fois que j'ai eu l'objet LatLngBounds, j'ai appelé la méthode setBoundsBias() dans la saisie semi-automatique des lieux, voir le guide here.

Maintenant, la saisie semi-automatique des lieux donnera des suggestions de «biais» basées sur une certaine zone «délimitée» autour de l'emplacement de l'utilisateur! Par «biais», je veux dire par rapport aux endroits qui ne sont pas dans cette zone «délimitée».

1

Set LatLongBounds à PlaceAutoComplete pour résultat d'exposition de l'utilisateur emplacement actuel comme

ci-dessous ligne donne les limites de l'emplacement actuel

LatLngBounds bounds = mGoogleMap.getProjection().getVisibleRegion().latLngBounds; 
    Log.i("curScreen", ""+bounds); 

ou vous pouvez définir latlongbounds statiques comme

LatLngBounds latLngBounds = new LatLngBounds(
       new LatLng(19.8036125,75.1932621), 
       new LatLng(19.9365798,75.4171406)); 

filtre puis définissez Place Saisie semi-automatique

final AutocompleteFilter typeFilter = new AutocompleteFilter.Builder() 
      .setTypeFilter(AutocompleteFilter.TYPE_FILTER_ADDRESS) 
      .setTypeFilter(3) 
      .build(); 

et de transmettre LatLongBounds et AutocompleteFilter-PlaceAutocomplete intention

try 
    { 
     Intent intent = new PlaceAutocomplete.IntentBuilder(PlaceAutocomplete.MODE_OVERLAY).setBoundsBias(bounds).setFilter(typeFilter).build(MapActivity.this); 
     startActivityForResult(intent, PLACE_AUTOCOMPLETE_REQUEST_CODE); 

    } 
+0

Tentative d'invocation de la méthode virtuelle 'com.google.android.gms.maps.Projection com.google.android.gms.maps.GoogleMap.getProjection()' sur une référence d'objet nul – ben

2

Code Mise à jour:

LatLngBounds bounds = new LatLngBounds(new LatLng(23.8036125,72.1932621), new LatLng(23.9365798,72.4171406)); 
     final AutocompleteFilter typeFilter = new AutocompleteFilter.Builder() 
       .setTypeFilter(AutocompleteFilter.TYPE_FILTER_ADDRESS) 
       .build(); 
     try { 

      Intent intent = new PlaceAutocomplete.IntentBuilder(PlaceAutocomplete.MODE_OVERLAY). 
        setBoundsBias(bounds). 
        setFilter(typeFilter).build(LocationPickerActivityDEMO.this); 
      startActivityForResult(intent, PLACE_AUTOCOMPLETE_REQUEST_CODE); 

     } catch (GooglePlayServicesRepairableException e) { 
      // TODO: Handle the error. 
     } catch (GooglePlayServicesNotAvailableException e) { 
      // TODO: Handle the error. 
     } 

Hope it helps

+0

Les guides de l'API Google Places suggèrent que cette méthode Le fragment ne doit être ajouté que si je veux qu'il apparaisse comme un fragment. Cependant, j'utilise l'intention de commencer la saisie semi-automatique en tant qu'activité. – ben

+0

En activant la console Google, voulez-vous dire récupérer la clé API? Si oui, je l'ai déjà fait. – ben

+0

Salut, j'ai mis à jour la réponse, s'il vous plaît vérifier maintenant. –