CERCA
PER MODELLO
FullScreen Chatbox! :)

Utente del giorno: DHD con ben 31 Thanks ricevuti nelle ultime 24 ore
Utente della settimana: th3D0ct0r con ben 100 Thanks ricevuti negli ultimi sette giorni
Utente del mese: AI0LIA con ben 494 Thanks ricevuti nell'ultimo mese

Visualizzazione dei risultati da 1 a 7 su 7
Discussione:

[Eclipse+adt] Google Maps + GPS errore con il Location Manager

  1. #1
    Baby Droid

    Registrato dal
    Aug 2010
    Messaggi
    23
    Thanks
    1
    Thanked 0 Times in 0 Posts
    Predefinito

    [Eclipse+adt] Google Maps + GPS errore con il Location Manager

    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à.

    Appena lancio il programma però c'è un errore che dice che " l'applicazione si è arrestata inaspettatamente".

    Qui l'errore:
    codice:
    09-02 14:13:38.262: ERROR/AndroidRuntime(463): FATAL EXCEPTION: main
    09-02 14:13:38.262: ERROR/AndroidRuntime(463): java.lang.RuntimeException: Unable to start activity ComponentInfo{mieapplicazioni.menudemo/mieapplicazioni.menudemo.MenuDemo}: java.lang.IllegalArgumentException: provider=location
    09-02 14:13:38.262: ERROR/AndroidRuntime(463):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
    09-02 14:13:38.262: ERROR/AndroidRuntime(463):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
    09-02 14:13:38.262: ERROR/AndroidRuntime(463):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
    09-02 14:13:38.262: ERROR/AndroidRuntime(463):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
    09-02 14:13:38.262: ERROR/AndroidRuntime(463):     at android.os.Handler.dispatchMessage(Handler.java:99)
    09-02 14:13:38.262: ERROR/AndroidRuntime(463):     at android.os.Looper.loop(Looper.java:123)
    09-02 14:13:38.262: ERROR/AndroidRuntime(463):     at android.app.ActivityThread.main(ActivityThread.java:4627)
    09-02 14:13:38.262: ERROR/AndroidRuntime(463):     at java.lang.reflect.Method.invokeNative(Native Method)
    09-02 14:13:38.262: ERROR/AndroidRuntime(463):     at java.lang.reflect.Method.invoke(Method.java:521)
    09-02 14:13:38.262: ERROR/AndroidRuntime(463):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
    09-02 14:13:38.262: ERROR/AndroidRuntime(463):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
    09-02 14:13:38.262: ERROR/AndroidRuntime(463):     at dalvik.system.NativeStart.main(Native Method)
    09-02 14:13:38.262: ERROR/AndroidRuntime(463): Caused by: java.lang.IllegalArgumentException: provider=location
    09-02 14:13:38.262: ERROR/AndroidRuntime(463):     at android.os.Parcel.readException(Parcel.java:1251)
    09-02 14:13:38.262: ERROR/AndroidRuntime(463):     at android.os.Parcel.readException(Parcel.java:1235)
    09-02 14:13:38.262: ERROR/AndroidRuntime(463):     at android.location.ILocationManager$Stub$Proxy.getLastKnownLocation(ILocationManager.java:758)
    09-02 14:13:38.262: ERROR/AndroidRuntime(463):     at android.location.LocationManager.getLastKnownLocation(LocationManager.java:956)
    09-02 14:13:38.262: ERROR/AndroidRuntime(463):     at mieapplicazioni.menudemo.MenuDemo.onStart(MenuDemo.java:73)
    09-02 14:13:38.262: ERROR/AndroidRuntime(463):     at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1129)
    09-02 14:13:38.262: ERROR/AndroidRuntime(463):     at android.app.Activity.performStart(Activity.java:3781)
    09-02 14:13:38.262: ERROR/AndroidRuntime(463):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2636)
    09-02 14:13:38.262: ERROR/AndroidRuntime(463):     ... 11 more
    se leggete la causa sembra che alla linea
    codice:
        Location location = locationManager.getLastKnownLocation(Context.LOCATION_SERVICE);
    accada qualcosa di inatteso con l'argomento del metodo getLastKnowLocation().

    Scusate se creo 2 post ma essendo alle prime armi è l'unico modo per farvi capire quello che succede.

    Grazie !!

    Di seguito c'è il codice..
    Ultima modifica di helldron; 02-09-10 a 15:25

  2.  
  3. #2
    Baby Droid

    Registrato dal
    Aug 2010
    Messaggi
    23
    Thanks
    1
    Thanked 0 Times in 0 Posts
    Predefinito

    Qui c'è l'attività principale:
    codice:
    ackage mieapplicazioni.menudemo;
    
    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();
    
        // Aggiorna l'interfaccia
        Location location = locationManager.getLastKnownLocation(Context.LOCATION_SERVICE);
        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;
        	}
    }
    Il manifest.xml
    codice:
    <?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>

  4. #3
    Baby Droid

    Registrato dal
    Aug 2010
    Messaggi
    23
    Thanks
    1
    Thanked 0 Times in 0 Posts
    Predefinito

    Sembra che aggiungendo questo codice (cambiando opportunamento l'argomento del metodo "getLastKnowLocation()":

    codice:
    Criteria criteria = new Criteria();  
    criteria.setAccuracy(Criteria.ACCURACY_FINE);
    String provider = locationManager.getBestProvider(criteria, true); 
    
    Location location = locationManager.getLastKnownLocation(provider);
    updateWithNewLocation(location);
    l'applicazione riesca ad avviarsi. Tuttavia non appena faccio il primo test con telnet per simulare gli spostamenti dell'utente l'applicazione va in crash e questa volta l'errore si sposta sulla riga:

    codice:
    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.

    Ragazzi, vi sarei molto grato se riusciste a darmi qualche aiuto,
    Ciao!!

  5. #4
    Baby Droid

    Registrato dal
    Sep 2010
    Messaggi
    1
    Thanks
    0
    Thanked 0 Times in 0 Posts
    Predefinito

    L'errore del primo post è che tu usavi una stringa sbagliata:
    Non è:
    Ma piuttosto:

    Infatti lo hai risolto quando hai usato locationManager.getBestProvider in quanto la funzione ti restituisce la stringa con il nome del provider (gps/network). Di solito l'emulatore ti restituisce sempre network.

    Il problema dopo la correzione potrebbe essere causato da getLastKnownLocation che ti da una Location nulla (probabilmente usa il provider network) e quindi quando provi ad richiamare getLatitude o getLongitude causi un'eccezione.

    Prova a metterci prima un controllo del tipo if (location ==null) per verificare l'ipotesi che ti ho appena descritto.

  6. #5
    Baby Droid

    Registrato dal
    Aug 2010
    Località
    Palermo
    Messaggi
    48
    Thanks
    0
    Thanked 7 Times in 7 Posts
    Predefinito

    qualche try/catch con Toast non sarebbe nemmeno male e vedi dove ti da l'eccezione e con quale messaggio

  7. #6
    Baby Droid

    Registrato dal
    Aug 2010
    Messaggi
    23
    Thanks
    1
    Thanked 0 Times in 0 Posts
    Predefinito

    Ecco quello che succede se modifico il mio programma così :

    codice:
    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);
    La stringa che tira fuori appena vedo l'interfaccia, quindi all'avvio di onStart() è:

    "Location nulla, provider usato GPS"

    Abbiamo sempre una NullPointerException appena faccio le prove con telnet

    Direi che il gps è stato utilizzato a dispetto di quanto dicevi ma location è null, come mai?
    Ultima modifica di helldron; 08-09-10 a 09:50

  8. #7
    Baby Droid

    Registrato dal
    Aug 2010
    Messaggi
    23
    Thanks
    1
    Thanked 0 Times in 0 Posts
    Predefinito

    risolto, mancava l'inizializzazione del mapController, purtroppo mi era del tutto sfuggito

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •