Daniel Alvarez
Senior Software Engineer. Android, iOS, Firebase.
UMSA - LASIN - 2016.1
Lugares cerca la ubicación
Información del lugar, contacto, fotos
Autocompletado de lugares
Se puede usar la misma API Key de Google Maps.
Para Android tenemos los servicios de PlacePicker, GeoDataApi y PlaceDetectionApi.
Para ambas es necesario tener configurado el GoogleApiClient.
public class MainActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener {
private GoogleApiClient googleApiClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
googleApiClient = new GoogleApiClient
.Builder(this)
.addApi(Places.GEO_DATA_API)
.addApi(Places.PLACE_DETECTION_API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
}
@Override
protected void onStart() {
super.onStart();
googleApiClient.connect();
}
@Override
protected void onStop() {
googleApiClient.disconnect();
super.onStop();
}
}
Todo Place tiene su ID que tiene la apariencia de ChIJrTLr-GyuEmsRBfy61i59si0 que se usa en las bases de datos de Google Maps y Google Places.
Los tipos soportados y disponibles se encuentran en la dirección:
Algunos de los métodos que tiene un objeto Place.
Método | Descripción |
---|---|
getId() | Retorna el identificador único en la base de datos |
getAddress() | Dirección |
getLatLng() | Latitud y longitud. Accesible con .latitude y .longitude |
getName() | Nombre del lugar |
getWebsiteUri() | Dirección web, si no está disponible retorna null |
getPhoneNumber() | Teléfono, si no está disponible retorna null |
Cuadro de diálogo con UI que muestra un mapa y lista de sitios cercanos.
Requiere el permiso ACCESS_FINE_LOCATION.
Abrir el díalogo
PlacePicker.IntentBuilder builder = new PlacePicker.IntentBuilder();
startActivityForResult(builder.build(this), 777);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 777) {
if (resultCode == RESULT_OK) {
Place place = PlacePicker.getPlace(this, data);
String nombre = place.getName();
Toast.makeText(this, nombre, Toast.LENGTH_LONG).show();
}
}
}
Manejar la respuesta
Permite obtener el lugar o lugares cerca la ubicación.
En caso de obtener varios lugares se nos presenta con una probabilidad de cercanía entre 0 y 1.
PendingResult<PlaceLikelihoodBuffer> result = Places.PlaceDetectionApi.getCurrentPlace(googleApiClient, null);
result.setResultCallback(new ResultCallback<PlaceLikelihoodBuffer>() {
@Override
public void onResult(@NonNull PlaceLikelihoodBuffer placeLikelihoods) {
for (PlaceLikelihood placeLikelihood : placeLikelihoods) {
Toast.makeText(MainActivity.this,
placeLikelihood.getPlace().getName() + ", " + placeLikelihood.getLikelihood(),
Toast.LENGTH_SHORT).show();
}
placeLikelihoods.release();
}
});
Mediante el query deseado, un filtro y un rango es posible obtener los ids y nombres de los lugares
AutocompleteFilter autocompleteFilter = new AutocompleteFilter.Builder()
.setTypeFilter(AutocompleteFilter.TYPE_FILTER_CITIES)
.build();
PendingResult<AutocompletePredictionBuffer> result =
Places.GeoDataApi.getAutocompletePredictions(googleApiClient,
"La Paz",
null,
autocompleteFilter);
result.setResultCallback(new ResultCallback<AutocompletePredictionBuffer>() {
@Override
public void onResult(@NonNull AutocompletePredictionBuffer autocompletePredictions) {
for (AutocompletePrediction prediction : autocompletePredictions) {
Toast.makeText(MainActivity.this,
prediction.getPlaceId() + ": " + prediction.getFullText(null),
Toast.LENGTH_SHORT).show();
}
autocompletePredictions.release();
}
});
Obtener toda la información de un lugar por su Id.
PendingResult<PlaceBuffer> pendingResult =
Places.GeoDataApi.getPlaceById(googleApiClient, "ChIJrTLr-GyuEmsRBfy61i59si0");
pendingResult.setResultCallback(new ResultCallback<PlaceBuffer>() {
@Override
public void onResult(PlaceBuffer places) {
if (places.getStatus().isSuccess() && places.getCount() > 0) {
final Place lugar = places.get(0);
Toast.makeText(MainActivity.this, lugar.getName(), Toast.LENGTH_SHORT).show();
} else {
}
places.release();
}
});
By Daniel Alvarez
Google Places. Parte del curso de desarrollo de aplicaciones Android.