Buscar

Programação para dispositivos moveis - aula 10

Prévia do material em texto

19/03/2021 Disciplina Portal
estacio.webaula.com.br/Classroom/index.asp?191C757E76=48402D3F2A49B7F19DC3C17C0F7D5F6755F495C453DDA5ED2325A06E8F072… 1/16
Programação para dispositivos
móveis
Aula 10: Integrando Serviços Google a uma aplicação
Android
INTRODUÇÃO
Uma das funcionalidades que mais chama a atenção na plataforma Android é a grande facilidade para se construir aplicativos integrados ao
Google Maps.
Esta aula visa apresentar os principais serviços oferecidos pela Google para aplicações móveis Android, bem como a integração desses
serviços a aplicativos Android.
OBJETIVOS
19/03/2021 Disciplina Portal
estacio.webaula.com.br/Classroom/index.asp?191C757E76=48402D3F2A49B7F19DC3C17C0F7D5F6755F495C453DDA5ED2325A06E8F072… 2/16
Descrever e demonstrar os fundamentos de Mapas em Android.
Descrever e demonstrar os fundamentos de monitoramento GPS em Android.
19/03/2021 Disciplina Portal
estacio.webaula.com.br/Classroom/index.asp?191C757E76=48402D3F2A49B7F19DC3C17C0F7D5F6755F495C453DDA5ED2325A06E8F072… 3/16
MAPAS EM ANDROID
Entre os vários recursos oferecidos pelo Android, podemos destacar a integração ao Google Maps. A plataforma Android possui um conjunto
robusto de classes e interfaces que facilitam o desenvolvimento de aplicativos que permitem a interação com mapas e geolocalização.
Basicamente, existem duas versões da API de mapas da Google.
Maps Android API V1
A versão 1, identi�cada como Google Maps Android API V1, foi descontinuada em dezembro de 2012. Ela era implementada pela classe
MapView.
A principal limitação dessa versão consistia em que só era possível exibir um mapa de cada vez por tela, o que era uma grande desvantagem
para o tablets.
Maps Android API V2
Na mesma data, a Google lançou a Google Maps Android API V2. Além de um ganho signi�cativo no desempenho, esta foi criada para
suportar visualizações 2D e 3D. Inclusive, quando a visualização estiver bastante perto, poderá ocorrer automaticamente a comutação da
visualização de 2D para 3D, caso a cidade possua visualização 3D.
A principal diferença para a API V1 é que passamos a utilizar fragments, conceito este que estudamos em nossa aula 5.
De uma forma resumida, podemos dizer que substituímos o uso de MapView por MapFragments.
GERANDO CHAVE DE ACESSO
Para que nossos mapas funcionem, precisamos criar uma chave de autenticação no serviço Google. Isso só é possível se possuirmos uma
conta da Google.
Clique aqui (glossário) para acessar a criação desta chave.
Primeiramente, vamos criar um projeto. Clique aqui (glossário) e conheça o passo-a-passo.
https://console.developers.google.com/
http://estacio.webaula.com.br/cursos/gon283/galeria/aula10/docs/pdf_aula10_slide03.pdf
19/03/2021 Disciplina Portal
estacio.webaula.com.br/Classroom/index.asp?191C757E76=48402D3F2A49B7F19DC3C17C0F7D5F6755F495C453DDA5ED2325A06E8F072… 4/16
CONFIGURANDO PERMISSÕES DO SISTEMA
Outro ponto necessário para que nossos aplicativos rodem com Google Maps é a con�guração de algumas permissões no arquivo
AndroidManifest.xml, visto que, por padrão, os aplicativos básicos não possuem permissões associadas.
A seguir, são apresentadas algumas das principais permissões usadas por aplicativos Android.
<uses-permission android:name=“android.permission.INTERNET” /> 
• Permite o acesso à Internet. 
 
<uses-permission android:name=“android.permission.ACESS_NETWORK_STATE” /> 
• Permite a leitura do estado da rede. 
 
<uses-permission android:name=“android.permission.WRITE_EXTERNAL_STORAGE” /> 
• Permite gravar informações no SD card. 
 
<uses-permission android:name=“android.permission.READ_EXTERNAL_STORAGE” /> 
• Permite ler informações no SD card. 
 
<uses-permission android:name=“com.google.android.providers.gsf.permission.READ_GSERVICES” /> 
• Permite acessar os serviços da Google. 
 
<uses-permission android:name=“android.permission.ACCESS_COARSE_LOCATION” /> 
• Permite acessar o GPS por triangulação de antenas. 
 
<uses-permission android:name=“android.permission.ACCESS_FINE_LOCATION” /> 
• Permite acessar o GPS por hardware. 
EXEMPLO
<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
 package="profoswaldo.com.aularecursosextras_1"> 
 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
 <application 
 android:allowBackup="true" 
 android:icon="@mipmap/ic_launcher" 
 android:label="@string/app_name" 
 android:supportsRtl="true" 
 android:theme="@style/AppTheme"> 
Para mais detalhes sobre as permissões dos sistema, acesse o link: https://developer.android.com/guide/topics/security/permissions.html?
hl=pt-br (glossário)
CONFIGURANDO CHAVE DE ACESSO
https://developer.android.com/guide/topics/security/permissions.html?hl=pt-br
19/03/2021 Disciplina Portal
estacio.webaula.com.br/Classroom/index.asp?191C757E76=48402D3F2A49B7F19DC3C17C0F7D5F6755F495C453DDA5ED2325A06E8F072… 5/16
Além das permissões do sistema, precisamos con�gurar a chave de acesso em nosso arquivo AndroidManifest.xml.
O exemplo abaixo traz um pequeno trecho de código demonstrando essa con�guração:
Atenção!
Não se esqueça de que a chave acima, indicada pela seta vermelha,
corresponde a que criamos. Substitua pela sua.
DECLARANDO DEPENDÊNCIA NO ARQUIVO APP/BUID.GRADLE
Para usar o Google Play Services, também precisamos declarar a dependência na build.gradle (Módulo: app) de arquivos e sincronizar os
arquivos Gradle.
Para facilitar, veja na imagem abaixo a declaração dessa dependência:
19/03/2021 Disciplina Portal
estacio.webaula.com.br/Classroom/index.asp?191C757E76=48402D3F2A49B7F19DC3C17C0F7D5F6755F495C453DDA5ED2325A06E8F072… 6/16
Atenção!
Pode ser que haja novas versões da biblioteca quando estiver
implementando seu exemplo. Fique à vontade para alterar.
Além disso, também precisamos con�gurar a versão do Google Play Service em nosso arquivo AndroidManifest.xml.
Isso é feito inserindo a tag abaixo dentro da application e não da activity:
EXEMPLO COM MAPAS
Para usar o Google Play Services, também precisamos declarar a dependência na build.gradle (Módulo: app) de arquivos e sincronizar os
arquivos Gradle.
Para facilitar o entendimento, vamos desenvolver um pequeno exemplo implementando Mapa em um aplicativo Android.
Criaremos um projeto Android novo.
Editar AndroidManifest.xml
Como nosso aplicativo precisará acessar a Internet, estamos con�gurando a permissão para tal.
Também estamos con�gurando a nossa chave de acesso aos serviços da Google.
19/03/2021 Disciplina Portal
estacio.webaula.com.br/Classroom/index.asp?191C757E76=48402D3F2A49B7F19DC3C17C0F7D5F6755F495C453DDA5ED2325A06E8F072… 7/16
Não se esqueça de, quando for implementar, substituir pela sua chave.
A tela abaixo ilustra essas con�gurações:
Implementar layouts
Chegou a vez do layout referente ao nosso mapa propriamente dito.
Precisamos adicionar um objeto Fragment à nossa Activity que processará o mapa.
Poderíamos adicionar o fragment via código Java, mas a forma mais fácil de fazer isso é adicionando um elemento <fragment> ao arquivo de
layout.
No arquivo content_main.xml, de�nimos apenas o fragment referente ao nosso mapa.
Isso é demonstrado na imagem abaixo:
Como já discutimos anteriormente o aninhamento de layouts, optamos por desenvolver o layout de nossa tela no arquivo activity_main.xml,
onde estamos efetuado o aninhamento do layout, referente ao mapa, na linha <include layout="@layout/content_main" />.
Isso é demonstrado na tela abaixo:
Implementar MainActivity.java
19/03/2021 Disciplina Portal
estacio.webaula.com.br/Classroom/index.asp?191C757E76=48402D3F2A49B7F19DC3C17C0F7D5F6755F495C453DDA5ED2325A06E8F072… 8/16
Chegou a vez de nossa atividade principal, codi�cada no arquivo MainActivity.java.
Devido ao tamanho de nosso código, ela foi ilustrada em duas telas:
Além dos vários códigos discutidos em exemplos de outras aulas, encontramos algumas novidades com relação a classes e interfaces sendo
implementadas. Clique aqui (glossário)e conheça.
LOCALIZAÇÃO EM ANDROID
No desenvolvimento de aplicativos Android, o recurso de posicionamento geográ�co é muito explorado.
Muitos aplicativos usam as coordenadas de latitude e longitude para informar ao usuário onde ele está localizado, como, por exemplo, os
aplicativos de navegação GPS (Global Positioning System).
Antigamente, usávamos a classe LocationManager para obter a localização GPS.
Para acessar o provedor GPS, esta classe possuía várias constantes, das quais podemos destacar:
http://estacio.webaula.com.br/cursos/gon283/galeria/aula10/docs/pdf_aula10_slide11.pdf
19/03/2021 Disciplina Portal
estacio.webaula.com.br/Classroom/index.asp?191C757E76=48402D3F2A49B7F19DC3C17C0F7D5F6755F495C453DDA5ED2325A06E8F072… 9/16
CONSUMO DE BATERIA
Um grande desa�o que precisava ser vencido era o consumo de bateria. Isso ocorria pois a maioria dos aplicativos não fazia as otimizações
necessárias, no que tange ao uso do GPS, utilizando, assim, recursos demais e implicando alto consumo de bateria.
Hoje a Google criou o Fused Location Provider. Este encapsula os provedores GPS_PROVIDER e NETWORK_PROVIDER de forma transparente,
tornando muito mais simples o desenvolvimento. Sem falar no ganho expressivo que temos na otimização de recursos e, consequentemente,
de bateria.
Atenção
, Além disso, esse provedor usa diferentes sensores do dispositivo para de�nir se um usuário está andando, andando de bicicleta, dirigindo um carro ou
apenas andando, a �m de ajustar a frequência de atualizações da localização.
COMO FAZER USO DE UMA API DO GOOGLE PLAY SERVICES?
Para que possamos fazer uso de qualquer API do Google Play Services, precisamos primeiramente nos conectar ao Google.
Também precisamos implementar um objeto do tipo LocationRequest. Através dele con�guraremos não só a precisão mas o intervalo de
tempo com o qual se deseja obter as coordenadas.
Vamos a um exemplo para que possamos entender na prática.
19/03/2021 Disciplina Portal
estacio.webaula.com.br/Classroom/index.asp?191C757E76=48402D3F2A49B7F19DC3C17C0F7D5F6755F495C453DDA5ED2325A06E8F07… 10/16
Exemplo de Localização
Arquivo AndroidManifest.xml
Já discutimos anteriormente as con�gurações necessárias para a execução de mapas e localização em Android. Por isso, apresentaremos
somente o arquivo AndroidManifest.xml de nosso exemplo.
Arquivo strings.xml
Abaixo é ilustrado o arquivo strings.xml, onde são con�guradas as strings que serão exibidas em nossa tela:
Arquivo activity_main.xml
Agora é a vez de implementar nosso layout. É fácil notar que o arquivo activity_main.xml é bastante simples.
Apenas utilizaremos componentes discutidos e largamente implementados em aulas anteriores:
Arquivo MainActivity.java
Finalmente, vamos implementar nosso arquivo MainActivity.java.
Devido ao tamanho de nosso código, foi necessário dividir em 4 imagens, conforme demonstrado abaixo:
19/03/2021 Disciplina Portal
estacio.webaula.com.br/Classroom/index.asp?191C757E76=48402D3F2A49B7F19DC3C17C0F7D5F6755F495C453DDA5ED2325A06E8F07… 11/16
Observe que nossa activity implementa a interface com.google.android.gms.location.LocationListener. Com isso, somos obrigados a
implementar o método void onLocationChanged(Location location), que recebe por parâmetro um objeto do tipo Location toda vez que o
Android tiver uma nova localização.
Nesse mesmo método, estaremos exibindo em nossa tela as coordenadas de latitude e longitude através de dois TextViews.
Isso pode ser observado no trecho de nosso código abaixo:
19/03/2021 Disciplina Portal
estacio.webaula.com.br/Classroom/index.asp?191C757E76=48402D3F2A49B7F19DC3C17C0F7D5F6755F495C453DDA5ED2325A06E8F07… 12/16
@Override 
 public void onLocationChanged(Location location) { 
 setLatitude(location.getLatitude()); 
 setLongitude(location.getLongitude()); 
 Toast.makeText(getApplicationContext(), "Nova localização recebida", 
Toast.LENGTH_LONG).show(); 
 textViewLatitude.setText(getString(R.string.latitude_string) +" "+ getLatitude()); 
 textViewLongitude.setText(getString(R.string.longitude_string) +" "+ getLongitude()); 
 } 
Antes de fazer a conexão, devemos veri�car se o Google Play Services está instalado no dispositivo. Para esse propósito, foi criado o método
checkPlayServices(), chamado em nosso exemplo de onCreate().
Observe que estamos fazendo uso do método isGooglePlayServicesAvailable() da classe GooglePlayServicesUtil, que veri�ca se o Google Play
Services está instalado e ativo no dispositivo.
Seu retorno corresponde ao código de status, indicando se houve algum erro ou não.
Para não termos que decorar os valores dos erros, estamos lançando mão da classe ConnectionResult, que possui várias constantes
referentes a esse status.
Entre estas, podemos destacar:
• SUCCESS: Conexão realizada com sucesso.
• SERVICE_MISSING: Google Play Services não disponível neste dispositivo.
• SERVICE_VERSION_UPDATE_REQUIRED: Versão do Google Play Services instalada está desatualizada.
• SERVICE_DISABLED: Versão do Google Play Services instalada está desativada.
• SERVICE_INVALID: Versão do Google Play Services instalada é inválida.
Caso não haja sucesso na conexão, podemos veri�car se o erro pode ser resolvido por uma ação do usuário, através do método
isUserRecoverableError() da classe GooglePlayServicesUtil.
Para facilitar a visualização, abaixo temos o trecho de código responsável por esta veri�cação:
private boolean checkPlayServices() { 
 int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this); 
 if (resultCode != ConnectionResult.SUCCESS) { 
 if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) { 
 Toast.makeText(getApplicationContext(), 
 "Erro. Efetue o download google play services", Toast.LENGTH_LONG) 
 .show(); 
 } else { 
 Toast.makeText(getApplicationContext(),"Erro.", Toast.LENGTH_LONG).show(); 
 finish(); 
 } 
Dando continuidade à análise do código, podemos observar, no método onCreate(), que, após veri�car se o serviço está disponível, estamos
executando o método startFusedLocation(), desenvolvido para efetuar a conexão ao Google Play Services.
Neste, criamos o objeto do tipo GoogleApiClient, caso não exista.
Para criarmos, precisamos instanciar esse objeto com a linha new GoogleApiClient(x), onde x corresponde ao contexto a ser usado pela
conexão.
A partir daí, essa classe nos oferece uma série de métodos, dos quais, para estabelecer a conexão, destacam-se:
19/03/2021 Disciplina Portal
estacio.webaula.com.br/Classroom/index.asp?191C757E76=48402D3F2A49B7F19DC3C17C0F7D5F6755F495C453DDA5ED2325A06E8F07… 13/16
Para realizar a conexão, basta chamar o método connect().
Vejamos, então, nosso código do método startFusedLocation():
public void startFusedLocation() { 
 if (googleApiClient == null) { 
 googleApiClient = new GoogleApiClient.Builder(this).addApi(LocationServices.API) 
 .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() { 
 @Override 
 public void onConnectionSuspended(int cause) { } 
 @Override 
 public void onConnected(Bundle connectionHint) { } 
 }) 
 .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener(){ 
 @Override 
 public void onConnectionFailed(ConnectionResult result) { } 
 }) 
 .build(); 
 googleApiClient.connect(); 
 } else { 
 googleApiClient.connect(); 
 } 
 } 
Con�guramos a API de localização, no método addApi(), através da constante LocationServices.API.
É importante saber que existem muitas outras API que podem ser con�guradas através desse método como, por exemplo, Drive.API, referente
ao Google Drive.
Estamosregistrando no método addConnectionCallbacks o ouvinte referente à nossa conexão.
A interface GoogleApiClient.ConnectionCallbacks exige que sejam implementados dois métodos:
Já no método addOnConnectionFailedListener(), estamos registrando o ouvinte referente à falha de conexão. A interface
GoogleApiClient.OnConnectionFailedListener() nos obriga a implementar o método onConnectionFailed(), que é chamado quando ocorre um
erro de conexão.
Para efetuar a conexão propriamente dita, usamos o método connect() do objeto GoogleApiClient. Já para desconectar, apenas precisamos
chamar o método disconnect().
Para �nalizar, foi desenvolvido o método registerRequestUpdate(), chamado no onCreate(), após o método startFusedLocation().
19/03/2021 Disciplina Portal
estacio.webaula.com.br/Classroom/index.asp?191C757E76=48402D3F2A49B7F19DC3C17C0F7D5F6755F495C453DDA5ED2325A06E8F07… 14/16
Veja o seu código abaixo:
public void registerRequestUpdate(final LocationListener listener) { 
 locationRequest = LocationRequest.create(); 
 locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
 locationRequest.setInterval(1000); 
 new Handler().postDelayed(new Runnable() { 
 @Override 
 public void run() { 
try { 
 LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, 
 locationRequest, listener); 
 } catch (SecurityException e) { 
 e.printStackTrace(); 
 } catch (Exception e) { 
 e.printStackTrace(); 
 if (!isGoogleApiClientConnected()) { 
 googleApiClient.connect(); 
 } 
 registerRequestUpdate(listener); 
 } 
 } 
 }, 1000); 
 } 
CLASSE LOCATIONREQUEST
Embora grande parte do código já seja de seu conhecimento, temos algumas novidades. Entre elas a classe LocationRequest.
Através dela, podemos efetuar con�gurações referentes à atualização da localização, como a precisão e o intervalo de tempo com as quais
desejamos receber as coordenadas.
Para criar um objeto desse tipo, basta instanciar a classe.
Essa classe também possui vários métodos e constantes, dentre as quais destacam-se:
Métodos:
setPriority:
De�ne a precisão do GPS. As constantes mais utilizadas são PRIORITY_HIGH_ACCURACY e PRIORITY_LOW_POWER.
setInterval:
Intervalo de tempo, em milissegundos, das atualizações do GPS.
setFastestInterval:
Intervalo mínimo de tempo, em milissegundos, das atualizações do GPS.
Constantes:
19/03/2021 Disciplina Portal
estacio.webaula.com.br/Classroom/index.asp?191C757E76=48402D3F2A49B7F19DC3C17C0F7D5F6755F495C453DDA5ED2325A06E8F07… 15/16
PRIORITY_HIGH_ACCURACY:
Retorna a localização mais precisa possível.
PRIORITY_LOW_POWER:
Retorna a localização aproximada visando economizar bateria.
PRIORITY_NO_POWER:
Não inicia o monitoramento do GPS, mas garante que, se outra aplicação o �zer, receberemos essa localização. Com isso, não há um
consumo adicional de energia.
MÉTODO REQUESTLOCATIONUPDATES()
Por último, temos o método requestLocationUpdates(), que efetivamente recupera a última localização conhecida pelo sistema.
Vamos executar nosso aplicativo e constatar uma tela similar à ilustrada abaixo:
Se desejar mais detalhes sobre as classes e interfaces implementadas em nosso exemplo, acessar os links:
https://developers.google.com/android/reference/com/google/android/gms/common/api/GoogleApiClient (glossário)
https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest (glossário)
https://developer.android.com/reference/android/location/LocationListener.html (glossário)
https://developers.google.com/android/reference/com/google/android/gms/common/GooglePlayServicesUtil#isGooglePlayServicesAvailable
(glossário)
https://developers.google.com/android/reference/com/google/android/gms/common/ConnectionResult (glossário)
https://developers.google.com/android/reference/com/google/android/gms/location/LocationServices (glossário)
https://developers.google.com/android/reference/com/google/android/gms/common/api/GoogleApiClient.OnConnectionFailedListener
(glossário)
https://developers.google.com/android/reference/com/google/android/gms/location/FusedLocationProviderApi (glossário)
https://developers.google.com/android/reference/com/google/android/gms/common/api/GoogleApiClient.ConnectionCallbacks (glossário)
ATIVIDADE
A classe que representa o mapa da Google e por meio da qual podemos controlar a visualização do mapa, nível de zoom, aparência e
localização é:
a) LatLng
b) Maker
c) GoogleApiClient
d) GoogleMap
e) LocationServices
Justi�cativa
https://developers.google.com/android/reference/com/google/android/gms/common/api/GoogleApiClient
https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest
https://developer.android.com/reference/android/location/LocationListener.html
https://developers.google.com/android/reference/com/google/android/gms/common/GooglePlayServicesUtil#isGooglePlayServicesAvailable(android.content.Context)
https://developers.google.com/android/reference/com/google/android/gms/common/ConnectionResult
https://developers.google.com/android/reference/com/google/android/gms/location/LocationServices
https://developers.google.com/android/reference/com/google/android/gms/common/api/GoogleApiClient.OnConnectionFailedListener
https://developers.google.com/android/reference/com/google/android/gms/location/FusedLocationProviderApi
https://developers.google.com/android/reference/com/google/android/gms/common/api/GoogleApiClient.ConnectionCallbacks
19/03/2021 Disciplina Portal
estacio.webaula.com.br/Classroom/index.asp?191C757E76=48402D3F2A49B7F19DC3C17C0F7D5F6755F495C453DDA5ED2325A06E8F07… 16/16
Glossário

Continue navegando