Autore Topic: [facile] Tutorial GPS e MapView (deprecato)  (Letto 57721 volte)

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
[facile] Tutorial GPS e MapView (deprecato)
« il: 05 Marzo 2010, 01:02:32 CET »
+9
Questo tutorial si riferisce alla versione 1 della libreria, che è stata ufficialmente deprecata. Si prega di non utilizzare più questo tutorial.

Livello di difficoltà: facile
Versione SDK utilizzata: 1.6
Link al file compresso del progetto eclipse: file in allegato

In questo tutorial cercherò di spiegare come creare una semplice applicazione che riceve informazioni dal GPS e le visualizza sullo schermo utilizzando LocationManager e MapView.


MapView è una specializzazione della classe view che Android mette a disposizione per l'interazione coi cosiddetti servizi Location Based che interagiscono con le informazioni di posizione fornite dal dispositivo attraverso GPS o altri meccanismi.

Le API Google Maps permettono la realizzazione di applicazioni Location Based che utilizzano come principali informazioni quelle relative alla location dell'utente.
Android mette a disposizione i seguenti strumenti che si possono dividere in:
  • Visualizzazione, controllo opzioni e personalizzazione delle Google Maps
  • Servizi di Georeferenziazione
  • Integrazione coi sistemi GPS

MapView e MapActivity
Queste classi devono sempre essere utilizzate insieme. Questo perché MapView è una specializzazione di View, e necessita di alcuni servizi forniti da MapActivity, specializzazione della classe Activity.
Per poter utilizzare le funzionalità di queste classi occorre scaricare, installare e utilizzare le Google API (avendo cura di impostarle anche come Target dell'AVD).
Inoltre occorre procurarsi una map-key, ovvero un codice che Google ci deve fornire per poter accedere ai servizi di Map.

Per ottenere il map-key è sufficiente seguire questo tutorial.

Abilitare i permessi
Per poter utilizzare le funzionalità delle classi MapView e MapActivity occorre modificare i permessi all'interno dell'AndroidManifest.xml inserendo le seguenti stringhe:
Codice (XML): [Seleziona]
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_GPS" />

Infine è necessario indicare l'utilizzo delle Google Maps API mediante la seguente definizione all'interno dell'elemento <application/>

Codice (XML): [Seleziona]
<uses-library android:name="com.google.android.maps" />
Come si può osservare dal codice in allegato, per poter utilizzare un oggetto MapView all'interno di un'Activity è necessario che quest'ultima estenda la classe MapActivity.
Codice (Java): [Seleziona]
[]
public class TutorialGPSeMapView extends MapActivity {
   private TextView tvLatitudine;
[]

Personalizzare una MapView
MapActivity è una classe astratta che richiede l'implementazione della seguente operazione:
Codice (Java): [Seleziona]
protected boolean isRouteDisplayed() {
   return false;
}

Si tratta di un metodo che specifica se l'applicazione sta visualizzando informazioni di routing, ovvero relative ai modi di percorrenza delle strade.
Ha una funzione puramente amministrativa e ogni applicazione che utilizza le Google Maps deve specificare questo tipo di informazione, perché definito a termini di licenza.

Personalizzare una MapView
Osservando le API della classe MapView si noti il metodo public MapController getController() permette di ottenere il riferimento ad un oggetto, descritto dalla classe MapController del package com.google.android.maps, che contiene le diverse operazioni per:
  • Centrare la mappa a una particolare location
  • Gestire delle animazioni sul posizionamento della mappa
  • Gestire lo zoom

Centrare la mappa
È possibile centrare la mappa in corrispondenza di una posizione geografica identificata da un'istanza della classe GeoPoint (descrive un punto sulla mappa in termini di latitudine e longitudine):
Codice (Java): [Seleziona]
public GeoPoint(int latitudeE6, int longitudeE6)

[]
Double geoLat = location.getLatitude()*1E6;
Double geoLng = location.getLongitude()*1E6;
GeoPoint point = new GeoPoint(geoLat.intValue(), geoLng.intValue());
[]

Animazione
Molto interessante è la possibilità di eseguire un'animazione dal punto visualizzato correntemente a un altro punto specificato.
Per fare questo si utilizza uno dei seguenti overload del metodo animateTo() di MapController:
Codice (Java): [Seleziona]
public void animateTo(GeoPoint point)Nel codice allegato:
Codice (Java): [Seleziona]
mapController.animateTo(point)
Pan
Per abilitare il trascinamento della mappa (pan) è necessario eseguire il seguente metodo:
Codice (Java): [Seleziona]
public void setClickable (boolean clickable)Nel codice allegato:
Codice (Java): [Seleziona]
mapView.setClickable(true);
Zoom
Android mette a disposizione un componente automatico di gestione dello zoom, che compare e scompare quando l'utente tocca il display.
Si tratta di un'opzione configurabile attraverso il seguente metodo
Codice (Java): [Seleziona]
public void setBuiltInZoomControls(boolean on)Nel codice allegato:
Codice (Java): [Seleziona]
mapView.setBuiltInZoomControls(true);
GPS e LocationManager
Il LocationManager è uno strumento con cui è possibile ricevere notifiche sulla posizione del dispositivo.
Si tratta di un servizio di sistema di cui è possibile ottenere un riferimento col seguente metodo della classe Context:
Codice (Java): [Seleziona]
public abstract Object getSystemService (String name)Cui viene passato come parametro il valore della costante Context.LOCATION_SERVICE

Le informazioni relative alla posizione possono essere ottenute dal LocationManager in modi diversi, a seconda dei LocationProvider disponibili (GPS o basati sulla rete).
La classe LocationManager ci permette di avere indicazioni sui LocationProvider disponibili e verificare quali soddisfano meglio determinati criteri ed, eventualmente, selezionare quello che risponde alle nostre esigenze.

Per ricevere la notifica delle variazioni di posizione è necessario creare l'implementazione dell'interfaccia LocationListener e registrarsi a esso come ascoltatori con il seguente metodo:
Codice (Java): [Seleziona]
public void requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener)Primo parametro è l'identificativo del provider (ci si può registrare solo con un provider per volta).
I parametri minTime e minDistance specificano una distanza ed un tempo minimo di notifica.
L'ultimo parametro è il riferimento a un'implementazione dell'interfaccia LocationListener, che definisce una serie di operazioni.
La più interessante è quella del metodo:
Codice (Java): [Seleziona]
public abstract void onLocationChanged(Location location)
Viene invocata in corrispondenza di una variazione nella posizione, le cui informazioni sono incapsulate in un oggetto di tipo Location.
Location è una classe che oltre a incapsulare latitudine e longitudine fornisce dei metodi per calcolare la distanza tra due location diverse.

Con queste due operazioni è possibile conoscere disabilitazione/abilitazione di un provider da parte dell'utente:
Codice (Java): [Seleziona]
public abstract void  onProviderDisabled  (String provider)
public abstract void  onProviderEnabled  (String provider)

Interessante è la modalità con cui l'applicazione può essere testata con l'emulatore, il quale non può ricevere segnali reali di posizione.
Si utilizza uno strumento dell'ADM, il DDMS (Dalvik Debug Monitor Service) accessibile in Eclipse come Perspective.
È uno strumento utilissimo in fase di debug, che possiede una piccola interfaccia per l'invio delle informazioni di posizione all'emulatore (Emulator control).
Il tool è predisposto all'invio di informazioni di location, tra cui GPX e KML.

Sorgenti:
TutorialGPSeMapView.java
Codice (Java): [Seleziona]
public class TutorialGPSeMapView extends MapActivity {
        private TextView tvLatitudine;
        private TextView tvLongitudine;
        private TextView tvVelocita;
        private TextView tvQuota;
        private TextView tvAccuratezza;

        //Riferimento alla MapView
        private MapView mapView;

        //Riferimento al MapController
        MapController mapController;

        //Riferimento al MyLocationOverlay
        private MyLocationOverlay myLocationOverlay;

        // Otteniamo il riferimento al LocationManager
        LocationManager locationManager;

        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);

                tvLatitudine = (TextView)this.findViewById(R.id.tvLatitudine);
                tvLongitudine = (TextView)this.findViewById(R.id.tvLongitudine);
                tvVelocita = (TextView)this.findViewById(R.id.tvVelocita);
                tvQuota = (TextView)this.findViewById(R.id.tvQuota);
                tvAccuratezza = (TextView)this.findViewById(R.id.tvAccuratezza);

                // Otteniamo il riferimento alla MapView
                mapView = (MapView)findViewById(R.id.mapView);

                // Otteniamo il riferimento al controller
                mapController = mapView.getController();

                // Rendiamo la mappa cliccabile e quindi ne permettiamo il pan
                mapView.setClickable(true);

                // Utiliziamo i controlli predefiniti per la gestione delle operazioni di zoom
                mapView.setBuiltInZoomControls(true);

                // Impostiamo la distanza dello Zoom a 12 (valori validi da 1 a 21).
                mapController.setZoom(12);

                // Aggiungiamo l'overlay sulla mappa della nostra posizione
                myLocationOverlay = new MyLocationOverlay(this, mapView);
                List<Overlay> overlays = mapView.getOverlays();
                overlays.add(myLocationOverlay);
                myLocationOverlay.enableMyLocation();

                // Otteniamo il riferimento al LocationManager
                locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

                // Verifichiamo se il GPS è abilitato altrimenti avvisiamo l'utente
                if(!locationManager.isProviderEnabled("gps")){
                        Toast.makeText(this, "GPS è attualmente disabilitato. E' possibile abilitarlo dal menu impostazioni.", Toast.LENGTH_LONG).show();
                }

                // Registriamo il LocationListener al provider GPS
                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
        }

        LocationListener locationListener = new LocationListener() {
                @Override
                public void onLocationChanged(Location location) {
                        // Aggiorna il marker della mappa
                        mapView.invalidate();

                        // Aggiorna la location
                        Double geoLat = location.getLatitude()*1E6;
                        Double geoLng = location.getLongitude()*1E6;
                        GeoPoint point = new GeoPoint(geoLat.intValue(), geoLng.intValue());

                        mapController.animateTo(point);

                        tvLatitudine.setText(Double.toString(getRound(location.getLatitude(), 5)));
                        tvLongitudine.setText(Double.toString(getRound(location.getLongitude(), 5)));
                        tvVelocita.setText(Double.toString(getRound(location.getSpeed()*3.6, 1))+" km/h");
                        tvQuota.setText(Integer.toString((int)location.getAltitude())+" m");
                        tvAccuratezza.setText(Integer.toString((int)location.getAccuracy())+" m");
                }

                @Override
                public void onProviderDisabled(String provider) {
                        Toast.makeText(TutorialGPSeMapView.this,
                                        "onProviderDisabled "+provider, Toast.LENGTH_SHORT).show();
                }

                @Override
                public void onProviderEnabled(String provider) {
                        Toast.makeText(TutorialGPSeMapView.this,
                                        "onProviderEnabled "+provider, Toast.LENGTH_SHORT).show();
                }

                @Override
                public void onStatusChanged(String provider, int status,Bundle extras) {
                        Toast.makeText(TutorialGPSeMapView.this,
                                        "onStatusChanged "+provider+" status: "+status, Toast.LENGTH_SHORT).show();
                }
        };

        @Override
        public void onPause() {
                super.onPause();
                // Stoppa Listener delle posizioni
                if(locationManager != null){
                        locationManager.removeUpdates(locationListener);
                        myLocationOverlay.disableMyLocation();
                }
        }

        @Override
        protected void onResume() {
                super.onResume();
                // Registriamo il LocationListener al provider GPS
                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
                myLocationOverlay.enableMyLocation();
        }

        public static double getRound(double x, int digits){
                double powerOfTen = Math.pow(10, digits);
                return ((double)Math.round(x * powerOfTen) / powerOfTen);
        }

        @Override
        protected boolean isRouteDisplayed() {
                // TODO Auto-generated method stub
                return false;
        }
}

main.xml
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/mainlayout"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:weightSum="100">
        <LinearLayout
                android:orientation="horizontal"
                android:layout_width="fill_parent"
                android:weightSum="100"
                android:layout_height="0dip"
                android:layout_weight="30">
                <RelativeLayout
                        android:id="@+id/RelativeLayout01"
                        android:layout_height="wrap_content"
                        android:layout_width="fill_parent">
                        <TextView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:text="anddev.it - Tutorial GPS e MapView"
                                android:id="@+id/tvTitoloApp"
                                android:layout_centerHorizontal="true"></TextView>
                        <TextView
                                android:layout_height="wrap_content"
                                android:layout_below="@+id/tvTitoloApp"
                                android:text="Latitudine"
                                android:id="@+id/tvLatitudineLabel"
                                android:layout_width="85dip"></TextView>
                        <TextView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:text="No data"
                                android:id="@+id/tvLatitudine"
                                android:layout_toRightOf="@+id/tvLatitudineLabel"
                                android:layout_alignBaseline="@+id/tvLatitudineLabel"></TextView>

                        <TextView
                                android:layout_height="wrap_content"
                                android:layout_below="@+id/tvLatitudineLabel"
                                android:text="Longitudine"
                                android:id="@+id/tvLongitudineLabel"
                                android:layout_width="85dip"></TextView>
                        <TextView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:text="No data"
                                android:id="@+id/tvLongitudine"
                                android:layout_toRightOf="@+id/tvLongitudineLabel"
                                android:layout_alignBaseline="@+id/tvLongitudineLabel"></TextView>

                        <TextView
                                android:layout_height="wrap_content"
                                android:layout_below="@+id/tvLongitudineLabel"
                                android:text="Velocità"
                                android:id="@+id/tvVelocitaLabel"
                                android:layout_width="85dip"></TextView>
                        <TextView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:text="No data"
                                android:id="@+id/tvVelocita"
                                android:layout_toRightOf="@+id/tvVelocitaLabel"
                                android:layout_alignBaseline="@+id/tvVelocitaLabel"></TextView>

                        <TextView
                                android:layout_height="wrap_content"
                                android:layout_below="@+id/tvVelocitaLabel"
                                android:text="Quota"
                                android:id="@+id/tvQuotaLabel"
                                android:layout_width="85dip"></TextView>
                        <TextView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:text="No data"
                                android:id="@+id/tvQuota"
                                android:layout_toRightOf="@+id/tvQuotaLabel"
                                android:layout_alignBaseline="@+id/tvQuotaLabel"></TextView>

                        <TextView
                                android:layout_height="wrap_content"
                                android:layout_below="@+id/tvQuotaLabel"
                                android:text="Accuratezza"
                                android:id="@+id/tvAccuratezzaLabel"
                                android:layout_width="85dip"></TextView>
                        <TextView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:text="No data"
                                android:id="@+id/tvAccuratezza"
                                android:layout_toRightOf="@+id/tvAccuratezzaLabel"
                                android:layout_alignBaseline="@+id/tvAccuratezzaLabel"></TextView>
                </RelativeLayout>
        </LinearLayout>
        <LinearLayout
                android:orientation="horizontal"
                android:layout_width="fill_parent"
                android:weightSum="100"
                android:layout_height="0dip"
                android:layout_weight="70">
                <com.google.android.maps.MapView
                        android:id="@+id/mapView"
                        android:layout_width="fill_parent"
                        android:layout_height="fill_parent"
                        android:apiKey="inserisci qui la tua map-key" />
        </LinearLayout>
</LinearLayout>

AndroidManifest.xml
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<manifest
        xmlns:android="http://schemas.android.com/apk/res/android"
        package="it.anddev.tutorialgpsemapview"
        android:versionCode="1"
        android:versionName="1.0">
        <application
                android:icon="@drawable/icon"
                android:label="@string/app_name">
                <uses-library
                        android:name="com.google.android.maps" />
                <activity
                        android:name=".TutorialGPSeMapView"
                        android:label="@string/app_name">
                        <intent-filter>
                                <action
                                        android:name="android.intent.action.MAIN" />
                                <category
                                        android:name="android.intent.category.LAUNCHER" />
                        </intent-filter>
                </activity>

        </application>
        <uses-sdk
                android:minSdkVersion="4" />
        <uses-sdk
                android:minSdkVersion="4" />
        <uses-permission
                android:name="android.permission.INTERNET" />
        <uses-permission
                android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <uses-permission
                android:name="android.permission.ACCESS_FINE_LOCATION" />
        <uses-permission
                android:name="android.permission.ACCESS_LOCATION" />
        <uses-permission
                android:name="android.permission.ACCESS_GPS" />
</manifest>

Bibliografia:
« Ultima modifica: 15 Aprile 2013, 12:53:15 CEST da Ricky` »
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline daniele

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: +1
    • Mostra profilo
Re:[facile] Tutorial GPS e MapView
« Risposta #1 il: 17 Marzo 2010, 17:26:34 CET »
0
Ciao JD, intanto complimenti per l'ottima guida, ora veniamo alla mia domanda.
Nel realizzare quest'articolo tu citi come fonte l'esempio sul sito ufficiale di Android che anche io ho seguito.
Quest'esempio però a me così come esposto non funzionava. Il motivo risiede nella variabile mContext della classe HelloItemizedOverlay che risulta sempre null e quindi l'applicativo genera la relativa eccezione. Non so se io ho sbagliato qualcosa nel seguire la guida o è proprio un errore della stessa. Personalmente ho risolto il problema con alcune modifiche. In HelloItemizedOverlay ho modificato il secondo costruttore come segue:

Codice (Java): [Seleziona]
public HelloItemizedOverlay(Drawable defaultMarker, Context context) {
        super(boundCenterBottom(defaultMarker));
        mContext = context;
}

In HelloGoogleMaps ho invece modificato la chiamata alla precedente classe come segue:

Codice (Java): [Seleziona]
HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable, this);
Chiamo quindi sempre il costruttore con 2 parametri.

Ti è capitato lo stesso problema? Se si tu che soluzione hai adottato?
Ciao e grazie per l'aiuto.
« Ultima modifica: 17 Marzo 2010, 17:34:57 CET da JD »

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:[facile] Tutorial GPS e MapView
« Risposta #2 il: 17 Marzo 2010, 18:41:33 CET »
0
scusa ma io qui  http://developer.android.com/guide/tutorials/views/hello-mapview.html non vedo nessun mContext  :o
sei sicuro di aver esteso ItemizedOverlay?
se puoi, posta il tuo codice, così possiamo capire meglio quale sia il tuo "problema".

CIAO  :D


PS: tempo fa ho implementato la stessa guida, e non ho avuto quel "problema"

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:[facile] Tutorial GPS e MapView
« Risposta #3 il: 17 Marzo 2010, 18:48:19 CET »
0
Ciao Daniele, per questo tutorial mi sono basato principalmente sul libro di Carli. Il link alla doc ufficiale l'ho inserito giusto per completezza.
Comunque vedo con piacere che Qlimax si è interessato al problema, sono certo che con lui riuscirai a trovare una soluzione ;).
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline daniele

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: +1
    • Mostra profilo
Re:[facile] Tutorial GPS e MapView
« Risposta #4 il: 18 Marzo 2010, 09:45:43 CET »
0
Ciao ragazzi, innanzitutto grazie della risposta.
Analizzando bene il vostro link, ho notato che fanno riferimento ad una guida leggermente diversa. Il vostro link punta a:
http://developer.android.com/guide/tutorials/views/hello-mapview.html
il mio a:
http://developer.android.com/resources/tutorials/views/hello-mapview.html
Le due guide sono molto simili, ma credo che quella usata da me sia più recente.
Comunque il codice da me realizzato è il seguente:

Codice (Java): [Seleziona]
package com.example.hellogooglemaps;

import java.util.List;

import android.graphics.drawable.Drawable;
import android.os.Bundle;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;

public class HelloGoogleMaps extends MapActivity {
       
        @Override
        protected boolean isRouteDisplayed() {
            return false;
        }
       
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        MapView mapView = (MapView) findViewById(R.id.mapview);
        mapView.setBuiltInZoomControls(true);
       
        List<Overlay> mapOverlays = mapView.getOverlays();
        Drawable drawable = this.getResources().getDrawable(R.drawable.androidmarker);
        HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable, this);
       
        GeoPoint point = new GeoPoint(19240000,-99120000);
        OverlayItem overlayitem = new OverlayItem(point, "Hola, Mundo!", "I'm in Mexico City!");
       
        GeoPoint point2 = new GeoPoint(35410000, 139460000);
        OverlayItem overlayitem2 = new OverlayItem(point2, "Sekai, konichiwa!", "I'm in Japan!");
       
        itemizedoverlay.addOverlay(overlayitem);
        itemizedoverlay.addOverlay(overlayitem2);
        mapOverlays.add(itemizedoverlay);
    }
   
}

e

Codice (Java): [Seleziona]
package com.example.hellogooglemaps;

import java.util.ArrayList;

import android.app.AlertDialog;
import android.content.Context;
import android.graphics.drawable.Drawable;

import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.OverlayItem;

public class HelloItemizedOverlay extends ItemizedOverlay {

        private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
       
        private Context mContext;
       
        public HelloItemizedOverlay(Drawable defaultMarker) {
                super(boundCenterBottom(defaultMarker));
        }
       
        public HelloItemizedOverlay(Drawable defaultMarker, Context context) {
                super(boundCenterBottom(defaultMarker));
                mContext = context;
        }

        public void addOverlay(OverlayItem overlay) {
            mOverlays.add(overlay);
            populate();
        }
       
        @Override
        protected OverlayItem createItem(int i) {
          return mOverlays.get(i);
        }

        @Override
        public int size() {
          return mOverlays.size();
        }

        @Override
        protected boolean onTap(int index) {
          OverlayItem item = mOverlays.get(index);       
          AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
          dialog.setTitle(item.getTitle());
          dialog.setMessage(item.getSnippet());
          dialog.show();
          return true;
        }

}

Rispetto al codice della guida, ho apportato le due piccole modifiche come esposto nel precedente post. La dichiarazione della variabile mContext si trova nel punto 7 della seconda parte della guida, quella chiamata Part 2: Adding Overlay Items.

Ciao e grazie, aspetto impaziente un vostro parere.

Offline array81

  • Utente junior
  • **
  • Post: 64
  • Respect: 0
    • Mostra profilo
    • MartinZone
  • Dispositivo Android:
    OnePlus One, Nexus S
  • Play Store ID:
    MartinZone
  • Sistema operativo:
    Windows 7
Re:[facile] Tutorial GPS e MapView
« Risposta #5 il: 10 Aprile 2010, 00:50:54 CEST »
0
Scusate la domanda forse stupida ma è la prima volta che cerco di capire come creare una applicazione per Android.
Ho scaricato i files del tutorial, aperti in Eclipse (credo correttamente configurato) quindi mandato in esecuzione. Penso di aver fatto tutto correttamente in quanto l'emulatore è partito ed il programm si è avviato.
Ora mi chiedo esiste un modo per simulare il signale GPS nell'emulatore, altrimenti non posso fare i miei test.

Mi potete spiegare come simulo il GPS, passo passo per favore in quanto come detto in precedenza sono veramente un principiante alle prime armi.

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:[facile] Tutorial GPS e MapView
« Risposta #6 il: 10 Aprile 2010, 01:02:25 CEST »
0
Ciao, scusa se non scrivo tutto passo passo ma è l'una di notte e sono un po' stanco :D

Comunque per provare rapidamente il gps puoi usare telnet:
Codice (Bash): [Seleziona]
telnet localhost 5554
poi digiti
Codice: [Seleziona]
geo fix 9.1 39.2
dove 9.1 e 39.2 sono le tue coordinate.

Per poter visualizzare la mappa sull'emulatore devi richiedere una chiave per google maps. Trovi il tutorial qui: http://www.anddev.it/index.php/topic,13.0.html

Per caricare delle traccie gpx o kml devi impostare Eclipse in inglese inserendo queste due linee nel tuo eclipse.ini:
Codice: [Seleziona]
-Duser.language=en
-Duser.country=US

In Ubuntu lo trovi in /usr/lib/eclipse/eclipse.ini, su windows non ne ho idea, se non lo trovi cerca su google :P.
« Ultima modifica: 10 Aprile 2010, 01:04:04 CEST da JD »
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline array81

  • Utente junior
  • **
  • Post: 64
  • Respect: 0
    • Mostra profilo
    • MartinZone
  • Dispositivo Android:
    OnePlus One, Nexus S
  • Play Store ID:
    MartinZone
  • Sistema operativo:
    Windows 7
Re:[facile] Tutorial GPS e MapView
« Risposta #7 il: 24 Aprile 2010, 13:02:08 CEST »
0
Scusa ma ho avuto modo di fare i test volo oggi.
Dunque sono riuscito ad inviare all'emulatore il segnale GPS seguendo quanto mi hai detto, tuttavia ho un problema. Ho richiesto e sostituito la KEY per la mappa quindi ho avviato il programma e mi sono accorto che l'emulatore mi avverte di non potersi connettere ad internet (mi dice NO SERVICE). Quindi non posso testare se la KEY funziona.

La cosa strana e che avvio l'emulatore (sia di Android 1.6 che di 2.1) ADV Manager questo risulta essere connesso ad internet senza alcun problema. Mentre se provo ad eseguire l'applicazione scaricata da questo post (anche se non faccio alcuna modifica) l'emulatore si avvia senza potersi connetere ad internet. Ti faccio presente che mi connetto a internet direttamante (non ho proxy) attraverso un router.

Hai qualche idea sul perchè questo accada? Dopo tutto se attaverso ADV Manager l'emulatore vede la connessione non capisco perchè non la deve vedere quando lo avvia eclipse per testare l'applicazione.

Offline array81

  • Utente junior
  • **
  • Post: 64
  • Respect: 0
    • Mostra profilo
    • MartinZone
  • Dispositivo Android:
    OnePlus One, Nexus S
  • Play Store ID:
    MartinZone
  • Sistema operativo:
    Windows 7
Re:[facile] Tutorial GPS e MapView
« Risposta #8 il: 24 Aprile 2010, 13:42:08 CEST »
0
Ho risolto da solo. Quando avevo creato ADV Manager l'emulatore non avevo aggiunto il modulo GSM.

Ho però un'altra domanda: nel primo post affermi che la key per la distribuzione è diversa da quella per il debug. Mi sai dire come posso fare per otternerla?

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:[facile] Tutorial GPS e MapView
« Risposta #9 il: 25 Aprile 2010, 11:02:19 CEST »
0
Ciao, usare la solita guida per il debug e sostituire la debug.keystore con quella tua personale.

Qui trovi tutte le informazioni necessarie alla generazione della tua keystore: http://developer.android.com/guide/publishing/app-signing.html
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline robbyzz

  • Nuovo arrivato
  • *
  • Post: 1
  • Respect: 0
    • Mostra profilo
Re:[facile] Tutorial GPS e MapView
« Risposta #10 il: 29 Aprile 2010, 17:06:19 CEST »
0
Salve,

sto per iniziare ora a cimentarmi con la programmazione in Andoid. Vorrei sapere se è possibile sviluppare applicazioni comprese di mappe (tipo tomtom) evitando che il terminale sia perennemente connesso a internet.

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:[facile] Tutorial GPS e MapView
« Risposta #11 il: 29 Aprile 2010, 17:29:15 CEST »
0
Che io sappia non ci sono API di Google che gestiscono una cosa simile: le uniche API per le mappe che conosco utilizzano Google Maps, che richiede una connessione costante.
Dovresti quindi gestirti la cosa da solo, come fanno i navigatori offline per Android.
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline alepio

  • Utente normale
  • ***
  • Post: 163
  • Respect: +3
    • Google+
    • 107850838
    • Mostra profilo
  • Dispositivo Android:
    SAMSUNG ACE
  • Play Store ID:
    Alessandro Piola
  • Sistema operativo:
    WIN 7
Completare il tutorialGPS con un RemoveListener
« Risposta #12 il: 13 Maggio 2010, 08:54:43 CEST »
0
Il tutorial insegna come attivare il GPS e leggere le posizioni, ma manca di una cosa.
Una volta attivato il GPS risponde sempre non lo si riesce più a disattivare.

La stessa cosa è presente anche in tutti gli altri tutorial.

Ho trovato locationManager.removeGpsStatusListener(?????);
Ma dovrei metter il listener al posto dei ???, ma quando lo metto mi da errore.
Posto una parte del programma
Codice (Java): [Seleziona]
   public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
                // Otteniamo il riferimento al LocationManager
        final LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
               
                Log.w(LOG_TAG, "PUPPA:1");
                // Verifichiamo se il GPS è abilitato altrimenti avvisiamo l'utente
                if(!locationManager.isProviderEnabled("gps")){
                        Toast.makeText(this, "GPS è attualmente disabilitato. E' possibile abilitarlo dal menu impostazioni.", Toast.LENGTH_LONG).show();
                        Log.w(LOG_TAG, "nogps");
                }
                Log.w(LOG_TAG, "PUPPA:3");
                // Registriamo il LocationListener al provider GPS
                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,
                                0, new LocationListener() {

                        @Override
                        public void onLocationChanged(Location location) {
                                // Aggiorna il marker della mappa
                                // Aggiorna la location
                                Double geoLat = location.getLatitude()*1E6;
                                Double geoLng = location.getLongitude()*1E6;
                                outputView.setText(Double.toString(geoLng).toString()+ ':'+Double.toString(geoLat).toString());
                                removeListeners();
                        }


                        @Override
                        public void onProviderDisabled(String provider) {
                                Toast.makeText(AdvancedAppWidgetTestActivity.this,
                                                "onProviderDisabled "+provider, Toast.LENGTH_SHORT).show();
                                Log.w(LOG_TAG, "non enab");
                        }

                        @Override
                        public void onProviderEnabled(String provider) {
                                Toast.makeText(AdvancedAppWidgetTestActivity.this,
                                                "onProviderEnabled "+provider, Toast.LENGTH_SHORT).show();
                                Log.w(LOG_TAG, "enble prov");
                                removeListeners();
                        }

                        @Override
                        public void onStatusChanged(String provider, int status,Bundle extras) {
                                Toast.makeText(AdvancedAppWidgetTestActivity.this,
                                                "onStatusChanged "+provider+" status: "+status, Toast.LENGTH_SHORT).show();
                                 
                        }

                        private void removeListeners(LocationListener listener) {
                                // TODO Auto-generated method stub
                                //locationManager.removeGpsStatusListener(?????);
                                Log.e(LOG_TAG, "off listener");
                        }

                });

     
grazie a tutti ciao
-----------------------------------------------------
Con RISPARMIO BATTERIA - Battery Saver puoi anche dimenticarti a casa il carica batteria. Inoltre con gli EXTRAS puoi configurare la navigazione e disattivare i banner pubblicitari. Battery Saver controlla in automatico lo stato dello schermo.Se è spento disattiva WIFI e NAVIGAZIONE MOBILE, per poi riaccenderle a schermo attivo.
[APP] BatterySaver - Android Developers Italia
--------

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:[facile] Tutorial GPS e MapView
« Risposta #13 il: 13 Maggio 2010, 16:31:07 CEST »
0
Ciao, grazie per la segnalazione, ho corretto il tutorial ;)
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline alepio

  • Utente normale
  • ***
  • Post: 163
  • Respect: +3
    • Google+
    • 107850838
    • Mostra profilo
  • Dispositivo Android:
    SAMSUNG ACE
  • Play Store ID:
    Alessandro Piola
  • Sistema operativo:
    WIN 7
Re:[facile] Tutorial GPS e MapView
« Risposta #14 il: 13 Maggio 2010, 17:43:07 CEST »
0
ok, grazie per la correzione.
Ma ancora non mi è chiaro.
Per OnDestroy non ci passa mai.
Il perché non lo so, ma non ci passa.
Infatti i programmi rimangono sempre in task ( motivo per cui esistono i TASK.KILLER).
Puoi implementare magari con un Button?
grazie
ciao
-----------------------------------------------------
Con RISPARMIO BATTERIA - Battery Saver puoi anche dimenticarti a casa il carica batteria. Inoltre con gli EXTRAS puoi configurare la navigazione e disattivare i banner pubblicitari. Battery Saver controlla in automatico lo stato dello schermo.Se è spento disattiva WIFI e NAVIGAZIONE MOBILE, per poi riaccenderle a schermo attivo.
[APP] BatterySaver - Android Developers Italia
--------