12.1: Introduzione a Google Maps

Condividi su:

Con questo articolo apriamo un nuovo capitolo dedicato a Google Maps e quindi alla localizzazione. Google Maps è uno degli innumerevoli servizi offerti da Google e tutto il suo potenziale può essere sfruttato all’interno di ogni app. Sono infatti molte quelle che si avvalgono di Maps, basti pensare che tra i template di default di Android Studio per la creazione di nuove activity ce n’è uno dedicato.





Per poterci approcciare a questo nuovo argomento, avremo ovviamente bisogno di un nuovo progetto per sperimentare le nuove nozioni. Visto che Android Studio offre un template già pronto per le activity con integrato Google Maps, sfrutteremo quello piuttosto che l’activity vuota. Durante il wizard di creazione scegliete quindi “Google Maps Activity”.

L’API Key

Terminati tutti i passaggi di creazione del progetto e la sua preparazione, Android Studio aprirà automaticamente una risorsa chiamata “google_maps_api.xml”. Qui sarà presente un commento “ToDo” con spiegato il da farsi e un valore da modificare.
In pratica non sarà possibile avviare l’app se prima non avremo ottenuto una API Key di Google Maps. Il processo è semplificato al massimo tramite un link generato ad hoc da seguire. Aprendolo in un qualsiasi browser (dovete essere loggati col vostro account Google) vi si presenterà una semplice schermata dove non dovrete fare altro che cliccare su “Continua”. Dopo un’attesa di qualche istante per la creazione del progetto e l’abilitazione dell’API Key si presenterà una nuova schermata col pulsante “Crea chiave API”. Cliccandovi verrà generate la chiavi e verrà aperta la dashboard della piattaforma Google APIs. All’interno di una finestra di dialogo sarà presente la chiave da inserire nel file aperto da Android Studio (al posto di “YOUR_KEY_HERE”). Verrà consigliato di porre delle restrizioni a questa, ma la nostra app non deve finire sul Play Store, quindi semplicemente copiamo la chiave e chiudiamo la finestra.

Questo passaggio è completato. Ovviamente potete seguire anche la procedura manuale, se ad esempio avete già un progetto registrato, simile a quella usata per Firebase, infatti nello stesso file trovate anche il certificato SHA1 e il nome package da utilizzare. Sfruttando il link fornito la piattaforma di Google riceverà questi dati tramite i parametri dell’URL.

Il codice di default

Aprendo MainActivity ci ritroveremo davanti a qualcosa di leggermente diverso da quanto visto finora:

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

    private GoogleMap mMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }


    /**
     * Manipulates the map once available.
     * This callback is triggered when the map is ready to be used.
     * This is where we can add markers or lines, add listeners or move the camera. In this case,
     * we just add a marker near Sydney, Australia.
     * If Google Play services is not installed on the device, the user will be prompted to install
     * it inside the SupportMapFragment. This method will only be triggered once the user has
     * installed Google Play services and returned to the app.
     */
    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        // Add a marker in Sydney and move the camera
        LatLng sydney = new LatLng(-34, 151);
        mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
    }
}

Per prima cosa la classe eredita da “FragmentActivity”, piuttosto che da “Activity” o da “AppCompatActivity”, inoltre implementa l’interfaccia “OnMapReadyCallBack”, che comporta l’override del metodo “onMapReady()”.

Non ci siamo mai occupati dei fragment, utilizzando esclusivamente le activity. Al momento ci basta sapere che questi possono essere visti come delle sub-activity, con un importante ruolo funzionale e un loro ciclo di vita. Mentre le activity posso funzionare tranquillamente senza alcun fragment, come abbiamo constatato finora, un fragment non può vivere senza un’activity che lo contenga. In genere, piuttosto che creare più activity, se ne crea una sulla quale si possono alternare più fragment.

Per ora non ci interessa nulla di più. All’interno dell'”onCreate()” vengono effettuate le solite operazioni di setup dell’activity. Viene settato il layout e istanziato un fragment apposito collegandolo al relativo widget all’interno del layout dell’activity.

Col metodo “getMapAsync()” viene settata la callback che verrà invocata quando un’istanza GoogleMap è pronta inizializzando il sistema mappe e la view. Come parametro bisogna fornire l’oggetto che implementa l’interfaccia “OnMapReadyCallback“, quindi in questo caso l’istanza dell’activity. Quando la mappa sarà pronta all’uso verrà invocato infatti il metodo “onMapReady()” che contiene tutte le operazioni da eseguire per effettuare il setup della mappa.

All’interno di quest’ultimo metodo viene assegnata l’istanza di GoogleMap al field della classe; istanziato un nuovo oggetto LatLng che contiene le coordinate, a titolo di esempio, di Sydney; alla mappa, rappresentata dall’istanza di GoogleMap, viene aggiunto un segnaposto nella posizione specificata dall’oggetto LatLng e settato un titolo; infine viene spostata la camera, cioè la vista, su quell’area.

Provando ad avviare l’app vi ritroverete con la mappa centrata su Sydney, indicata dal segnaposto. Con un tap sul segnaposto apparirà il titolo settato. Inoltre funzionano tutte le gesture più comuni, come il trascinamento per spostare la mappa o il pinch per zoomarla. Tutto questo senza aver scritto neanche una riga di codice e comunque con pochissime righe auto-generate.


Conclusioni

Se all’apertura della mappa, quindi dell’app, volete posizionarvi su un altro luogo, con tanto di segnaposto, sarà sufficiente creare un nuovo oggetto LatLng con le coordinate e passarlo ai metodi che settano il segnaposto e la vista all’interno di “onMapReady()”:

public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;

    // Add a marker in Sydney and move the camera
    LatLng sydney = new LatLng(-34, 151);
    LatLng colosseo = new LatLng(41.8902142,12.4900422);
    mMap.addMarker(new MarkerOptions().position(colosseo).title("Colosseo"));
    mMap.moveCamera(CameraUpdateFactory.newLatLng(colosseo));
}

Ottenere le coordinate di un luogo è relativamente semplice, basta ad esempio aprire Google Maps all’interno del browser e cercare il luogo in questione. Se analizziamo l’url della ricerca del Colosseo noteremo che sono presenti latitudine e longitudine:

https://www.google.it/maps/place/Colosseo/@41.8902142,12.4900422,17z/data=!3m1!4b1!4m5!3m4!1s0x132f61b6532013ad:0x28f1c82e908503c4!8m2!3d41.8902102!4d12.4922309

Questi due dati li trovate dopo la @. Altrimenti tasto destro sul segnaposto (sempre in Maps da browser) e “Che cosa c’è qui?” così da ottenere anche le coordinate con le varie informazioni.

Abbiamo introdotto Google Maps e visto come sfruttare questo servizio all’interno delle nostre app. Con questo articolo possiamo fermarci qui, dal prossimo inizieremo a vedere come sfruttare davvero questo servizio, iniziando a personalizzare la mappa.

Condividi su:

label, , , , ,

About the author