Autore Topic: getLastKnownPosition() non funziona "subito"  (Letto 766 volte)

Offline Vincent

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: +2
    • Mostra profilo
getLastKnownPosition() non funziona "subito"
« il: 07 Settembre 2011, 11:47:18 CEST »
0
Salve a tutti, ho un problema strano.

Un'activity che ho compilato necessita della posizione dell'utente. Ovviamente invio le coordinate tramite DDMS e questo è il codice per ottenere e usare le coordinate:

Codice (Java): [Seleziona]
Criteria criteria = new Criteria();
 criteria.setAccuracy(Criteria.ACCURACY_FINE);
 locManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
String locProvider = locManager.getBestProvider(criteria, true);
MyLocationListener locationListener = new MyLocationListener();
  locManager.requestLocationUpdates(locProvider, 10000L, 10.0f, locationListener);
 myLocation = locManager.getLastKnownLocation(locProvider);

Il mio LocationListener:

Codice (Java): [Seleziona]
 //listener per il cambio di posizione
    private class MyLocationListener implements LocationListener {
      public void onLocationChanged(Location loc) {
        try {
        if (loc != null) {
            /*Toast.makeText(getBaseContext(),
                "Location changed : Lat: " + loc.getLatitude() +
                " Lng: " + loc.getLongitude(),
                Toast.LENGTH_SHORT).show();*/

           
            Double geoLat = loc.getLatitude()*1E6;
            Double geoLng = loc.getLongitude()*1E6;
            GeoPoint point = new GeoPoint(geoLat.intValue(), geoLng.intValue());
            Log.d(TAG,"la posizione e': "+geoLat+" , "+geoLng);
            /*// sposta la mappa al punto p
                        mapCtr.animateTo(point);
            mapCtr.setZoom(16);  
            myLastLoc= loc;
            // fa il refresh della mappa
            mappa.invalidate();*/

       
        }
        } catch (Exception e) {
                Log.d(TAG, "errore pos: "+e);
        }
     }

        public void onProviderDisabled(String arg0) {
                // TODO Auto-generated method stub
               
        }

        public void onProviderEnabled(String arg0) {
                // TODO Auto-generated method stub
               
        }

        public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
                // TODO Auto-generated method stub
               
        }
   
   }

Il codice funziona bene, il problema è quando apro inizialmente l'emulatore. Viene avviato la mia applicazione e mi restituisce un errore NullPointerException sul getLatitude() della mia posizione ottenuta con "getLastKnownPosition()".
Esco dall'applicazione, la riapro e tutto funziona bene. Come mai? Come posso risolvere?
Ecco il logcat dell'errore:


Codice: [Seleziona]
09-07 11:32:45.261: WARN/dalvikvm(217): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
09-07 11:32:45.261: ERROR/AndroidRuntime(217): Uncaught handler: thread main exiting due to uncaught exception
09-07 11:32:45.281: ERROR/AndroidRuntime(217): java.lang.RuntimeException: Unable to start activity ComponentInfo{FirstProt.ProjectPOI/FirstProt.ProjectPOI.S3_schermata}: java.lang.NullPointerException
09-07 11:32:45.281: ERROR/AndroidRuntime(217):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
09-07 11:32:45.281: ERROR/AndroidRuntime(217):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
09-07 11:32:45.281: ERROR/AndroidRuntime(217):     at android.app.ActivityThread.access$2200(ActivityThread.java:119)
09-07 11:32:45.281: ERROR/AndroidRuntime(217):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
09-07 11:32:45.281: ERROR/AndroidRuntime(217):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-07 11:32:45.281: ERROR/AndroidRuntime(217):     at android.os.Looper.loop(Looper.java:123)
09-07 11:32:45.281: ERROR/AndroidRuntime(217):     at android.app.ActivityThread.main(ActivityThread.java:4363)
09-07 11:32:45.281: ERROR/AndroidRuntime(217):     at java.lang.reflect.Method.invokeNative(Native Method)
09-07 11:32:45.281: ERROR/AndroidRuntime(217):     at java.lang.reflect.Method.invoke(Method.java:521)
09-07 11:32:45.281: ERROR/AndroidRuntime(217):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
09-07 11:32:45.281: ERROR/AndroidRuntime(217):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
09-07 11:32:45.281: ERROR/AndroidRuntime(217):     at dalvik.system.NativeStart.main(Native Method)
09-07 11:32:45.281: ERROR/AndroidRuntime(217): Caused by: java.lang.NullPointerException
09-07 11:32:45.281: ERROR/AndroidRuntime(217):     at FirstProt.ProjectPOI.S3_schermata.getDistancePoi(S3_schermata.java:201)
09-07 11:32:45.281: ERROR/AndroidRuntime(217):     at FirstProt.ProjectPOI.S3_schermata.onCreate(S3_schermata.java:93)
09-07 11:32:45.281: ERROR/AndroidRuntime(217):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
09-07 11:32:45.281: ERROR/AndroidRuntime(217):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
09-07 11:32:45.281: ERROR/AndroidRuntime(217):     ... 11 more
09-07 11:32:45.321: INFO/Process(51): Sending signal. PID: 217 SIG: 3
09-07 11:32:45.321: INFO/dalvikvm(217): threadid=7: reacting to signal 3
09-07 11:32:45.352: INFO/dalvikvm(217): Wrote stack trace to '/data/anr/traces.txt'
09-07 11:32:47.151: INFO/Process(217): Sending signal. PID: 217 SIG: 9
09-07 11:32:47.181: INFO/ActivityManager(51): Process FirstProt.ProjectPOI (pid 217) has died.
09-07 11:32:47.201: WARN/GpsLocationProvider(51): Unneeded remove listener for uid 1000
09-07 11:32:47.211: DEBUG/GpsLocationProvider(51): stopNavigating
09-07 11:32:47.241: INFO/WindowManager(51): WIN DEATH: Window{43cd0cb8 FirstProt.ProjectPOI/FirstProt.ProjectPOI.schermata_S2 paused=false}
09-07 11:32:47.331: INFO/ActivityManager(51): Start proc FirstProt.ProjectPOI for activity FirstProt.ProjectPOI/.schermata_S2: pid=308 uid=10026 gids={3003, 1015}
09-07 11:32:47.391: ERROR/gralloc(51): [unregister] handle 0x3e2f60 still locked (state=40000001)
09-07 11:32:47.611: DEBUG/ddm-heap(308): Got feature list request
09-07 11:32:47.731: INFO/UsageStats(51): Unexpected resume of FirstProt.ProjectPOI while already resumed in FirstProt.ProjectPOI
09-07 11:32:47.761: INFO/ActivityManager(51): Displayed activity FirstProt.ProjectPOI/.schermata_S2: 533 ms (total 2753 ms)
09-07 11:32:47.890: INFO/ActivityThread(308): Publishing provider FirstProt.ProjectPOI.ProjectProvider: FirstProt.ProjectPOI.ProjectProvider
09-07 11:32:48.151: DEBUG/schermata_S2(308): utente: null
09-07 11:32:48.370: WARN/InputManagerService(51): Got RemoteException sending setActive(false) notification to pid 217 uid 10026

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:getLastKnownPosition() non funziona "subito"
« Risposta #1 il: 08 Settembre 2011, 09:23:20 CEST »
0
quando invochi il getMyLastKnownPosition, il listener non viene toccato.....ti restituisce una location della quale poi fai quello che vuoi, quindi credo che il problema sia dovuto a qualche altra cosa...
tu comunichi coordinate all'emulatore?
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline Vincent

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: +2
    • Mostra profilo
Re:getLastKnownPosition() non funziona "subito"
« Risposta #2 il: 08 Settembre 2011, 09:27:30 CEST »
0
si comunico le coordinate all'emulatore.

Avevo letto da qualche parte che getLastKnownPosition() dà questo problema se non lo si usa in una MapView e in effetti la mia activity non ha una mapView...Credi possa essere collegato?
Ci sono metodi alternativi per ottenere la posizione?

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:getLastKnownPosition() non funziona "subito"
« Risposta #3 il: 08 Settembre 2011, 10:41:27 CEST »
0
io lo uso senza mapview e non ho mai avuto problemi......

prova a farlo partire senza comunicare le coordinate....succede la stessa cosa?
e poi: getLastKnownPosition cosa restituisce quando lo invochi?
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline Vincent

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: +2
    • Mostra profilo
Re:getLastKnownPosition() non funziona "subito"
« Risposta #4 il: 08 Settembre 2011, 13:24:32 CEST »
0
Se non invio le coordinate stessa cosa, nullPointerException.
Quando si verifica l'errore getLastKnownPosition restituisce "null"

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:getLastKnownPosition() non funziona "subito"
« Risposta #5 il: 08 Settembre 2011, 13:30:34 CEST »
0
allora il problema non sta nel listener, ma in come tratti myLocation.....non è detto che la funzione restituisca una posizione.
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline Vincent

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: +2
    • Mostra profilo
Re:getLastKnownPosition() non funziona "subito"
« Risposta #6 il: 08 Settembre 2011, 14:31:26 CEST »
0
In che senso?
E come dovrei gestirla allora?

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:getLastKnownPosition() non funziona "subito"
« Risposta #7 il: 08 Settembre 2011, 14:44:50 CEST »
0
credo che l'errore te lo dia perché utilizzi myLocation senza controllare che non sia null; ti spiego meglio cosa voglio dire, perché credo di avere capito cosa avviene.

la prima volta che lanci l'app, tu prendi myLocation da getLastKnownPosition(), ed esegui il tuo codice. Ma anche, invii le coordinate gps all'emulatore.
L'emulatore appena avviato e che non ha alcun tipo di coordinata conosciuta, ti restituisce null, l'app si pianta e torna alla home; a questo punto riavvii l'app e getLastKnownPosition() restituisce la posizione che hai precedentemente inviato all'emulatore, perché adesso conosce una posizione.

prova ad avviare l'emulatore, ad inviare la coordinata e dopo ad eseguire la tua app....vedrai che funziona.

Ad ogni modo, non dare per scontato che getLastKnownPosition() restituisca una Location, ma controlla che sia != null prima di utilizzarla....in quel caso non fare nulla, ma aspetta che il listener aggiorni la posizione

spero di essere stato chiaro.
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:getLastKnownPosition() non funziona "subito"
« Risposta #8 il: 08 Settembre 2011, 14:53:21 CEST »
0
credo che l'errore te lo dia perché utilizzi myLocation senza controllare che non sia null; ti spiego meglio cosa voglio dire, perché credo di avere capito cosa avviene.

la prima volta che lanci l'app, tu prendi myLocation da getLastKnownPosition(), ed esegui il tuo codice. Ma anche, invii le coordinate gps all'emulatore.
L'emulatore appena avviato e che non ha alcun tipo di coordinata conosciuta, ti restituisce null, l'app si pianta e torna alla home; a questo punto riavvii l'app e getLastKnownPosition() restituisce la posizione che hai precedentemente inviato all'emulatore, perché adesso conosce una posizione.

prova ad avviare l'emulatore, ad inviare la coordinata e dopo ad eseguire la tua app....vedrai che funziona.

Ad ogni modo, non dare per scontato che getLastKnownPosition() restituisca una Location, ma controlla che sia != null prima di utilizzarla....in quel caso non fare nulla, ma aspetta che il listener aggiorni la posizione

spero di essere stato chiaro.
oppure prova a prendere la location da un provider gps piu "generico".
Obtaining User Location | Android Developers
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia