11
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-servi ces/ http://flavioestevam.com.br/app/tutorial-aplicativos-android/20-integrar-o-googl e-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 po de ser alcançado através de um módulo GPS (Global Positioning System), via torres celu lares ou via redes wifi. A plataforma Android contém o pacote android.location que provê a API que determina a 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 class ion.

06_localizacao

Embed Size (px)

Citation preview

Page 1: 06_localizacao

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.

Page 2: 06_localizacao

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.

Page 3: 06_localizacao

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"

Page 4: 06_localizacao

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

####

Page 5: 06_localizacao

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();

Page 6: 06_localizacao

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" />

Page 7: 06_localizacao

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

Page 8: 06_localizacao

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.

Page 9: 06_localizacao

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" />

Page 10: 06_localizacao

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;

Page 11: 06_localizacao

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]