Autore Topic: [Eclipse+adt] Google Maps + GPS errore con il Location Manager  (Letto 1286 volte)

Offline helldron

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
[Eclipse+adt] Google Maps + GPS errore con il Location Manager
« il: 07 Settembre 2010, 18:42:43 CEST »
0
Ciao a tutti,
sto portando avanti un'applicazione che prevede l'uso di Maps + GPS.

Usando un tutorial che eventualmente potrei anche postarvi ho usato quanto letto sulla mia attività.

L'applicazione si avvia ma non appena faccio il primo test con telnet per simulare gli spostamenti dell'utente l'applicazione va in crash ed ho l'errore praticamente a questo livello:

Codice (Java): [Seleziona]
mapController.animateTo(point);del metodo updateWithNewLocation(). Dal logCat si scopre che questo metodo è chiamato da "onLacationChanged()", infatti dal telnet gli diciamo di cambiare posizione all'utente.

Qui l'errore:
Codice: [Seleziona]
09-08 08:02:16.143: ERROR/AndroidRuntime(312): FATAL EXCEPTION: main
09-08 08:02:16.143: ERROR/AndroidRuntime(312): java.lang.NullPointerException
09-08 08:02:16.143: ERROR/AndroidRuntime(312):     at mieapplicazioni.menudemoreloaded.MenuDemoReloaded.updateWithNewLocation(MenuDemoReloaded.java:146)
09-08 08:02:16.143: ERROR/AndroidRuntime(312):     at mieapplicazioni.menudemoreloaded.MenuDemoReloaded.onLocationChanged(MenuDemoReloaded.java:116)
09-08 08:02:16.143: ERROR/AndroidRuntime(312):     at android.location.LocationManager$ListenerTransport._handleMessage(LocationManager.java:191)
09-08 08:02:16.143: ERROR/AndroidRuntime(312):     at android.location.LocationManager$ListenerTransport.access$000(LocationManager.java:124)
09-08 08:02:16.143: ERROR/AndroidRuntime(312):     at android.location.LocationManager$ListenerTransport$1.handleMessage(LocationManager.java:140)
09-08 08:02:16.143: ERROR/AndroidRuntime(312):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-08 08:02:16.143: ERROR/AndroidRuntime(312):     at android.os.Looper.loop(Looper.java:123)
09-08 08:02:16.143: ERROR/AndroidRuntime(312):     at android.app.ActivityThread.main(ActivityThread.java:4627)
09-08 08:02:16.143: ERROR/AndroidRuntime(312):     at java.lang.reflect.Method.invokeNative(Native Method)
09-08 08:02:16.143: ERROR/AndroidRuntime(312):     at java.lang.reflect.Method.invoke(Method.java:521)
09-08 08:02:16.143: ERROR/AndroidRuntime(312):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
09-08 08:02:16.143: ERROR/AndroidRuntime(312):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
09-08 08:02:16.143: ERROR/AndroidRuntime(312):     at dalvik.system.NativeStart.main(Native Method)

per farla breve si tratta di una NullPointerException che fa intuire che il GPS sia disabilitato o qualcosa del genere. Di seguito posto un pò di codice

Codice (Java): [Seleziona]
import java.util.List;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.MyLocationOverlay;
import com.google.android.maps.Overlay;

//import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
import android.widget.Toast;

public class MenuDemo extends MapActivity implements LocationListener{
       
        /* E' buon uso avere della variabili per specificare l'id degli elemti del menù*/
        private static final int MENUITEM_COMANDO_1 = 1;
        private static final int MENUITEM_COMANDO_2 = 2;
        private static final int MENUITEM_COMANDO_3 = 3;
       
        private MyLocationOverlay myLocationOverlay;
        private LocationManager locationManager;
        private MapController mapController;

       
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        /* aggiungo lo zoom recuperando la risorsa google maps e
         * settandolo con un metodo apposito */

        MapView mapView = (MapView) findViewById(R.id.mapview);    
        mapView.setBuiltInZoomControls(true);
       
      //Inizio parte del GPS
      //Recupero le risorse MapView, LinerLayout, i TextView, MapController e lo Zoom
      //....
       
     /* Aggiunge l'overlay sulla mappa della propria posizione:
      * L'oggetto MyLocationOverlay() si occupa di rappresentare la posizione corrente
      * dell'utente e grazie all'ausilio della classe Overlay si riesce a raffigurare
      * la propria posizione sulla mappa */

        myLocationOverlay = new MyLocationOverlay(this, mapView);
        List<Overlay> overlays = mapView.getOverlays();
        overlays.add(myLocationOverlay);
        myLocationOverlay.enableMyLocation();

      /* Setta il LocationManager:
       * La classe LocationManager fornisce l'accesso al sistema di localizzazione,
       * fornendo aggiornamenti periodici del dispositivo di GPS. getSystemService()
       * ritorna il gestore del sistema richiesto, nel nostro caso è appunto il GPS.*/

        locationManager = (LocationManager) getSystemService (Context.LOCATION_SERVICE);

    }
   
    @Override
    public void onStart() {
    super.onStart();

Criteria criteria = new Criteria();  
         criteria.setAccuracy(Criteria.ACCURACY_FINE);
         String provider = locationManager.getBestProvider(criteria, true);

    // Aggiorna l'interfaccia
    Location location = locationManager.getLastKnownLocation(provider);
    updateWithNewLocation(location);

    // Avvia il Listener per gli aggiornamenti della posizione
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
    0, // 0sec
    0, // 0m
    this);

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

    @Override
    public void onStop() {
    // Stoppa il Listener delle posizioni
    locationManager.removeUpdates(this);

    super.onStop();
    }
   
    @Override
    public void onLocationChanged(Location location) {
    updateWithNewLocation(location);
    }

    @Override
    public void onProviderDisabled(String provider) {
    updateWithNewLocation(null);
    }

    @Override
    public void onProviderEnabled(String provider) { }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) { }

    /* updateWithNewLocation: Questo metodo non fa altro che aggiornare la posizione
     * sulla mappa e settare le informazioni di latitudine, longitudine, altitudine
     * e velocità */

    private void updateWithNewLocation(Location location) {

    // Aggiorna la posizione della mappa e l'overlay
    if (location != null) {

    // Aggiorna il marker della mappa
    MapView mapView = (MapView) findViewById(R.id.mapview);    
    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);

    //Setta le info sulle TexView
    TextView lat = (TextView) findViewById(R.id.TextView01);
    lat.setText("Latitude: "+normalize(location.getLatitude()));
    TextView log = (TextView) findViewById(R.id.TextView02);
    log.setText("Longitude: "+normalize(location.getLongitude()));
    TextView alt = (TextView) findViewById(R.id.TextView03);
    alt.setText("Altitude: "+Math.floor(location.getAltitude())+" m");
    TextView speed = (TextView) findViewById(R.id.TextView04);
    speed.setText("Speed: "+Math.floor((location.getSpeed()*3.6))+" km/h");
    }

    }

    //Riduce a 6 il numero di cifre decimali dopo la virgola
    private String normalize(Double x){
    x *= 1000000;
    x = Math.floor(x);
    x /= 1000000;
    return x.toString();
    }

    /* Con questo metodo creo il menù, l'argomento Menu agginunge degli elementi
     * e ogni elemento MenuItem setta la sua icona*/

    @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                MenuItem comando1 = menu.add(Menu.NONE, MENUITEM_COMANDO_1, 1, "Set Range");
                comando1.setIcon(R.drawable.icon);
                MenuItem comando2 = menu.add(Menu.NONE, MENUITEM_COMANDO_2, 2, "Comando 2");
                comando2.setIcon(R.drawable.icon);
                MenuItem comando3 = menu.add(Menu.NONE, MENUITEM_COMANDO_3, 3, "Comando 3");
                comando3.setIcon(R.drawable.icon);
                return true;
        }
   
    /* Questo metodo gestisce gli eventi di ogni singolo tasto del menù recuperando
     * il suo id e tramite uno switch descrivendo per ogni caso un'azione*/

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        switch (id) {
        case MENUITEM_COMANDO_1:
        //Toast.makeText(this, "Comando 1", Toast.LENGTH_SHORT).show();
        startSubActivity();
        return true;
        case MENUITEM_COMANDO_2:
        Toast.makeText(this, "Comando 2", Toast.LENGTH_SHORT).show();
        return true;
        case MENUITEM_COMANDO_3:
        Toast.makeText(this, "Comando 3", Toast.LENGTH_SHORT).show();
        return true;
        }
        return false;
    }
   
    /* Con l'oggetto Intent dico quale attività dovrà essere lanciata, con
     * startActivity quell'attività si avvierà occupando effettivamente lo schermo*/

    private void startSubActivity() {
        Intent intent = new Intent(this, SubActivity.class);
        startActivity(intent);
        }
   
    @Override
    protected boolean isRouteDisplayed() {    
        return false;
        }
}

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

                <activity android:name=".SubActivity" android:label="@string/sub_activity" />
    </application>
   
    <!-- per google maps e per il GPS -->
    <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_GPS" />
       

</manifest>

Grazie a tutti  :-)
« Ultima modifica: 08 Settembre 2010, 10:13:03 CEST da helldron »

Offline helldron

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
Re:[Eclipse+adt] Google Maps + GPS errore con il Location Manager
« Risposta #1 il: 08 Settembre 2010, 10:51:44 CEST »
0
Mi è stato consigliato di testare se il provider è il GPS, così:

Codice: [Seleziona]
Criteria criteria = new Criteria(); 
          criteria.setAccuracy(Criteria.ACCURACY_FINE);
          String provider = locationManager.getBestProvider(criteria, true); 
     
   
    // Aggiorna l'interfaccia. usare (LocationManager.GPS_PROVIDER) oppure (LocationManager.NETWORK_PROVIDER)
    Location location = locationManager.getLastKnownLocation(provider);
    if(location == null){
            Toast.makeText(this, "Location nulla. Provider usato: "+provider , Toast.LENGTH_SHORT).show(); 
    }
    updateWithNewLocation(location);
appena avvio l'applicazione ho la stringa:

"Location nulla, provider usato GPS"
Quindi il GPS è stato utilizzato come provider ma location risulta null. Infatti ricevo sempre una nullPointerException appena uso telnet per le prove.Che vuol dire?

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:[Eclipse+adt] Google Maps + GPS errore con il Location Manager
« Risposta #2 il: 08 Settembre 2010, 11:07:11 CEST »
0
Se alleghi tutto il progetto eclipse in un file zip provo a darci uno sguardo.
È 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 helldron

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
Re:[Eclipse+adt] Google Maps + GPS errore con il Location Manager
« Risposta #3 il: 08 Settembre 2010, 11:20:43 CEST »
0
eccolo, il programma ha anche una sotto attività ma quella credo puoi anche sorvolarla.

Grazie mille  :D

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:[Eclipse+adt] Google Maps + GPS errore con il Location Manager
« Risposta #4 il: 08 Settembre 2010, 11:36:48 CEST »
+1
Mancava semplicemente l'inizializzazione del mapController nella onCreate:
Codice (Java): [Seleziona]
                // Otteniamo il riferimento al controller
                mapController = mapView.getController();

Non essendo inizializzato dava NullPointerException  ;-)
È 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 helldron

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
Re:[Eclipse+adt] Google Maps + GPS errore con il Location Manager
« Risposta #5 il: 08 Settembre 2010, 12:14:27 CEST »
0
Mancava semplicemente l'inizializzazione del mapController nella onCreate:
Codice (Java): [Seleziona]
                // Otteniamo il riferimento al controller
                mapController = mapView.getController();

Non essendo inizializzato dava NullPointerException  ;-)
Hai ragione, io l'avevo cancellato per errore poichè pensavo servisse solo per lo zoom che nel tutorial usava un metodo deprecated.

Grazie, per il momento funziona tutto bene. Tuttavia l'emulatore da sempre il toast "location nulla. provider usato: gps", strano.

Vorrei un chiarimento: tramite il telnet io posso "settare" la posizione dell'utente, giusto? Questo perchè la mia intenzione sarebbe quella di avere la mappa centrata sull'utente tramite gps per arricchire la mappa di altre informazioni (cioè "overlay" su delle precise coordinate). Come potrei muovermi arrivato a questo punto??

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:[Eclipse+adt] Google Maps + GPS errore con il Location Manager
« Risposta #6 il: 08 Settembre 2010, 12:24:11 CEST »
0
Codice (Java): [Seleziona]
Location location = locationManager.getLastKnownLocation(provider);
    if(location == null){
        Toast.makeText(this, "Location nulla. Provider usato: "+provider , Toast.LENGTH_SHORT).show();  
    }

Come scritto nella doc, getLastKnownLocation restituisce null se non c'è un'ultima posizione nota: LocationManager | Android Developers)

Citazione
Vorrei un chiarimento: tramite il telnet io posso "settare" la posizione dell'utente, giusto? Questo perchè la mia intenzione sarebbe quella di avere la mappa centrata sull'utente tramite gps per arricchire la mappa di altre informazioni (cioè "overlay" su delle precise coordinate). Come potrei muovermi arrivato a questo punto??
Scusa ma non ho capito cosa stai domandando :P
È 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 helldron

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
Re:[Eclipse+adt] Google Maps + GPS errore con il Location Manager
« Risposta #7 il: 08 Settembre 2010, 14:44:25 CEST »
0
Allora mi spiego meglio:
supponiamo che io setto da telnet la mia posizione sulla mappa (se sto al centro di Milano setto le coordinate di milano centro, se sto a Napoli quelle di Napoli etc..), se volessi recuperare le coordinate dell'attuale posizione sulla mappa per poi usarle per visualizzare sulla mappa tutti i punti di interesse (magari recuperandoli da un Web Service esterno) entro un certo range??

Come potrei muovermi per, diciamo, collegare il concetto di GPS e quello di oggetti Ovrelay visualizzabili sulla mappa in base alla posizione dell'utente??

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:[Eclipse+adt] Google Maps + GPS errore con il Location Manager
« Risposta #8 il: 08 Settembre 2010, 14:46:39 CEST »
0
Scusa, continuo a non seguirti: mi stai chiedendo se esiste un metodo che prende in ingresso una coordinata GPS e ti restituisce i POI più vicini?
È 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 helldron

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
Re:[Eclipse+adt] Google Maps + GPS errore con il Location Manager
« Risposta #9 il: 08 Settembre 2010, 15:07:19 CEST »
0
Ti chiedevo se potevi consigliarmi come muovervi per realizzare quanto ti ho descritto prima, in quanto ancora sono in fase di apprendimento della piattaforma Android e magari poteva essere molto utile, tutto qui. Per quanto riguarda il metodo, se esiste bè è ancora meglio  :-)

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:[Eclipse+adt] Google Maps + GPS errore con il Location Manager
« Risposta #10 il: 08 Settembre 2010, 15:09:49 CEST »
0
Eh purtroppo non esiste :D

Comunque non ho mai giocato con mapview e overlay, per cui non sono in grado di aiutarti.

Ad occhio credo che si debbano richiedere le coordinate dei vari poi a qualche servizio online. Ottenute le coordinate la visualizzazione sullo schermo non dovrebbe essere molto complicata. Uso il condizionale perché, ripeto, non ho mai fatto nulla di simile.
È 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 helldron

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
Re:[Eclipse+adt] Google Maps + GPS errore con il Location Manager
« Risposta #11 il: 08 Settembre 2010, 15:16:27 CEST »
0
Per visualizzare i poi potrei usare un'implementazione dell'interfaccia ItemizedOverlay?? Per collegarmi al Web Service invece mi consigli queste librerie? non so se le conosci:

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransport;