Android Google Maps v2 diegozabot@yahoo.it
Uso delle mappe Google v2 (1) Per poter utilizzare le mappe di Google v2 bisogna prima di tutto ottenere una API map key registrandosi sulla console delle api di Google. E' importante ricordare che Android utilizza due chiavi per riconoscere la paternità del software: una da utilizzare in fase di debug (assegnata direttamente da Eclipse) e una per la produzione effettiva (vedi capitolo sul deploy).
Uso delle mappe Google v2 (2) Di conseguenza anche per l'utilizzo delle mappe avremo due differenti map API key: una per il debug e una per la release. Per testare una applicazione con le mappe ci serve ottenere dalla console delle API di Google una map API key di debug, mediante il codice SHA-1 ottenuto dal debug.keystore. Per caricare l'applicazione nel Google Play ci servirà ottenere dalla console delle API di Google una map API key di release, mediante il codice SHA-1 ottenuto dalla release. keystore.
Ottenere una API map key (1) Passaggi: 1. ritrovare il debug.keystore 2. ottenere il codice SHA-1 3. iscriversi alla console delle API di Google 4. ottenere la API map key SDK minimo: 8 (2.2)!Attenzione! Le chiavi generate per la versione 1 delle mappe non sono valide per la versione 2
Ottenere una API map key (2) 1. ritrovare il debug.keystore In eclipse andare sul menu Window > Preferences Sotto il menu Android > Build osservare dove si trova il debug. keystore (solitamente si trova nella directory.android sotto la cartella utente)
Ottenere una API map key (3) 2. ottenere il codice SHA-1 Entrare in una finestra dos (cmd) e spostarsi nella cartella dove si trova il debug.keystore Eseguire il comando*: keytool -list -v -keystore debug.keystore -alias androiddebugkey storepass android -keypass android Notare il codice SHA-1 e copiarlo. Importante: questo è il codice SHA-1 di debug. * Se non parte il comando keytool, aggiungere alla path il percorso a java/jdk/bin
Ottenere una API map key (4) 3. iscriversi alla console delle API di Google Andare nella console delle API di Google e accedere con il proprio account Google: code.google.com/apis/console Creare un nuovo progetto Nella finestra API s attivare (on) il servizio Google Maps Android V2 e accettare la conseguente licenza d'uso
Ottenere una API map key (5) 4. ottenere la API map key Nella finestra Credentials creare un new Android Key: verrà richiesto il codice SHA-1 seguito dal package del progetto che utilizzerà le mappe* separato da un punto e virgola. Esempio: BB:0D:AC:74:D3:21:E1:43:67:71:9B:62:91:AF:A1:66:6E:44:5D:75;com.example.mappe Otterrete la vostra Android key di debug che comincia con le lettere AIzaSy... N.B. per ottenere una Android key di release procedere come sopra ma ottenendo il codice SHA-1 dalla release.keystore. *questo comporta che ogni progetto che utilizzi le mappe deve avere una nuova map API key
Applicazione con mappa (1) Una volta ottenuta la map API key creiamo una applicazione con le mappe: Procedimento: 1. scaricare il pacchetto Google play services SDK 2. importare la libreria nei progetti di Eclipse 3. creare una applicazione con le mappe 4. modificare il manifest 5. aggiungere un MapFragment mappa al layout 6. richiamare da codice la mappa
Applicazione con mappa (2) 1. scaricare il pacchetto Google play services SDK Le mappe sono comprese nei servizi di Google Play, quindi bisogna scaricare tale pacchetto. In Eclipse richiamare SDK manager (Window > Android SDK manager) e nella sezione Extras, scaricare Google Play services.
Applicazione con mappa (3) 2. importare la libreria nei progetti di Eclipse Prima di creare una applicazione che utilizzi le mappe dobbiamo importare nei progetti di Eclipse la libreria delle mappe: Android - File > Import > Existing Android Code Into Workspace arrivare fino alla cartella di installazione di android, selezionare la libreria che si trova in: androidsdk/extras/google/google_play_services/libproject/googleplay-services_lib attivare la copia nel workspace e importare la libreria.
Applicazione con mappa (4) 3. creare una applicazione con le mappe Creare una nuova applicazione android (ricordarsi del package con il quale si è creata la API key) Nelle proprietà del progetto (File > Properites > Android) indicare l utilizzo della libreria google-play-services_lib (Nello spazio Library utilizzare il pulsante add )
Applicazione con mappa (5) 4. modificare il manifest Nel manifest inserire i seguenti permessi prima del tag <application>: <permission android:name="com.example.mappe.permission.maps_receive" android:protectionlevel=" signature"></permission> <uses-permission android:name="com.example.mappe.permission.maps_receive"/> <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-permission android:name="android.permission.access_coarse_location" /> <uses-permission android:name="android.permission.access_fine_location" />
Applicazione con mappa (6) Nel manifest inserire anche i seguenti permessi Uso del opengl 2 per la grafica: <uses-feature android:glesversion="0x00020000" android:required="true"/> La map API key e la vesione del gms di google, dopo la chiusura di activity e prima di quella di application:... </activity> <meta-data android:name="com.google.android.maps.v2.api_key" android:value="aizasy****************************************"/> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version"/> </application>
Applicazione con mappa (7) 5. aggiungere un MapFragment mappa al layout Se il MapFragment occupa l'intera view utilizzare direttamente il fragment come layout principale. I MapFragment sono stati introdotti dalla versione 12 delle API. Nel caso volessimo sviluppare anche per versioni precedenti ci viene in soccorso la classe SupportFragment. Di seguito svilupperemo per entrambi i casi.
Applicazione con mappa (8) 5a. aggiungere un MapFragment mappa al layout ( API >= 12 ) Nell'xml dobbiamo avere un Fragment di tipo MapFragment. <?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"/>
Applicazione con mappa (9) 6a. richiamare da codice la mappa ( API >= 12 ) La MainActivity deriva da una normale Activity: public class MainActivity extends Activity { E per ottenere la mappa di classe GoogleMap si ricava con getfragmentmanager un oggetto castato a MapFragment. Il metodo getmap ritorna la mappa: private GoogleMap map; map=((mapfragment)getfragmentmanager().findfragmentbyid(r.id.map)).getmap();
Applicazione con mappa (10) 5b. aggiungere un MapFragment mappa al layout ( API < 12 ) Nell'xml dobbiamo avere un Fragment di tipo SupportMapFragment. <?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.supportmapfragment"/>
Applicazione con mappa (11) 6b. richiamare da codice la mappa ( API < 12 ) La MainActivity deriva da una FragmentActivity: public class MainActivity extends FragmentActivity { E per ottenere la mappa di clase GoogleMap si ricava con getsupportfragmentmanager un oggetto castato a SupportMapFragment. Il metodo getmap ritorna la mappa: private GoogleMap map; map=((supportmapfragment)getsupportfragmentmanager().findfragmentbyid(r.id.map)).getmap();
Posizionamento (1) Con qualsiasi SDK poi proseguiamo a creare delle costanti di riferimento di classe LatLng*: static final LatLng TRIESTE = new LatLng(45.636111, 13.804167); e dopo aver ottenuto la mappa utilizziamo il metodo movecamera map.movecamera( CameraUpdateFactory.newLatLngZoom(TRIESTE, 10)); TRIESTE è la posizione e 10 il valore di zoom. *Google maps e http://www.sunearthtools.com/dp/tools/conversion.php?lang=it per coordinate e conversione
Posizionamento (2) Mettendo tutto assieme (SDK >= 12): public class MainActivity extends Activity { static final LatLng TRIESTE = new LatLng(45.636111, 13.804167); 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(); map.movecamera(cameraupdatefactory.newlatlngzoom(trieste, 10)); } }
Posizionamento (3) Mettendo tutto assieme (SDK < 12): public class MainActivity extends FragmentActivity { static final LatLng TRIESTE = new LatLng(45.636111, 13.804167); private GoogleMap map; @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); map=((supportmapfragment)getsupportfragmentmanager(). findfragmentbyid(r.id.map)).getmap(); map.movecamera(cameraupdatefactory.newlatlngzoom(trieste, 10)); } }
Segnaposto Possiamo utilizzare il metodo addmarker per impostare un segnaposto sulla mappa: map.addmarker(new MarkerOptions().title("Trieste").snippet("Abitanti: 209.023").position(TRIESTE)); possiamo anche cambiare il segnaposto standard con uno custom aggiungendo alla dichiarazione di MarkerOption il metodo :.icon(bitmapdescriptorfactory.fromresource( R.drawable.bandiera))
Tipi di mappe Mediante il metodo setmaptype della classe GoogleMap posso decidere la tipologia di mappa. Posso scegliere tra: GoogleMap.MAP_TYPE_NONE GoogleMap.MAP_TYPE_NORMAL GoogleMap.MAP_TYPE_SATELLITE GoogleMap.MAP_TYPE_TERRAIN GoogleMap.MAP_TYPE_HYBRID nessuna mappa mappa stradale tipica mappa con foto satellite, senza strade ne etichette mappa topografica fotografie satellitari con strade ed etichette Esempio: map.setmaptype(googlemap.map_type_hybrid);