A versão 11.2.0 do SDK do Google Play Services inclui uma nova maneira de acessar o SDK do Places para Android. O cliente GoogleApi
é mais fácil
de usar do que o predecessor (GoogleApiClient
), porque gerencia automaticamente
as conexões com o Google Play Services. Isso reduz a quantidade de código boilerplate
no app e pode ajudar a eliminar muitos problemas comuns. A nova API
oferece várias melhorias:
- O processo de conexão é gerenciado automaticamente, o que facilita a implementação da nova API.
- As chamadas de API agora aguardam automaticamente até que a conexão do serviço seja
estabelecida, eliminando a necessidade de esperar
onConnected
antes de fazer solicitações. - A API Tasks facilita a criação de operações assíncronas.
- O código é independente e pode ser facilmente movido para uma classe de utilitário compartilhada ou semelhante.
A atualização do seu app para usar o cliente GoogleApi
requer algumas mudanças na implementação do SDK do Places para Android. Este guia descreve as mudanças nesse SDK e recomenda as etapas a serem seguidas ao atualizar o app para usar o novo cliente.
Visão geral
As principais áreas de mudança são as seguintes:
- Há dois novos pontos de entrada:
GeoDataClient
ePlaceDetectionClient
. Em vez de criar uma instância deGoogleApiClient
para abranger todas as APIs, o app precisa instanciarGeoDataClient
ePlaceDetectionClient
. - Como os callbacks de conexão não são mais necessários, você pode refatorar seu app com segurança para removê-los.
- Os novos métodos da API Places agora são assíncronos e retornam um
Task
em vez de umPendingResult
.
Carregar a API Places
Para carregar a API Places, declare os pontos de entrada e instancie os clientes no método onCreate() do fragmento ou da atividade, como mostrado no exemplo a seguir:
// The entry points to the Places API.
private GeoDataClient mGeoDataClient;
private PlaceDetectionClient mPlaceDetectionClient;
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Construct a GeoDataClient.
mGeoDataClient = Places.getGeoDataClient(this, null);
// Construct a PlaceDetectionClient.
mPlaceDetectionClient = Places.getPlaceDetectionClient(this, null);
Comparação
Os novos métodos da API Places agora são assíncronos e retornam um Task
em vez de um PendingResult
. As estruturas de dados não
foram alteradas. Portanto, o código atual para lidar com os resultados não precisa ser atualizado.
Os exemplos de código abaixo comparam as versões nova e antiga do GetCurrentPlace()
:
A nova maneira
Task<PlaceLikelihoodBufferResponse> placeResult = mPlaceDetectionClient.getCurrentPlace(null); placeResult.addOnCompleteListener(new OnCompleteListener<PlaceLikelihoodBufferResponse>() { @Override public void onComplete(@NonNull Task<PlaceLikelihoodBufferResponse> task) { PlaceLikelihoodBufferResponse likelyPlaces = task.getResult(); for (PlaceLikelihood placeLikelihood : likelyPlaces) { Log.i(TAG, String.format("Place '%s' has likelihood: %g", placeLikelihood.getPlace().getName(), placeLikelihood.getLikelihood())); } likelyPlaces.release(); } });
O jeito antigo
PendingResult<PlaceLikelihoodBuffer> result = Places.PlaceDetectionApi .getCurrentPlace(mGoogleApiClient, null); result.setResultCallback(new ResultCallback<PlaceLikelihoodBuffer>() { @Override public void onResult(PlaceLikelihoodBuffer likelyPlaces) { for (PlaceLikelihood placeLikelihood : likelyPlaces) { Log.i(TAG, String.format("Place '%s' has likelihood: %g", placeLikelihood.getPlace().getName(), placeLikelihood.getLikelihood())); } likelyPlaces.release(); } });
Saiba mais
Saiba mais sobre como acessar as APIs do Google.