Upload
giordanogil
View
212
Download
0
Embed Size (px)
Citation preview
8/20/2019 06_localizacao
http://slidepdf.com/reader/full/06localizacao 1/11
http://www.mobiltec.com.br/blog/index.php/tutorial-android-geolocalizacao/
http://www.frameworksystem.com/tutorial-google-maps-android-api-v2/
http://blog.caelum.com.br/usando-o-google-maps-e-gps-no-android/
http://code.tutsplus.com/tutorials/getting-started-with-google-maps-for-android-basics--cms-24635
http://www.androidhive.info/2015/02/android-location-api-using-google-play-services/
http://flavioestevam.com.br/app/tutorial-aplicativos-android/20-integrar-o-google-maps-no-android-app
http://techlovejump.com/android-gps-location-manager-tutorial/
http://developer.android.com/training/location/display-address.html
http://javapapers.com/android/android-location-tracker-with-google-maps/
http://x4srxr72nztev796.ml/android-location-tracking-app-tutorial/
https://www.pubnub.com/blog/2015-05-14-publishing-realtime-location-with-the-and
roid-mapbox-api/=========================================================
http://www.vogella.com/tutorials/AndroidLocationAPI/article.html
http://www.vogella.com/tutorials/AndroidGoogleMaps/article.html
=============================================================================
API de Localização do Android
- Determinando a geolocalização atual
A maioria dos dispositivos Android permitem determinar a sua geolocalização. Isso pode ser alcançado através de um módulo GPS (Global Positioning System), via torres celulares ou via redes wifi.
A plataforma Android contém o pacote android.location que provê a API que determinaa geo-posição.
- LocationManager
A classe LocationManager provê acesso ao serviço de localização do Android. Esse serviçermite o acesso aos provedores de localização, para registrar listeners da atualização e localização, alertas de proximidade, entre outros.
- LocationProvider
A classe LocationProvider é a superclasse dos diferentes provedores de localização que entregam a informação sobre a localização atual. Essa informação é armazenada na classion.
8/20/2019 06_localizacao
http://slidepdf.com/reader/full/06localizacao 2/11
O dispositivo Android pode ter vários LocationProviders disponíveis e é possível selecinar o que se dejseja utilizar. Na maioria dos casos temos os seguintes LocationProvider disponíveis:
------------------------------------------------ network
Uses the mobile network or WI-Fi to determine the best location. Might have a higher precision in closed rooms then GPS.
- gps
Use the GPS receiver in the Android device to determine the best location via satellites. Usually better precision than network.
- passive
Allows to participate in location of updates of other components to save energy----------------------------------------------
- Selecionando um LocationProvider através da classe Criteria
A fim de ter flexibilidade na seleção do melhor provedor de localização, utiliza-se um bjeto da classe Criteria, no qual pode ser definido como o provedor deve ser selecionado.
Pode-se registrar um objeto LocationListener na classe LocationManager para receber atualizações periódicas da geo-posição.
- Alerta de Proximidade
Também é possível registrar uma Intent que permite definir um alerta de proximidadede. Esse alerta será ativado se o dispositivo entrar em uma área dada pela latitude, longitude e raio.
- Forward e Reverse Geocoding
A classe Geocoder permite determinar as geo-coordenadas (longitude e latitude) de um determinado endereço, e possíveis endereços para uma dada geo-coordenada.
- Permissões de Acesso
Para poder acessar o sensor de GPS do dispositivo é necessário a permissão ACCESS_FINE
_LOCATION, caso apenas a localização aproximada seja necessária, utiliza-se a permissãoACCESS_COARSE_LOCATION.
- Solicitando que o usuário ative o GPS do dispositivo
O usuário pode decidir se o GPS está ativado ou não. Através do LocationManager é possíaber se o GPS está ativo, chamando o método isProviderEnabled(). Caso o mesmo não esteja ativo, você pode enviar o usuário para as configurações do dispositivo através de umntent com a ação Settings.ACTION_LOCATION_SOURCE_SETTINGS para a classe android.provider.Settings.
8/20/2019 06_localizacao
http://slidepdf.com/reader/full/06localizacao 3/11
###
LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE);boolean ativo = service.isProviderEnabled(LocationManager.GPS_PROVIDER);
// verifica se o o GPS está ativo ou não e caso não esteja, envia o usuário para as conigurações// A melhor solução é abrir uma caixa de diálogo sugerindo que o usuário vá para as conaçõesif (!ativo) { Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivity(intent);}
###
Tipicamente abre-se uma AlarmDialog para perguntar de o usuário quer ativar o GPSou se a abertura da aplicação deve ser cancelada. Não é possível ativar o GPS diretamendo código. O usuário tem que fazer isso.
- Usando o GPS e definindo a localização atual
Caso o GPS não esteja ativo no dispositivo, um objeto nulo é retornado ao tentar usar a classe LocationManager.
Há diversas formas de enviar geo-posições para o dispositivo de testes. Uma delas é pel depurador DDMS que vem com o Android SDK. Outra maneira é através de telnet. Na barra de títulos do emulador tem a porta do sispositivo. Basta ir no terminal e digitar:
telnet localhost 5554
Onde 5554 é a porta, no exemplo.
para enviar a posição digite o seguinte comando:
geo fix 13.24 52.31
- Usando a API de Localização do Android
No exemplo a seguir, veremos como implementar um aplicativo que usa a API de localização:
####layout_main.xml (REVISAR)
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" >
<LinearLayout android:id="@+id/linearLayout1" android:layout_width="match_parent" android:layout_height="wrap_content"
8/20/2019 06_localizacao
http://slidepdf.com/reader/full/06localizacao 4/11
android:layout_marginTop="40dip" android:orientation="horizontal" >
<TextView android:id="@+id/TextView01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dip" android:layout_marginRight="5dip" android:text="Latitude: " android:textSize="20dip" > </TextView>
<TextView android:id="@+id/TextView02" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="unknown" android:textSize="20dip" > </TextView> </LinearLayout>
<LinearLayout android:id="@+id/linearLayout2"
android:layout_width="match_parent" android:layout_height="wrap_content" >
<TextView android:id="@+id/TextView03" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dip" android:layout_marginRight="5dip" android:text="Longitute: " android:textSize="20dip" > </TextView>
<TextView android:id="@+id/TextView04" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="unknown" android:textSize="20dip" > </TextView> </LinearLayout>
</LinearLayout>####
Adicione as seguintes permissões no arquivo de manifesto:
- INTERNET
- ACCESS_FINE_LOCATION
- ACCESS_COARSE_LOCATION
####
8/20/2019 06_localizacao
http://slidepdf.com/reader/full/06localizacao 5/11
MainActivity.java (REVISAR)
package br.com.fuctura.exemplolocalizacao;
import android.app.Activity;import android.content.Context;import android.location.Criteria;import android.location.Location;import android.location.LocationListener;import android.location.LocationManager;import android.os.Bundle;import android.widget.TextView;import android.widget.Toast;
public class ShowLocationActivity extends Activity implements LocationListener { private TextView latituteField; private TextView longitudeField; private LocationManager locationManager; private String provider;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); latituteField = (TextView) findViewById(R.id.TextView02); longitudeField = (TextView) findViewById(R.id.TextView04);
// Get the location manager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); // Define the criteria how to select the locatioin provider -> use // default Criteria criteria = new Criteria(); provider = locationManager.getBestProvider(criteria, false);
Location location = locationManager.getLastKnownLocation(provider);
// Initialize the location fields if (location != null) { System.out.println("Provider " + provider + " has been selected."); onLocationChanged(location); } else { latituteField.setText("Location not available"); longitudeField.setText("Location not available"); } }
/* Request updates at startup */
@Override protected void onResume() { super.onResume(); locationManager.requestLocationUpdates(provider, 400, 1, this); }
/* Remove the locationlistener updates when Activity is paused */ @Override protected void onPause() { super.onPause();
8/20/2019 06_localizacao
http://slidepdf.com/reader/full/06localizacao 6/11
locationManager.removeUpdates(this); }
@Override public void onLocationChanged(Location location) { int lat = (int) (location.getLatitude()); int lng = (int) (location.getLongitude()); latituteField.setText(String.valueOf(lat)); longitudeField.setText(String.valueOf(lng)); }
@Override public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub
}
@Override public void onProviderEnabled(String provider) { Toast.makeText(this, "Enabled new provider " + provider, Toast.LENGTH_SHORT).show();
}
@Override public void onProviderDisabled(String provider) { Toast.makeText(this, "Disabled provider " + provider, Toast.LENGTH_SHORT).show(); }}####
- Google Maps API
A Google provê uma biblioteca para que possamos usar o Google Maps nas nossas apli
cações. A biblioteca provê a classe com.google.android.gms.maps.MapFragment e a classe MapView para exibir um componente de mapa.
Além disso, algumas informações adicionais são necessárias no arquivo de manifesto, conme mostrado a seguir:
###AndroidManifest.xml (REVISAR)
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.vogella.android.locationapi.maps" android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="17" android:targetSdkVersion="17" />
<permission android:name="com.vogella.android.locationapi.maps.permission.MAPS_RECEIVE" android:protectionLevel="signature" />
8/20/2019 06_localizacao
http://slidepdf.com/reader/full/06localizacao 7/11
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
<uses-permission android:name="com.vogella.android.locationapi.maps.permission.MAPS_RECEIVE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.vogella.android.locationapi.maps.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </activity>
<meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="your_apikey" /> </application>
</manifest>###
- Map Fragment
A classe MapFragment herda da classe Fragment e provê o gerenciamento de cliclo de vida e serviços para a exibição do widget GoogleMap. GoogleMap é a classe que mostra omapa. A classe MapFragment tem o métogo getMap() para acessar essa classe.
A classe LatLng pode ser usada para interagir com a classe GoogleView.
- Marcadores
Você pode criar marcadores no mapa através da classe Marker. Essa classe pode ser customizada.
A seguir, vemos um exemplo:
####MainActivity.java (REVISAR)
public class MainActivity extends Activity { static final LatLng HAMBURG = new LatLng(53.558, 9.927); static final LatLng KIEL = new LatLng(53.551, 9.993); private GoogleMap map;
@Override
8/20/2019 06_localizacao
http://slidepdf.com/reader/full/06localizacao 8/11
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)) .getMap();
if (map!=null){ Marker hamburg = map.addMarker(new MarkerOptions().position(HAMBURG) .title("Hamburg")); Marker kiel = map.addMarker(new MarkerOptions() .position(KIEL) .title("Kiel") .snippet("Kiel is cool") .icon(BitmapDescriptorFactory .fromResource(R.drawable.ic_launcher))); } }
###
Na classe GoogleMap é possível registrar um listener para os markers no mapa, atravésdo método setOnMarkerClickListener(OnMarkerClickListener). A classe OnMarkerClickListener define o método onMarkerClicked(Marker) que é chamado caso o marker seja c
licado.Similar a isso, é possível também ter listeners para eventos de arrastar e soltar e cliques na janela de informação.
- Armazenando a GoogleView em cache
O código a seguir foi extraído da documentação oficial do Android:
#### (REVISAR)static final LatLng HAMBURG = new LatLng(53.558, 9.927);static final LatLng KIEL = new LatLng(53.551, 9.993);
private GoogleMap map;... // Obtain the map from a MapFragment or MapView.
//Move the camera instantly to hamburg with a zoom of 15.map.moveCamera(CameraUpdateFactory.newLatLngZoom(HAMBURG, 15));
// Zoom in, animating the camera.map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);####
- Baixe e instale o Google Play Services
Abra o Android SDK Manager e instale os pacotes contidos em Extras -> Google Play Services.
- Obtendo a Google Map API Key
Para utilizar o Google Maps é necessário criar uma chave válida da API. Essa chave é grtuita, e é possível usá-la em qualquer das suas aplicações que utilizam a API de mapas,a mesma suporta um número ilimitado de usuários.
8/20/2019 06_localizacao
http://slidepdf.com/reader/full/06localizacao 9/11
É possível obter essa chave a partir do Google API Console (https://code.google.com/apis/console/). É necessário fornecer a chave de assinatura da sua aplicação e o nome d pacote.
Ela é baseada na chave utilizada para assinar o aplicativo durante o desenvolvimento.
- Criando uma chave SHA-1 de assinatura
É possível criar uma chave de assinatura através da ferramenta de linha de comando [keytool] que vem junto com o JDK.
keytool -list -v -alias androiddebugkey \-keystore <path_to_debug_keystore>debug.keystore \-storepass android -keypass android
Copie a saída da chave SHA-1, precisaremos dela posteriormenteRegistrando-se
Registre-se no Google API Console e ative o recurso Google Maps Android API v2.
- Crie uma chave para sua aplicação
[06_localizacao-01.png]
Informe o código SHA-1 obtido da keytool e o pacote da sua aplicação, separados por um ponto e vírgula.
[06_localizacao-02.png]
- Projeto de Exemplo
####AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.vogella.android.locationapi.maps" android:versionCode="1" android:versionName="1.0" >
<uses-sdk android:minSdkVersion="17" android:targetSdkVersion="17" />
<permission android:name="com.vogella.android.locationapi.maps.permission.MAPS_RECEIVE" android:protectionLevel="signature" />
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
8/20/2019 06_localizacao
http://slidepdf.com/reader/full/06localizacao 10/11
<uses-permission android:name="com.vogella.android.locationapi.maps.permission.MAPS_RECEIVE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.vogella.android.locationapi.maps.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
<meta-data android:name="com.google.android.maps.v2.API_KEY"
android:value="your_apikey" /> </application>
</manifest>####
- Ajuste o arquivo de Layout
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" tools:context=".MainActivity" >
<fragment android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" class="com.google.android.gms.maps.MapFragment" />
</RelativeLayout>
- Activity
package com.vogella.android.locationapi.maps;
import android.app.Activity;import android.os.Bundle;import android.view.Menu;
import com.google.android.gms.maps.CameraUpdateFactory;import com.google.android.gms.maps.GoogleMap;
8/20/2019 06_localizacao
http://slidepdf.com/reader/full/06localizacao 11/11
import com.google.android.gms.maps.MapFragment;import com.google.android.gms.maps.model.BitmapDescriptorFactory;import com.google.android.gms.maps.model.LatLng;import com.google.android.gms.maps.model.Marker;import com.google.android.gms.maps.model.MarkerOptions;
public class MainActivity extends Activity { static final LatLng HAMBURG = new LatLng(53.558, 9.927); static final LatLng KIEL = new LatLng(53.551, 9.993); private GoogleMap map;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)) .getMap(); Marker hamburg = map.addMarker(new MarkerOptions().position(HAMBURG) .title("Hamburg")); Marker kiel = map.addMarker(new MarkerOptions() .position(KIEL) .title("Kiel") .snippet("Kiel is cool") .icon(BitmapDescriptorFactory
.fromResource(R.drawable.ic_launcher))); // Move the camera instantly to hamburg with a zoom of 15. map.moveCamera(CameraUpdateFactory.newLatLngZoom(HAMBURG, 15));
// Zoom in, animating the camera. map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null); }
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true;
}
}
- Executando e Testando
[06_localizacao-03.webp]