Autore Topic: Quando clicko su iconcina del geo point sulla Google Maps l'applicazione crasha  (Letto 1078 volte)

Offline AndreaNobili

  • Utente junior
  • **
  • Post: 75
  • Respect: 0
    • Mostra profilo
Ciao,
con alcuni colleghi stiamo realizzando un progetto per un esame universitario. Si tratta di una guida georeferenziata che usa Android. Praticamente c'è un'applicazione Android che si collega ad un web service e da esso restituisce una lista di punti di interesse nelle vicinanze dell'utente.

Il problema è il seguente: la nostra applicazione riesce a ricevere dal WS un file XML contenente i punti di interesse, tale file XML viene correttamente parsato ed i dati al suo interno vengono messi dentro una lista di punti di interesse chiamata result. Tali punti dentro la lista vengono correttamente visualizzati sulla Google Maps quando ciò viene richiesto (quando gli si dice di cercare i punti di interesse presenti entro un certo range) ma se poi clicko sull'iconcina che rappresenta il punto di interesse l'applicazione creasha e dà il seguente messaggio di errore sul display dell'emulatore di Android: The application GuidaGeoReferenziata (process mieapplicazioni.guidageoreferenziata) has stopped unexpetly. Please try again


La visualizzazione dei punti di interesse avviene nel metodo onResume() dell'activity principale, spiego brevemente per chiarezza: l'applicazione è composta da un'activity principale chiamata GuidaGeoReferenziata che è quella che viene visualizzata all'avvio dell'applicazione e che mostra la Google Maps e la posizione dell'utente (ricavata tramite GPS e simulata tramite telnet con il comando geo fix), premendo il tasto menu mi compare un bottone chiamato "Set Range" che mi consente di settare il range entro cui ricercare i punti di interesse, se tale bottone viene clickato viene avviata un'activity secondaria chiamata GuidaSubActivity che mi permette di selezionare il range in km desiderato in cui ricercare i punti di interesse. Una volta selezionato il range e confermato clickando su un altro bottone, parte la richiesta al WS ed il parsing dei dati ricevuti ed i punti di interesse vengono messi nella famosa lista result che verrà visualizzata nel metodo onResume dell'attività principale a cui si ritorna dopo aver immesso il range e ricevuto i dati dal WS,

Il codice del metodo onResume è il seguente, ci sono vari log e System.out usati per loggare un po' quello che succede (ignorateli...ovviamente non servono). Sostanzialmente io faccio così:

1) Metto dentro la variabile result il riferimento alla lista di punti di interesse (che sono oggetti definiti da me di tipo POI)
2) Se result non è null (se la lista contiene almeno un punto di interesse): crea l'oggetto List<Overlay> mapOverlays, poi crea l'oggetto Drawable icona (per l'icona, attualmente usa l'iconcina standard di Android con il robottino verde), e crea l'oggetto PoiItemizedOverlay itemizedOverlay passandogli appunto l'iconcina di prima.
3) In fine per visualizzare questi punti di interesse creo un iteratore sulla lista di Poi result e la scorro tutta andando a creare di volta in volta un nuovo oggetto GeoPoint (creato usando la longitudine e la latitudine del punto di interesse su cui è arrivato l'iteratore) ed un nuovo oggetto di tipo OverlayItem a cui passo il riferimento al GeoPoint appena creato ed il riferimento al nome ed all'indirizzo wikipedia del punto di interesse in questione (ottenuto tramite i due appositi metodi dell'oggetto Poi)

Però quando clicko sull'iconcina sulla mappa che mi rappresenta il punto di interesse invece di apparirmi il fumetto con il nome del punto di interesse (reperito tramite il metodo element.getNome()) ed il link a wikipedia (reperito tramite il metodo element.getWikiLink(): l'applicazione crasha e dà il seguente messaggio di errore: The application GuidaGeoReferenziata (process mieapplicazioni.guidageoreferenziata) has stopped unexpetly. Please try again

Codice: [Seleziona]
public void onResume(){
            super.onResume();
            Log.d("sono entrato dentro ", "on resume");
            System.out.println("Sono entrato dentro on resume");
               
                      /* qui con un for creiamo tanti oggetti overlay quanti sono gli elementi della
                         lista, per farlo servono altrettanti oggetti GeoPoint(lat,lon)*/
           
            result = GuidaSubActivity.getRisultato();        // Mette la lista di POI nella variabile result
            if(result != null){
                    System.out.println("Sono dentro GuidaGeoReferenziata e result punta a: " + result.toString());
                   
                    /*
                    Poi poiMain = null;
            poiMain = result.get(3);
            System.out.println("Nome poiMain: " + poiMain.getNome());
            System.out.println("Lat poiMain: " + poiMain.getLat());
            System.out.println("Lon poiMain: " + poiMain.getLon());
            System.out.println("WikiLink poiMain: " + poiMain.getWikilynk());
            */
           
           
            System.out.println("Stò per creare la mappa overlay !!!");
            List<Overlay> mapOverlays = mapView.getOverlays();
            System.out.println("mapOverlays punta a: " + mapOverlays.toString());
            Drawable icona = this.getResources().getDrawable(R.drawable.icon);
            PoiItemizedOverlay itemizedOverlay = new PoiItemizedOverlay(icona);
            System.out.println("itemizedOverlay punta a: " + itemizedOverlay.toString());
            //********
           
            Iterator <Poi> itr = result.iterator();
            while (itr.hasNext()) {
                   
                    Poi element = itr.next();
                    System.out.println("Nome Poi element corrente: " + element.getNome());
                    System.out.println("Latitudine Poi element corrente: " + element.getLat());
                    System.out.println("Longitudine Poi element corrente: " + element.getLon());
                   
                    Double tempLat = element.getLat()*1E6;
                    Double tempLon = element.getLon()*1E6;
                    System.out.println("tempLat contiene: " + tempLat.toString() + " tempLon contiene: " + tempLon.toString());
                                       
                    //System.out.println("tempLat: " + tempLat + " tempLon: " + tempLon);
                   
                    GeoPoint currentGP = new GeoPoint(tempLat.intValue(),tempLon.intValue());
                    OverlayItem currentOI = new OverlayItem(currentGP,element.getNome(),element.getWikilynk());
                   
                    itemizedOverlay.addOverlay(currentOI);
               
            }
            mapOverlays.add(itemizedOverlay);
            }
           
           
    }//--fine

Nel LogCat dà il seguente messaggio di errore (viene sollevata un'eccezione a quanto pare):

Codice: [Seleziona]
11-11 18:37:18.856: WARN/InputManagerService(59): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@43f85cf8
11-11 18:37:20.255: DEBUG/AndroidRuntime(315): Shutting down VM
11-11 18:37:20.255: WARN/dalvikvm(315): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
11-11 18:37:20.346: ERROR/AndroidRuntime(315): FATAL EXCEPTION: main
11-11 18:37:20.346: ERROR/AndroidRuntime(315): java.lang.NullPointerException
11-11 18:37:20.346: ERROR/AndroidRuntime(315):     at com.android.internal.app.AlertController$AlertParams.<init>(AlertController.java:743)
11-11 18:37:20.346: ERROR/AndroidRuntime(315):     at android.app.AlertDialog$Builder.<init>(AlertDialog.java:273)
11-11 18:37:20.346: ERROR/AndroidRuntime(315):     at mieapplicazioni.guidageoreferenziata.PoiItemizedOverlay.onTap(PoiItemizedOverlay.java:63)
11-11 18:37:20.346: ERROR/AndroidRuntime(315):     at com.google.android.maps.ItemizedOverlay.onTap(ItemizedOverlay.java:453)
11-11 18:37:20.346: ERROR/AndroidRuntime(315):     at com.google.android.maps.OverlayBundle.onTap(OverlayBundle.java:83)
11-11 18:37:20.346: ERROR/AndroidRuntime(315):     at com.google.android.maps.MapView$1.onSingleTapUp(MapView.java:347)
11-11 18:37:20.346: ERROR/AndroidRuntime(315):     at com.google.android.maps.GestureDetector.onTouchEvent(GestureDetector.java:533)
11-11 18:37:20.346: ERROR/AndroidRuntime(315):     at com.google.android.maps.MapView.onTouchEvent(MapView.java:647)
11-11 18:37:20.346: ERROR/AndroidRuntime(315):     at android.view.View.dispatchTouchEvent(View.java:3766)
11-11 18:37:20.346: ERROR/AndroidRuntime(315):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:897)
11-11 18:37:20.346: ERROR/AndroidRuntime(315):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
11-11 18:37:20.346: ERROR/AndroidRuntime(315):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
11-11 18:37:20.346: ERROR/AndroidRuntime(315):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
11-11 18:37:20.346: ERROR/AndroidRuntime(315):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
11-11 18:37:20.346: ERROR/AndroidRuntime(315):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1671)
11-11 18:37:20.346: ERROR/AndroidRuntime(315):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
11-11 18:37:20.346: ERROR/AndroidRuntime(315):     at android.app.Activity.dispatchTouchEvent(Activity.java:2086)
11-11 18:37:20.346: ERROR/AndroidRuntime(315):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1655)
11-11 18:37:20.346: ERROR/AndroidRuntime(315):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1785)
11-11 18:37:20.346: ERROR/AndroidRuntime(315):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-11 18:37:20.346: ERROR/AndroidRuntime(315):     at android.os.Looper.loop(Looper.java:123)
11-11 18:37:20.346: ERROR/AndroidRuntime(315):     at android.app.ActivityThread.main(ActivityThread.java:4627)
11-11 18:37:20.346: ERROR/AndroidRuntime(315):     at java.lang.reflect.Method.invokeNative(Native Method)
11-11 18:37:20.346: ERROR/AndroidRuntime(315):     at java.lang.reflect.Method.invoke(Method.java:521)
11-11 18:37:20.346: ERROR/AndroidRuntime(315):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
11-11 18:37:20.346: ERROR/AndroidRuntime(315):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
11-11 18:37:20.346: ERROR/AndroidRuntime(315):     at dalvik.system.NativeStart.main(Native Method)
11-11 18:37:20.375: WARN/ActivityManager(59):   Force finishing activity mieapplicazioni.guidageoreferenziata/.GuidaGeoReferenziata

Avete qualche idea sul perchè e sul come potrei risolvere?

Grazie mille
Andrea

Offline Audrey

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    AVD eclair 5554
  • Sistema operativo:
    Windows XP
0
andrea io purtroppo non ti posso aiutare ma ho da fare un progetto universitario molto simile..non è che puoi darmi una mano? sono il alto mare... :'(

Offline AndreaNobili

  • Utente junior
  • **
  • Post: 75
  • Respect: 0
    • Mostra profilo
0
andrea io purtroppo non ti posso aiutare ma ho da fare un progetto universitario molto simile..non è che puoi darmi una mano? sono il alto mare... :'(

Guarda,
in questo periodo sono incasinatissimo tra stage e studio. Però eventualmente mandami un messaggio privato spiegandomi per bene cosa devi fare che magari qualche dritta te la dò volentieri, magari poi ti passo anche il mio codice così gli dai un'occhiata anche se col senno di poi (il progetto è stato consegnato parecchi mesi fà) molte cose le avrei fatte in modo diverso.

Fatti vivo

Ciao
Andrea

Offline Audrey

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    AVD eclair 5554
  • Sistema operativo:
    Windows XP
0
ti ho mandato un messaggio...buona lettura e buona serata..e grazie in anticipo  ;-)