Sobre este codelab
1. Antes de começar
Este codelab ensina como integrar o SDK do Places para Android ao seu app e usar cada um dos recursos dele.
Prerequisites
- Conhecimento básico de desenvolvimento Android e Kotlin
O que você vai aprender
- Como instalar o SDK do Places para Android com extensões Kotlin.
- Como carregar detalhes de um lugar específico.
- Como adicionar um widget do Place Autocomplete ao app.
- Como carregar o local atual com base no lugar informado pelo dispositivo no momento.
Pré-requisitos
Para concluir este codelab, você vai precisar das seguintes contas, serviços e ferramentas:
- Uma Conta do Google com faturamento ativado.
- Android Studio Bumblebee ou versão mais recente.
- Google Play Services instalado no Android Studio.
- Um dispositivo Android ou um Android Emulator que execute a plataforma de APIs do Google com base no Android 8 ou versões mais recentes (consulte Executar apps no Android Emulator para ver as etapas de instalação).
2. Começar a configuração
Para a etapa abaixo, ative a API Places.
Configurar a Plataforma Google Maps
Caso você ainda não tenha uma conta do Google Cloud Platform e um projeto com faturamento ativado, veja como criá-los no guia da Plataforma Google Maps.
- No Console do Cloud, clique no menu suspenso do projeto e selecione o projeto que você quer usar neste codelab.
- Ative as APIs e os SDKs da Plataforma Google Maps necessários para este codelab no Google Cloud Marketplace. Para fazer isso, siga as etapas descritas neste vídeo ou nesta documentação.
- Gere uma chave de API na página Credenciais do Console do Cloud. Siga as etapas indicadas neste vídeo ou nesta documentação. Todas as solicitações feitas à Plataforma Google Maps exigem uma chave de API.
3. Início rápido
Para começar o mais rápido possível e acompanhar este codelab, faça o download do código inicial. Se preferir, você pode ir direto para a solução, mas continue lendo se quiser desenvolver por conta própria.
- Clone o repositório se você tiver o
git
instalado.
git clone https://github.com/googlemaps/codelab-places-101-android.git
Se preferir, clique neste botão para fazer o download do código-fonte.
- Depois de fazer o download do código, abra o projeto no diretório
/starter
do Android Studio. Esse projeto inclui a estrutura de arquivos básica necessária para concluir o codelab. Tudo o que você precisa para trabalhar está no diretório/starter
.
Se você quiser ver o código completo da solução em execução, veja o código concluído no diretório /solution
.
4. Instalar o SDK do Places para Android
Nesta seção, você adiciona o SDK do Places para Android às dependências do seu app.
Adicionar sua chave de API
Forneça a chave de API que você criou anteriormente para que o SDK do Places para Android possa associar sua chave ao app.
- Abra o arquivo
local.properties
no diretório raiz do projeto (o mesmo nível em que estãogradle.properties
esettings.gradle
). - Defina uma nova chave
GOOGLE_MAPS_API_KEY
, atribuindo a ela o valor da chave de API que você criou.
local.properties
GOOGLE_MAPS_API_KEY=YOUR_KEY_HERE
O local.properties
está incluído no arquivo .gitignore
no repositório Git. Isso ocorre porque sua chave de API é considerada informação confidencial e não deve ser verificada no controle de origem, se possível.
- Em seguida, para expor a chave de API e usá-la em todo o app, inclua o plug-in Secrets Gradle para Android no arquivo
build.gradle
do app, localizado no diretórioapp/
, e inclua a seguinte linha no blocoplugins
:
build.gradle no nível do app
plugins {
// ...
id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
}
- Modifique o arquivo
build.gradle
no nível do projeto para incluir o seguinte caminho de classe:
build.gradle no nível do projeto
buildscript {
dependencies {
// ...
classpath "com.google.android.libraries.mapsplatform.secrets-gradle-plugin:secrets-gradle-plugin:2.0.1"
}
}
Esse plug-in disponibiliza as chaves definidas no arquivo local.properties
como variáveis de build no arquivo de manifesto do Android e como variáveis na classe BuildConfig
gerada pelo Gradle no momento da compilação. Usar esse plug-in remove o código boilerplate que seria necessário para ler as propriedades de local.properties
, para que elas possam ser acessadas em todo o app.
Adicionar a dependência do SDK do Places para Android
- Agora que sua chave de API pode ser acessada no app, adicione a dependência do SDK do Places para Android ao arquivo
build.gradle
do seu app.
No projeto inicial que acompanha este codelab, essa dependência já foi adicionada para você.
build.gradle no nível do app
dependencies {
// Dependency to include Places SDK for Android
implementation 'com.google.android.libraries.places:places:2.6.0'
}
- Execute o app.
Você vai ver um app com uma tela vazia. Continue a preencher a tela com três demonstrações.
5. Instalar o Android KTX do Places
Para apps Kotlin que usam um ou mais SDKs do Android da Plataforma Google Maps, as bibliotecas de extensão Kotlin (KTX) permitem aproveitar recursos da linguagem Kotlin, como corrotinas, propriedades/funções de extensão e muito mais. Cada SDK do Google Maps tem uma biblioteca KTX correspondente, como mostrado abaixo:
Nesta tarefa, utilize a biblioteca Places do Android KTX para usar recursos da linguagem específica do Kotlin no seu app.
Adicionar a dependência do Android KTX do Places
Para aproveitar os recursos específicos do Kotlin, inclua a biblioteca KTX correspondente para esse SDK no arquivo build.gradle
no nível do app.
build.gradle
dependencies {
// ...
// Places SDK for Android KTX Library
implementation 'com.google.maps.android:places-ktx:2.0.0'
}
6. Inicializar o cliente do Places
Inicializar o SDK do Places para o escopo do aplicativo
No arquivo DemoApplication.kt
da pasta app/src/main/java/com/google/codelabs/maps/placesdemo
, inicialize o SDK do Places para Android. Cole as linhas abaixo no fim da função onCreate
:
// Initialize the SDK with the Google Maps Platform API key
Places.initialize(this, BuildConfig.GOOGLE_MAPS_API_KEY)
Quando você cria o app, o plug-in de secrets do Gradle para Android (em inglês) disponibiliza a chave de API no seu arquivo local.properties
como BuildConfig.GOOGLE_MAPS_API_KEY
.
Adicionar o arquivo de aplicativo ao manifesto
Como você estendeu o Application
com DemoApplication
, é necessário atualizar o manifesto. Adicione a propriedade android:name
ao elemento application
no arquivo AndroidManifest.xml
, localizado em app/src/main
:
<application
android:name=".DemoApplication"
...
</application>
Esse código aponta o manifesto do aplicativo para a classe DemoApplication
na pasta src/main/java/com/google/codelabs/maps/placesdemo/
.
7. Buscar Place Details
Criar a tela "Detalhes"
Um layout activity_details.xml
com um LinearLayout
vazio está disponível na pasta app/src/main/res/layout/
. Preencha o layout linear adicionando o seguinte código entre os colchetes <LinearLayout>
.
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/details_input"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/details_input_hint"
android:text="@string/details_input_default" />
</com.google.android.material.textfield.TextInputLayout>
<Button
android:id="@+id/details_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/button_details" />
<TextView
android:id="@+id/details_response_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="16dp"
android:textIsSelectable="true" />
Esse código adiciona um campo de entrada de texto em que o usuário pode inserir qualquer ID de local ou usar o padrão fornecido, um botão para iniciar a solicitação do Place Details e um TextView para exibir as informações da resposta. As strings associadas são definidas para você no arquivo src/main/res/values/strings.xml
.
Criar a atividade "Detalhes"
- Crie um arquivo
DetailsActivity.kt
na pastasrc/main/java/com/google/codelabs/maps/placesdemo/
e associe-o ao layout que você acabou de criar. Cole este código no arquivo:
class DetailsActivity : AppCompatActivity() {
private lateinit var placesClient: PlacesClient
private lateinit var detailsButton: Button
private lateinit var detailsInput: TextInputEditText
private lateinit var responseView: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_details)
// Set up view objects
detailsInput = findViewById(R.id.details_input)
detailsButton = findViewById(R.id.details_button)
responseView = findViewById(R.id.details_response_content)
}
}
- Crie um cliente do Places para usar com essa atividade. Cole este código após a configuração do objeto de visualização na função
onCreate
.
// Retrieve a PlacesClient (previously initialized - see DemoApplication)
placesClient = Places.createClient(this)
- Depois que o cliente do Places estiver configurado, anexe um listener de cliques ao botão. Cole este código após a criação do cliente do Places na função
onCreate
.
// Upon button click, fetch and display the Place Details
detailsButton.setOnClickListener {
val placeId = detailsInput.text.toString()
val placeFields = listOf(
Place.Field.NAME,
Place.Field.ID,
Place.Field.LAT_LNG,
Place.Field.ADDRESS
)
lifecycleScope.launch {
try {
val response = placesClient.awaitFetchPlace(placeId, placeFields)
responseView.text = response.prettyPrint()
} catch (e: Exception) {
e.printStackTrace()
responseView.text = e.message
}
}
}
Esse código recupera o ID de lugar que foi inserido no campo de entrada, define quais campos vão ser solicitados, cria um FetchPlaceRequest
, inicia a tarefa e detecta um sucesso ou uma falha. Quando a solicitação é bem-sucedida, a função preenche a TextView com os detalhes solicitados.
- Converta
FetchPlaceResponse
em texto definindo uma função de extensão. Um arquivoStringUtil.kt
é fornecido para simplificar a conversão das respostas do SDK do Places em strings legíveis.
No fim do arquivo DetailsActivity.kt
, defina uma função para converter o objeto de resposta do Fetch Place em uma string.
fun FetchPlaceResponse.prettyPrint(): String {
return StringUtil.stringify(this, false)
}
Adicionar a atividade "Detalhes" ao manifesto
Adicione um elemento <activity>
para o DetailsActivity
como filho do elemento <application>
no arquivo AndroidManifest.xml
, localizado em app/src/main
:
<activity android:name=".DetailsActivity" />
Adicionar a atividade "Detalhes" ao menu de demonstração
Um módulo Demo
vazio é fornecido para listar as demonstrações disponíveis na tela inicial. Agora que você criou uma atividade do Place Details, adicione-a ao arquivo Demo.kt
na pasta src/main/java/com/google/codelabs/maps/placesdemo/
com este código:
DETAILS_FRAGMENT_DEMO(
R.string.details_demo_title,
R.string.details_demo_description,
DetailsActivity::class.java
),
As strings associadas são definidas no arquivo src/main/res/values/strings.xml
.
Inspecione o MainActivity.kt
e observe que ele cria um ListView preenchido pela iteração do conteúdo do módulo Demo
. Quando o usuário toca em um item da lista, o listener de cliques abre a atividade associada.
Executar o app
- Execute o app. Desta vez, você vai ver um item na lista com a demonstração do Place Details.
- Toque no texto do Place Details. Você vai ter acesso à visualização criada com um botão e um campo de entrada.
- Toque no botão "VER DETALHES". Se você usou o ID de lugar padrão, vai ver o nome, o endereço e as coordenadas do mapa, como mostrado na Figura 1.
Figura 1. Atividade do Place Details com resposta exibida.
8. Adicionar Place Autocomplete
Criar uma tela de preenchimento automático
Um layout activity_autocomplete.xml
com um LinearLayout
vazio foi fornecido na pasta app/src/main/res/layout/
. Preencha o layout linear adicionando este código entre os colchetes <LinearLayout>
.
<androidx.fragment.app.FragmentContainerView
android:id="@+id/autocomplete_fragment"
android:background="@android:color/white"
android:name="com.google.android.libraries.places.widget.AutocompleteSupportFragment"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/autocomplete_response_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="16dp"
android:textIsSelectable="true" />
Esse código adiciona um widget AutocompleteSupportFragment
e um TextView para exibir as informações da resposta. As strings associadas são definidas no arquivo src/main/res/values/strings.xml
.
Criar uma atividade de preenchimento automático
- Crie um arquivo
AutocompleteActivity.kt
na pastasrc/main/java/com/google/codelabs/maps/placesdemo/
e defina-o com este código:
class AutocompleteActivity : AppCompatActivity() {
private lateinit var responseView: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_autocomplete)
// Set up view objects
responseView = findViewById(R.id.autocomplete_response_content)
val autocompleteFragment =
supportFragmentManager.findFragmentById(R.id.autocomplete_fragment)
as AutocompleteSupportFragment
}
}
Esse código associa a atividade às visualizações e ao AutocompleteSupportFramgent
que você definiu no arquivo de layout.
- Em seguida, defina o que acontece quando o usuário seleciona uma das previsões apresentadas pelo Place Autocomplete. Adicione este código ao fim da função
onCreate
:
// Specify the types of place data to return.
autocompleteFragment.setPlaceFields(listOf(Place.Field.NAME, Place.Field.ID, Place.Field.LAT_LNG, Place.Field.ADDRESS))
// Listen to place selection events
lifecycleScope.launchWhenCreated {
autocompleteFragment.placeSelectionEvents().collect { event ->
when (event) {
is PlaceSelectionSuccess -> {
val place = event.place
responseView.text = StringUtil.stringifyAutocompleteWidget(place, false)
}
is PlaceSelectionError -> Toast.makeText(
this@AutocompleteActivity,
"Failed to get place '${event.status.statusMessage}'",
Toast.LENGTH_SHORT
).show()
}
}
Esse código define os campos que são solicitados para o lugar e detecta um evento de seleção de lugar, além de sucesso ou falha. Quando a solicitação é bem-sucedida, a função preenche a TextView com os detalhes do lugar. O Place Autocomplete retorna um objeto do Place. Não é necessário fazer outra solicitação do Place Details ao usar o widget do Place Autocomplete.
Adicionar a atividade de preenchimento automático ao manifesto
Adicione um elemento <activity>
para o AutocompleteActivity
como filho do elemento <application>
no arquivo AndroidManifest.xml
, localizado em app/src/main
:
<activity android:name=".AutocompleteActivity" />
Adicionar a atividade de preenchimento automático ao menu de demonstração
Assim como antes, adicione a demonstração do Place Autocomplete à tela inicial anexando-a à lista no módulo Demo
. Agora que você criou uma atividade do Place Autocomplete, adicione-a ao arquivo Demo.kt
na pasta src/main/java/com/google/codelabs/maps/placesdemo/
. Cole este código imediatamente após o item DETAILS_FRAGMENT_DEMO
:
AUTOCOMPLETE_FRAGMENT_DEMO(
R.string.autocomplete_fragment_demo_title,
R.string.autocomplete_fragment_demo_description,
AutocompleteActivity::class.java
),
As strings associadas são definidas no arquivo src/main/res/values/strings.xml
.
Executar o app
- Execute o app. Desta vez, você vai ver dois itens na lista da tela inicial.
- Toque na linha do Place Autocomplete. Uma entrada do Place Autocomplete é exibida como mostrado na Figura 2.
- Comece a digitar o nome de um lugar. Pode ser o nome de um estabelecimento, um endereço ou uma região geográfica. As previsões são apresentadas enquanto você digita.
- Selecione uma das previsões. As previsões vão desaparecer, e o TextView vai exibir os detalhes do lugar selecionado, como mostrado na Figura 3.
Figura 2. Atividade de preenchimento automático depois que o usuário toca no campo de entrada.
Figura 3. Atividade de preenchimento automático que exibe o Place Details depois que o usuário digita e seleciona "Niagara Falls".
9. Acessar o local atual do dispositivo
Criar uma tela do local atual
Um layout activity_current.xml
com um LinearLayout
vazio foi fornecido na pasta app/src/main/res/layout/
. Preencha o layout linear adicionando o seguinte código entre os colchetes <LinearLayout>
.
<Button
android:id="@+id/current_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/current_button" />
<TextView
android:id="@+id/current_response_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="16dp"
android:scrollbars = "vertical"
android:textIsSelectable="true" />
Criar uma atividade do local atual
- Crie um arquivo
CurrentActivity.kt
na pastasrc/main/java/com/google/codelabs/maps/placesdemo/
e defina-o com este código:
class CurrentPlaceActivity : AppCompatActivity() {
private lateinit var placesClient: PlacesClient
private lateinit var currentButton: Button
private lateinit var responseView: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_current)
// Retrieve a PlacesClient (previously initialized - see DemoApplication)
placesClient = Places.createClient(this)
// Set view objects
currentButton = findViewById(R.id.current_button)
responseView = findViewById(R.id.current_response_content)
// Set listener for initiating Current Place
currentButton.setOnClickListener {
checkPermissionThenFindCurrentPlace()
}
}
}
Esse código associa a atividade às visualizações que você definiu no arquivo de layout. Ele também adiciona um listener de clique ao botão para chamar a função checkPermissionThenFindCurrentPlace
quando o botão é clicado.
- Defina
checkPermissionThenFindCurrentPlace()
para verificar a permissão de localização exata e solicite a permissão, se ela ainda não tiver sido concedida. Cole este código após a funçãoonCreate
.
/**
* Checks that the user has granted permission for fine or coarse location.
* If granted, finds current Place.
* If not yet granted, launches the permission request.
* See https://developer.android.com/training/permissions/requesting
*/
private fun checkPermissionThenFindCurrentPlace() {
when {
(ContextCompat.checkSelfPermission(
this,
ACCESS_FINE_LOCATION
) == PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(
this,
ACCESS_COARSE_LOCATION
) == PackageManager.PERMISSION_GRANTED) -> {
// You can use the API that requires the permission.
findCurrentPlace()
}
shouldShowRequestPermissionRationale(ACCESS_FINE_LOCATION)
-> {
Log.d(TAG, "Showing permission rationale dialog")
// TODO: In an educational UI, explain to the user why your app requires this
// permission for a specific feature to behave as expected. In this UI,
// include a "cancel" or "no thanks" button that allows the user to
// continue using your app without granting the permission.
}
else -> {
// Ask for both the ACCESS_FINE_LOCATION and ACCESS_COARSE_LOCATION permissions.
ActivityCompat.requestPermissions(
this,
arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
),
PERMISSION_REQUEST_CODE
)
}
}
}
companion object {
private val TAG = "CurrentPlaceActivity"
private const val PERMISSION_REQUEST_CODE = 9
}
- Quando a ramificação
else
da funçãocheckPermissionThenFindCurrentPlace
chamarequestPermissions
, o app apresenta uma caixa de diálogo de solicitação de permissão ao usuário. Quando o usuário executa um dispositivo com um SO anterior ao Android 12, ele só pode conceder permissões de localização precisas. Quando o usuário usa um dispositivo com o Android 12 ou mais recente, ele pode informar um local aproximado, em vez de um lugar exato, como mostrado na Figura 4.
Figura 4. Solicitar permissão do usuário em um dispositivo com o Android 12 ou mais recente permite conceder uma localização aproximada ou precisa.
Depois que o usuário responde à caixa de diálogo de permissões, o sistema invoca a implementação do app de onRequestPermissionsResult
. O sistema transmite a resposta do usuário à caixa de diálogo de permissão, além do código de solicitação definido. Substitua onRequestPermissionResult
para processar o código de solicitação das permissões de localização relacionadas a essa atividade do local atual colando o seguinte código abaixo de checkPermissionThenFindCurrentPlace
.
@SuppressLint("MissingPermission")
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<String>, grantResults: IntArray
) {
if (requestCode != PERMISSION_REQUEST_CODE) {
super.onRequestPermissionsResult(
requestCode,
permissions,
grantResults
)
return
} else if (permissions.toList().zip(grantResults.toList())
.firstOrNull { (permission, grantResult) ->
grantResult == PackageManager.PERMISSION_GRANTED && (permission == ACCESS_FINE_LOCATION || permission == ACCESS_COARSE_LOCATION)
} != null
)
// At least one location permission has been granted, so proceed with Find Current Place
findCurrentPlace()
}
- Quando a permissão for concedida, a função
findCurrentPlace
vai ser executada. Defina a função com esse código após a funçãoonRequestPermissionsResult
.
/**
* Fetches a list of [PlaceLikelihood] instances that represent the Places the user is
* most
* likely to be at currently.
*/
@RequiresPermission(anyOf = [ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION])
private fun findCurrentPlace() {
// Use fields to define the data types to return.
val placeFields: List<Place.Field> =
listOf(Place.Field.NAME, Place.Field.ID, Place.Field.ADDRESS, Place.Field.LAT_LNG)
// Use the builder to create a FindCurrentPlaceRequest.
val request: FindCurrentPlaceRequest = FindCurrentPlaceRequest.newInstance(placeFields)
// Call findCurrentPlace and handle the response (first check that the user has granted permission).
if (ContextCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION) ==
PackageManager.PERMISSION_GRANTED ||
ContextCompat.checkSelfPermission(this, ACCESS_COARSE_LOCATION) ==
PackageManager.PERMISSION_GRANTED
) {
// Retrieve likely places based on the device's current location
lifecycleScope.launch {
try {
val response = placesClient.awaitFindCurrentPlace(placeFields)
responseView.text = response.prettyPrint()
// Enable scrolling on the long list of likely places
val movementMethod = ScrollingMovementMethod()
responseView.movementMethod = movementMethod
} catch (e: Exception) {
e.printStackTrace()
responseView.text = e.message
}
}
} else {
Log.d(TAG, "LOCATION permission not granted")
checkPermissionThenFindCurrentPlace()
}
}
Esse código define quais campos vão ser solicitados para os possíveis lugares, cria um FindCurrentPlaceRequest
, inicia a tarefa e preenche o TextView com os detalhes solicitados.
- Converta
FindCurrentPlaceResponse
em texto definindo uma função de extensão. Um arquivoStringUtil.kt
é fornecido para simplificar a conversão das respostas do SDK do Places em strings legíveis.
No fim do arquivo CurrentPlaceActivity.kt
, defina uma função para converter o objeto de resposta do local atual em uma string.
fun FindCurrentPlaceResponse.prettyPrint(): String {
return StringUtil.stringify(this, false)
}
Adicionar a atividade do local atual ao manifesto
Adicione um elemento <activity>
para o CurrentPlaceActivity
como filho do elemento <application>
no arquivo AndroidManifest.xml
, localizado em app/src/main
:
<activity android:name=".CurrentPlaceActivity" />
Adicionar a atividade do local atual ao menu de demonstração
Assim como antes, adicione a demonstração do local atual à tela inicial anexando-a à lista no módulo Demo
. Agora que você criou uma atividade do local atual, adicione-a ao arquivo Demo.kt
na pasta src/main/java/com/google/codelabs/maps/placesdemo/
. Cole este código imediatamente após o item AUTOCOMPLETE_FRAGMENT_DEMO
:
CURRENT_FRAGMENT_DEMO(
R.string.current_demo_title,
R.string.current_demo_description,
CurrentPlaceActivity::class.java
),
As strings associadas são definidas no arquivo src/main/res/values/strings.xml
.
Executar o app
- Execute o app. Desta vez, você vai ver três itens na lista da tela inicial.
- Toque na linha do local atual. Você vai ver um botão na tela.
- Toque no botão. Se você nunca concedeu permissão de localização a este app, uma solicitação de permissão vai ser exibida.
- Conceda permissão ao app para acessar a localização do dispositivo.
- Toque no botão novamente. Desta vez, uma lista de até 20 lugares por perto e as probabilidades deles serão exibidas, como mostrado na Figura 5.
Figura 5. Apresentação de possíveis correspondências com locais atuais para o local informado pelo dispositivo.
10. Parabéns
Você criou um app Android com o SDK do Places para Android.
O que você aprendeu
- Como instalar e configurar o SDK do Places para Android.
- Como instalar extensões Kotlin para o SDK do Places para Android.
- Como carregar o Place Details.
- Adicionar Place Autocomplete.
- Como acessar o Local atual.
A seguir
- Explore ou crie uma bifurcação do repositório
android-places-demos
de amostras e demonstrações do GitHub para ter mais inspiração. - Aprenda com mais codelabs do Kotlin para criar apps Android com a Plataforma Google Maps.
- Ajude-nos a criar conteúdo útil respondendo à seguinte pergunta:
Quais outros codelabs você quer ver?
O codelab que você quer ver não está listado? Solicite-o aqui.