ロード中…
テキスト

Colocando Mapa na Tela

No Manifesto da Aplicação

* Colocar a chave criada:

<meta-data

android:name="com.google.android.maps.v2.API_KEY"

android:value="API_KEY"/>

* Instalar Google Play Services Lib;

* Identificar a versão desta lib no AndroidManifest.xml;

Console

* Uso da SHA1;

<meta-data

android:name="com.google.android.gms.version"

android:value="@integer/google_play_services_version" />

Console

* Habilitar Google Maps for Android 2.0

Chave

* Prompt de comandos:

keytool -list -v -keystore "%USERPROFILE%\.android\debug.keystore" -alias androiddebugkey -storepass android -keypass android

Chave

Manifesto

Proprietário: CN=Android Debug, O=Android, C=US

Emissor: CN=Android Debug, O=Android, C=US

Válido de: Sun Jan 26 01:10:47 BRST 2014 a: Tue Jan 19 01:10:47 BRST 2044

Fingerprints do certificado:

MD5: E:22:F7:94:33:5D:35:1B:9E:91:F6:C9...

SHA1: 73:41:69:A2:98:5B:85:3A:E1:38:F6:C2:25:1A:83:77:62:71:93:73

SHA256: 83:7E:8C:AF:80:A6:92:13:4F:06:...

* Chave de produção ou de testes;

* SDK já provê chave de testes:

* OS X and Linux: ~/.android/

* Windows Vista and Windows 7:

C:\Users\your_user_name\.android\

* Gerar SHA1 desta chave;

<uses-permission android:name="android.permission.INTERNET" />

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />

<uses-feature

android:glEsVersion="0x00020000"

android:required="true"/>

Nova Android Key

View da Activity

<?xml version="1.0" encoding="utf-8"?>

<fragment xmlns:android="http://schemas.android.com/apk/res/android"

android:id="@+id/map"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:name="com.google.android.gms.maps.MapFragment"/>

Google Apis Console

Introdução

View da Activity

* https://code.google.com/apis/console

* Criar Projeto;

API faz parte do Google Services;

Precisa ser baixado no Android SDK Manager;

Mapas

Introdução

Importar projeto da Google Play Service;

Novo projeto deve apontar para esta biblioteca;

Introdução

Obrigado QCon;

Obrigado André;

Obrigado platéia;

Dúvidas?????

rogliariping@gmail.com

@mobilidadetudo

Quem eu Sou

Circle

Ricardo da Silva Ogliari;

Instrutor Globalcode;

Android Developer Sênior Easy Taxi;

Things Hacker Team;

StillRocker;

10 personalidades Open Hardware;

+- 250 publicações;

Campus Party, TDC, FISL, QCon..

Livro: Android - Do Básico ao Avançado

Controles no Mapa

* Circle e CircleOptions;

* Chamar atenção para o QConSP;

CircleOptions circleOptions = new CircleOptions()

.center(new LatLng(-23.608616, -46.697124))

.fillColor(Color.argb(100, 0, 0, 255))

.strokeColor(Color.GREEN)

.radius(2000);

Circle circle = mMap.addCircle(circleOptions);

* Classe UiSettings é a chave;

* GoogleMap.getUiSettings();

* UiSettings.setZoomControlsEnabled(boolean);

* UiSettings.setCompassEnabled(boolean);

* UiSettings.setMyLocationButtonEnabled(boolean);

* UiSettings.setScrollGesturesEnabled(boolean);

* UiSettings.setTiltGesturesEnabled(boolean);

* UiSettings.setRotateGesturesEnabled(boolean);

* GoogleMap.setOnMapClickListener;

Polygon

* Polygon e PolygonOptions;

* Demarcando a igreja da Sé;

PolygonOptions polOptions = new PolygonOptions();

polOptions.add(

new LatLng(-23.551886,-46.634373),

new LatLng(-23.550784,-46.633847),

new LatLng(-23.550597,-46.634303),

new LatLng(-23.551718,-46.634829));

polOptions.strokeColor(Color.RED);

polOptions.fillColor(Color.argb(100, 0, 0, 255));

Polygon polygon = mMap.addPolygon(polOptions);

Mapa Direcionado

Polyline

* Polyline e PolylineOptions;

* Demarcando a rua Santa Efigência;

<fragment ...

xmlns:map="http://schemas.android.com/apk/res-auto"

map:cameraBearing="112.5"

map:cameraTargetLat="-23.551356"

map:cameraTargetLng="-46.633043"

map:cameraTilt="30"

map:cameraZoom="13"

map:mapType="normal"

map:uiCompass="true"

map:uiRotateGestures="true"

map:uiScrollGestures="true"

map:uiTiltGestures="true"

map:uiZoomControls="true"

map:uiZoomGestures="true" >

PolylineOptions lineOpts = new PolylineOptions();

lineOpts.add(new LatLng(-23.540206,-46.63776));

lineOpts.add(new LatLng(-23.539616,-46.638297));

lineOpts.add(new LatLng(-23.538062,-46.63937));

lineOpts.add(new LatLng(-23.537294,-46.639906));

lineOpts.add(new LatLng(-23.536586,-46.640486));

lineOpts.add(new LatLng(-23.535642,-46.641129));

lineOpts.color(Color.BLUE);

Polyline polyline = mMap.addPolyline(lineOpts);

Posicionamento e Zoom

Objeto Google Map

Menu

* Métodos animateCamera e moveCamera;

* Ações sobre o GoogleMap;

Introdução

Mapas

Simples Mapa na Tela

Objetos

Desenhando no Mapa

Interagindo com Mapa

Mudando a View

Location API

Métodos de Georeferenciamento

API

CameraPosition cameraPosition = new CameraPosition.Builder()

.target(new LatLng(-37.81319, 144.96298))

.zoom(17)

.bearing(90) //leste

.tilt(60) //ângulo para 60 graus

.build();

mMap.animateCamera(

CameraUpdateFactory.newCameraPosition(cameraPosition)

);

private GoogleMap mMap;

...

mMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();

Shapes

3D

Só dar zoom e mudar ângulo;

NADA de código;

Posicionamento e Zoom

* Polyline

* Polygon

* Circle

* Métodos animateCamera e moveCamera;

Tipos de Mapas

mMap.animateCamera(CameraUpdateFactory.zoomTo(12));

mMap.animateCamera(CameraUpdateFactory.zoomOut());

mMap.animateCamera(CameraUpdateFactory.zoomTo(10), 2000,null);

mMap.moveCamera(

CameraUpdateFactory.newLatLngZoom(LatLng, 15)

);

* Ações sobre o GoogleMap;

GoogleMap map;

...

// Sets the map type to be "hybrid"

map.setMapType(GoogleMap.MAP_TYPE_HYBRID);

map.setMapType(GoogleMap.MAP_TYPE_NONE);

map.setMapType(GoogleMap.MAP_TYPE_NORMAL);

map.setMapType(GoogleMap.MAP_TYPE_SATELLITE);

map.setMapType(GoogleMap.MAP_TYPE_TERRAIN);

POI - Point Of Interest

Geolocalização no Android

* Uso das classes Marker e MarkerOptions

LatLng latLng = new LatLng(-23.608616, -46.697124);

MarkerOptions mo = new MarkerOptions()

.position(latLng)

.title("QCon SP")

.snippet("International Software Development Conference");

mMap.addMarker(mo);

Opções para o Marker

Cliques no Marker

Onde será o clique?

Position: Latitude e longitude;

Anchor: ponto de âncora da imagem, padrão é no centro inferior;

Alpha: transparência;

Title;

Snippet;

Icon;

Draggable;

Visible;

Icon;

Rotation;

mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {

@Override

public boolean onMarkerClick(Marker marker) { }

});

mMap.setOnInfoWindowClickListener(new oogleMap.OnInfoWindowClickListener() {

@Override

public void onInfoWindowClick(Marker marker) { }

});

Mapas Profissionais

Exemplo de PendingIntent

public class ActivityRecognitionIntentService extends IntentService {

protected void onHandleIntent(Intent intent) {

if (ActivityRecognitionResult.hasResult(intent)) {

ActivityRecognitionResult r = ActivityRecognitionResult.extractResult(intent);

DetectedActivity mostProbableActivity = r.getMostProbableActivity();

int activityType = mostProbableActivity.getType();

switch(activityType) {

case DetectedActivity.IN_VEHICLE:

return "in_vehicle";

case DetectedActivity.ON_BICYCLE:

return "on_bicycle";

case DetectedActivity.ON_FOOT:

return "on_foot";

...

}

}

}

LocationRequest

Location Service API

Preciso repetir? É fácil...

mLocationRequest = LocationRequest.create();

mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

mLocationRequest.setInterval(5000);

//EXATIDÃO ALTA = GPS - AGPS

//AndroidManifest

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

ActivityRecognitionClient rc = new ActivityRecognitionClient(this, this, this);

rc.requestActivityUpdates(

DETECTION_INTERVAL_MILLISECONDS,

mActivityRecognitionPendingIntent);

rc.disconnect();

* Serviço que fica requisitando a localização;

* Através de um cliente (LocationClient) somente requisitamos esta informações;

* Simples assim..

Cell ID

Estações Rádio Base estão em um ponto geográfico;

Basta saber qual célula o smartphone está;

Console

* Habilitar Google Maps for Android 2.0

Monitoramento de Atividades

* Android monitora mudanças de estados no usuário e avisa seu aplicativo!!!

* Permissão especial: com.google.android.gms.permission.ACTIVITY_RECOGNITION;

* Client específioc para esta finalidade: ActivityRecognitionClient;

Código, Código, Código

LocationRequest

Esqueleto II

Esqueleto I

E agora?

private LocationClient mLocationClient;

protected void onCreate(Bundle savedInstanceState) {

mLocationClient = new LocationClient(this, this, this);

}

public void onConnectionFailed() {}

public void onConnected(Bundle connectionHint) {

Location location = mLocationClient.getLastLocation();

}

public void onDisconnected() {}

protected void onStart() {

super.onStart();

mLocationClient.connect();

}

protected void onStop() {

mLocationClient.disconnect();

super.onStop();

}

final TelephonyManager t = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

if (t.getPhoneType() == TelephonyManager.PHONE_TYPE_GSM) {

final GsmCellLocation location = (GsmCellLocation) telephony.getCellLocation();

if (location != null) {

location.getLac();

location.getCid();

t.getNetworkOperator();//MCCMNC

}

}

mLocationRequest = LocationRequest.create();

mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

mLocationRequest.setInterval(5000);

//HIGH_ACCURACY: GPS..

//Métodos de Posicionamento precisam de permissão

AndroidManifest.xml

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

public class MainActivity extends Activity implements

GooglePlayServicesClient.ConnectionCallbacks, GooglePlayServicesClient.OnConnectionFailedListener{

protected void onCreate(Bundle savedInstanceState) {}

public void onConnectionFailed(ConnectionResult connectionResult) {}

public void onConnected(Bundle connectionHint) {}

public void onDisconnected() {}

}

* Open CellID;

* www.opencellid.org/cell/get?key=apikey&mnc=1&mcc=2&lac=200&cellid=234

Peguei a posição, e????

Geofence

* Passos para ouvir atualizações;

* Criar um LocationRequest: um descritivo das propriedades da requisição de localização: tempo, custo, método, dentre outros;

* Implementar LocationListener;

* Sobrescrever onLocationChanged, método que já recebe um Location;

* Requisitar ao LocationClient através do requestLocationUpdates;

* Criar cercas eletrônicas;

* Código permite alerta de entrada e saída em dada cerca;

* Mais de um Geofence ativos;

* Passos:

* Instância de Geofence;

* Método addGeofence na LocationClient;

* Implementar OnAddGeofencesResultListener;

* Criar PendingIntent que será o callback do listener;

Fazendo o LocationClient trabalhar

mLocationClient.requestLocationUpdates(mLocationRequest, this);

removeLocationUpdates(this);

LocationListener

Exemplo de PendingIntent

Intent intent = new Intent(this, MyPending.class);

PendingIntent pi = PendingIntent.getService(this, 0, intent, 0);

----------------

public class MyPending extends IntentService {

protected void onHandleIntent(Intent intent) {

int transitionType = LocationClient.getGeofenceTransition(intent);

if ( transitionType == Geofence.GEOFENCE_TRANSITION_ENTER)) {

...

}

}

}

Bônus Track - CellID

public class Main extends Activity implements

OnConnectionFailedListener, ConnectionCallbacks,

LocationListener{

@Override

public void onLocationChanged(Location loc) {

mMap.animateCamera(

CameraUpdateFactory.newLatLngZoom(new LatLng(loc.getLatitude(), loc.getLongitude()), 15));

}

}

Geofence

public class MainActivity extends Activity implements

OnAddGeofencesResultListener {

public void onAddGeofencesResult(int stCode, String[] ids) {}

...

Geofence g = new Geofence.Builder()

.setRequestId(getId())

.setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER)

.setCircularRegion(getLatitude(), getLongitude(), getRadius())

.setExpirationDuration(mExpirationDuration)

.build();

mLocationClient.addGeofences(List<Geofence>, PendingIntent, this)

...

Location Service