* R AMAN K AZHAMIAKIN O SCAR Z G IOVANNI D E ITT M. B UONARROTI, T RENTO A NDROID D EVELOPMENT M APPE
* * 1.MapFragment 2.Markers 3.MarkersDialog (infoWindow) 4.GPS 5.Tiles 6.Usare le tile di OperStreetMap Sommario
* *
* * InfoWindows, custom InfoWindows...
* * My position, custom markers, polylines, clusters...
* * Preparazione Installare i Google Play Services SDK ●Lanciare Android SDK Manager: cliccare Window > Android SDK Manager oppure ●Installare i Google Play services: scorrere fino in fondo la lista dei pacchetti, espandere Extras, scegliere Google Play services e installarli. ●Importare la libreria: Cliccare File > Import, scegliere Android > Existing Android Code into Workspace, cercare il progetto della libreria e importarla. Il percorso è /extras/google/google_play_services/libproject/google-play-services_lib/ Suggerimento: procedimento simile a come abbiamo importato appcompat!
* * Preparazione #2 Aggiungere i Google Play services al manifest Modificare il file AndroidManifest.xml e aggiungere la dichiarazione all’elemento. Questo include la versione di Google Play services. <meta-data android:name="com.google.android.gms.version" />
* * Preparazione #3 Per usare i server di Google Maps bisogna aggiungere una Maps API key all’app. La key è gratis, puoi usarla in qualsiasi tua applicazione e supporta infiniti utenti. È possibile ottenere la Maps API key dalla Google APIs Console fornendo il certificato con cui si “firma” l’app e il nome package. Ottenere la key richiede diversi passaggi: 1.Ottenere le informazioni del certificato dell’app 2.Registrare il progetto nella Google APIs Console e aggiungere le Maps API come servizio per il progetto 3.Richiedere una key o più 4.Aggiungere la key all’app e… iniziare a sviluppare!
* * Preparazione: certificato La Maps API key si basa su una breve stringa rappresentante il certificato digitale con cui viene firmata l’app, il SHA-1 fingerprint, che è unica e quindi usata per identificare la tua app. Ci sono due certificati: Debug certificate: generato dagli Android SDK tools quando si fa debug o si lancia l’app da Eclipse ad esempio. Da usare solo in testing! Release certificate: generato dagli Android SDK tools quando si esporta il file.apk per rilasciare l’app; si genera usando il programma keytool.
* * ●Cerchiamo il file debug.keystore: cercare la posizione cliccando Windows > Prefs > Android > Build. ●Se già in quelle opzioni non trovate la voce “SHA-1 fingerprint” usare il comando keytool -list -v -keystore "%USERPROFILE%\.android\debug.keystore" -alias androiddebugkey -storepass android -keypass android ●Si ottiene l’output: Certificate fingerprints: MD5: AE:9F:95:D0:A6:86:89:BC:A8:70:BA:34:FF:6A:AC:F9SHA1: BB:0D:AC:74:D3:21:E1:43:07:71:9B:62:90:AF:A1:66:6E:44:5D:75 Signature algorithm name: SHA1withRSA Version: 3 Preparazione: ottieni SHA-1 fingerprint da debug
* * ●Andare alla Google APIs Consolehttps://code.google.com/apis/console/ ●Creare un nuovo progetto ●Tra i servizi attivare Google Maps Android API v2 ●Selezionare API Access > Create New Android Key… ●Inserire la stringa fingerprint;package, es.: BB:0D:AC:74:D3:21:E1:43:67:71:9B:62:91:AF:A1:66:6E:44:5D:75;com.exa mple.android.mapexample ●Si ottiene una stringa simile a: AIzaSyBdVl-cTICSwYKrZ95SuvNw7dbMuDt1KG0 Preparazione: Google APIs Console
* * Nel AndroidManifest.xml, subito prima del tag di chiusura, inserire: Preparazione: aggiungi la key al progetto <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="API_KEY"/> dove API_KEY è la stringa ottenuta dalla console: AIzaSyBdVl-cTICSwYKrZ95SuvNw7dbMuDt1KG0
* * Preparazione: aggiungi i giusti permessi Aggiungo i permessi e la richiesta di uso delle OpenGL ES versione 2.
* * Preparazione: il fragment con la mappa Nel layout inserire il fragment in questa maniera (notare android:name)
* * Habemus Google Maps!
* * Markers Un marker è un icona visibile ad una certa posizione sulla mappa. Proprietà: Alpha - opacità Title - il titolo Snippet - la Descrizione Icon - Un’immagine che lo rappresenta Draggable - flag che indica se il marker è trascinabile Visible - nasconde o mostra il marker
* * mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap(); mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Hello world!")); Aggiungere un Marker
* * Custom MarkerDialog (InfoWindow) Possiamo scegliere di cambiare il fumetto che appare al click di un marker, per farlo dobbiamo: 1.implementare InfoWindowAdapter 1.getInfoWindow(Marker) viene sempre chiamato, cambia l’intero fumetto 2. getInfoContents(Marker) viene chiamato solo se il metodo precedente ritorna null. cambia solo il contenuto del fumetto. 2.chiamare il metodo.setInfoWindowAdapter(nostroAdapter) mMap.setInfoWindowAdapter(this).
* * Esempio di InfoWindowAdapter Personalizzato class MyInfoWindowAdapter implements InfoWindowAdapter { private final View mymarkerview; public MyInfoWindowAdapter() { mymarkerview = getLayoutInflater().inflate(R.layout.qualcosa, null,false); } public View getInfoWindow(Marker marker) { return mymarkerview; } public View getInfoContents(Marker marker) { return null; }
* * Ulteriori cose da sapere: ●Per cambiare il comportamento quando un fumetto viene tappato: ○ mMap.setOnInfoWindowClickListener(OnInfoWindowClickListe ner) Maggiori info al link: s/GoogleMap.OnInfoWindowClickListener.html s/GoogleMap.OnInfoWindowClickListener.html ●Per muovere la mappa, programmaticamente: ○mMap.moveCamera(CameraUpdateFactory.newLatLng(new LatLng(lat, long))); Tutte le opzioni disponibili su: maps/CameraUpdateFactory.html ●Tutto il resto su:
* * Conquistare il mondo... E adesso siete pronti per...
* * Localizzazione È possibile utilizzare il GPS e l’Android Network Location Provider per acquisire la posizione dell'utente. Anche se il GPS è più preciso, funziona solo all'aperto, consuma rapidamente la batteria e non restituisce la posizione velocemente. L’Android Network Location Provider determina la posizione dell'utente utilizzando le celle dei ripetitori, le reti Wi-Fi, risponde più velocemente e utilizza meno energia. Si può utilizzare sia il GPS e il Network Location Provider, o solo uno. Sono necessari questi permessi:
* * Localizzazione #2 // Ottengo una referenza al Location Manager del sistema LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); // Definisco un LocationListener che reagisce agli aggiornamenti della location LocationListener locationListener = new LocationListener() { public void onLocationChanged(Location location) { // Chiamato quando una nuova location è trovata faiQualcosaConLaNuovaLocation(location); } public void onStatusChanged(String provider, int status, Bundle extras) {} public void onProviderEnabled(String provider) {} public void onProviderDisabled(String provider) {} }; // Iscrivi il listener al Location Manager per avere gli aggiornamenti locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
* * Localizzazione #3 // In attesa ottieni l’ultima posizione conosciuta String locationProvider = LocationManager.NETWORK_PROVIDER; // oppure LocationManager.GPS_PROVIDER Location lastKnownLocation = locationManager.getLastKnownLocation(locationProvider); // Rimuovi il listener locationManager.removeUpdates(locationListener);
* * Cambiare le tile mMap.setMapType(GoogleMap.MAP_TYPE_NONE); TileProvider tileProvider = new UrlTileProvider(256, 256) public URL getTileUrl(int x, int y, int z) { try { String url = “ ”; return new URL(String.format(url, z, x, y)); } catch (MalformedURLException e) { return null; } }; mMap.addTileOverlay(new TileOverlayOptions().tileProvider(tileProvider));