Autore Topic: Aggiornamento coordinate GPS blocca UI  (Letto 996 volte)

Offline hunterbit

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S
  • Play Store ID:
    OpenWebs
  • Sistema operativo:
    Windows 7
Aggiornamento coordinate GPS blocca UI
« il: 21 Gennaio 2012, 02:22:32 CET »
0
Ciao a tutti,
sono nuovo del forum e abbstanza nuovo del mondo android.
Vengo subito al dunque. ho creato una mia applciazione che fa uso del GPS e con il debug sembrava funzionare alla perfezione.
Successivamente l'ho installato sul mio galaxy per provare il tutto. Mi succede che come arrivano le info del GPS alla mia applicazione si blocca
tutta l'interfaccia e non posso più interagire col programma.
Spero di essermi spiegato. Cosa potrebbe essere?
Invio qui di seguito il mio codice
Grazie a tutti

Codice (Java): [Seleziona]
package it.etaxi.modem;

import it.openwebs.webservice.RestClient;
import it.openwebs.webservice.RestClient.RequestMethod;

import java.io.IOException;
import java.util.List;
import java.util.Locale;

import android.content.Context;
import android.content.Intent;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

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;

public class ETaxiRilevazioneGPS extends MapActivity {

        private ETaxiApplication app;
        private String dataIP;

        // Riferimenti ai componenti
        private Button btnChiamaTaxi;
        private TextView txtVia;

        // Riferimento alla MapView
        private MapView mapView;

        // Riferimento al MapController
        MapController mapController;

        // Riferimento al MyLocationOverlay
        private MyLocationOverlay myLocationOverlay;

        // Otteniamo il riferimento al LocationManager
        LocationManager locationManager;
       
        // Otteniamo il riferimento al GeoCoder
        private Geocoder geocoder;

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

                // Otteniamo il riferimento ai vari componenti
                btnChiamaTaxi = (Button) findViewById(R.id.btnChiamaTaxiGPS);
                btnChiamaTaxi.setOnClickListener(new View.OnClickListener() {
                       
                        @Override
                        public void onClick(View v) {
                                cercaTaxi();
                               
                        }
                });
                txtVia = (TextView) findViewById(R.id.txtViaGPS);

                // 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(1);

                // 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);
               
                // Otteniamo il riferimento al geocoder
                geocoder = new Geocoder(this,Locale.ITALY);
               
                // Recuperiamo un riferimento ad ETaxiApplication
                app=(ETaxiApplication) getApplication();

                // 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());
                       
                        List<Address> address=null;
                        try {
                                address=geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
                        } catch (IOException e) {
                                e.printStackTrace();
                                Log.e("ERRORE", "Location not found", e);
                        }
                        if(address!=null){
                                txtVia.setText(address.get(0).getAddressLine(0)+", "+address.get(0).getAddressLine(1));
                                app.setIndirizzo(txtVia.getText().toString());
                        }
                        mapController.animateTo(point);
                       
                       

                }

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

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

                @Override
                public void onStatusChanged(String provider, int status, Bundle extras) {
                        Toast.makeText(ETaxiRilevazioneGPS.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;
        }
       
        protected void cercaTaxi() {
                String via=txtVia.getText().toString();
                if(via.equalsIgnoreCase("ricerca")){
                        return;
                }
                Intent intent=new Intent(this,ETaxiChiama.class);
                intent.putExtra("indirizzo", app.getIndirizzo());
                intent.putExtra("nominativo", app.getNominativo());
                intent.putExtra("telefono", app.getTelefono());
                intent.putExtra("note", app.getNote());
                startActivity(intent);
                               
        }
}

Offline Giovanni D'Addabbo

  • Utente normale
  • ***
  • Post: 163
  • Respect: +8
    • Google+
    • giovannid
    • giovanni.daddabbo
    • magoscuro
    • Mostra profilo
    • Rhubbit.it - Sviluppo app Android/iOs
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Rhubbit srl
  • Sistema operativo:
    Windows/Mac/Linux
Re:Aggiornamento coordinate GPS blocca UI
« Risposta #1 il: 21 Gennaio 2012, 10:36:29 CET »
0
semplicemente metti tutto un thread così non blocca più l'interfaccia :)

Offline hunterbit

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S
  • Play Store ID:
    OpenWebs
  • Sistema operativo:
    Windows 7
Re:Aggiornamento coordinate GPS blocca UI
« Risposta #2 il: 21 Gennaio 2012, 10:42:56 CET »
0
Ciao e grazie per la risposta.
Non avendo lavorato mai con i thead mi potresti fare un esempio o magari dirmi in quale metodo inserire il thead di preciso?

Grazie tanto

Offline Giovanni D'Addabbo

  • Utente normale
  • ***
  • Post: 163
  • Respect: +8
    • Google+
    • giovannid
    • giovanni.daddabbo
    • magoscuro
    • Mostra profilo
    • Rhubbit.it - Sviluppo app Android/iOs
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Rhubbit srl
  • Sistema operativo:
    Windows/Mac/Linux
Re:Aggiornamento coordinate GPS blocca UI
« Risposta #3 il: 22 Gennaio 2012, 12:31:36 CET »
0
una roba veloce potrebbe essere questa:
Codice (Java): [Seleziona]
Thread geoLocalizeMe = new Thread(){
//qui tutto il tuo codice per la localizzazione
}

poi dove ti serve inserisci:
Codice (Java): [Seleziona]
geoLocalizeMe.start();
spero ti possa essere utile questo piccolo snippet di codice

Offline hunterbit

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S
  • Play Store ID:
    OpenWebs
  • Sistema operativo:
    Windows 7
Re:Aggiornamento coordinate GPS blocca UI
« Risposta #4 il: 22 Gennaio 2012, 12:34:07 CET »
0
ho fatto un pò di ricerche ed alla fine ho modificato il codice usando il thread con handler come suggerito ma non mi funge lo stesso. Un passo avanti l'ho fatto di sicuro, infatti l'interfaccia non mi si blocca più ma non ho capito il perchè non mi trova la posiszione GPS.
Mi spiego meglio, se dall'emulatore DDMS invio una coordinata l'emulatore la riceve e mi scrive in modo corretto la posizione trovato in una TextView da me creata.

Quando poi creo APK e lo installo nel mio galaxy e faccio una reale prova non succede niente di niente. Dove sbaglio?

Grazie

Codice (Java): [Seleziona]
package it.etaxi.modem;

import it.openwebs.webservice.RestClient;
import it.openwebs.webservice.RestClient.RequestMethod;

import java.io.IOException;
import java.util.List;
import java.util.Locale;

import android.content.Context;
import android.content.Intent;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

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;

public class ETaxiRilevazioneGPS extends MapActivity {

        private ETaxiApplication app;
        private String dataIP;
        private boolean trovato = false;

        // Riferimenti ai componenti
        private Button btnChiamaTaxi;
        private TextView txtVia;

        // Riferimento alla MapView
        private MapView mapView;

        // Riferimento al MapController
        MapController mapController;

        // Riferimento al MyLocationOverlay
        private MyLocationOverlay myLocationOverlay;

        // Otteniamo il riferimento al LocationManager
        LocationManager locationManager;

        // Otteniamo il riferimento al GeoCoder
        private Geocoder geocoder;

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

                // Otteniamo il riferimento ai vari componenti
                btnChiamaTaxi = (Button) findViewById(R.id.btnChiamaTaxiGPS);
                btnChiamaTaxi.setOnClickListener(new View.OnClickListener() {

                        @Override
                        public void onClick(View v) {
                                cercaTaxi();

                        }
                });
                txtVia = (TextView) findViewById(R.id.txtViaGPS);

                // 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(18);

                // 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);

                // Otteniamo il riferimento al geocoder
                geocoder = new Geocoder(this, Locale.ITALY);

                // Recuperiamo un riferimento ad ETaxiApplication
                app = (ETaxiApplication) getApplication();

                // 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);

                // Aggiorna la location con l'ultima conosciuta
                Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                if (location != null) {
                        Double geoLat = location.getLatitude() * 1E6;
                        Double geoLng = location.getLongitude() * 1E6;
                        GeoPoint point = new GeoPoint(geoLat.intValue(), geoLng.intValue());
                        mapController.animateTo(point);
                }

        }

        LocationListener locationListener = new LocationListener() {

                @Override
                public void onLocationChanged(final Location location) {

                        Thread searchThread = new Thread("RicercaThread") {

                                @Override
                                public void run() {

                                        // Otteniamo il messaggio
                                        Message message = mapHandler.obtainMessage();
                                        // Utilizziamo il Geocoder per fare la ricerca
                                        List<Address> address = null;
                                        try {
                                                address = geocoder.getFromLocation(location.getLatitude(),
                                                                location.getLongitude(), 1);

                                                Toast.makeText(ETaxiRilevazioneGPS.this,
                                                                "ricevo location", Toast.LENGTH_SHORT).show();
                                                // Se c'e' qualcosa lo notifichiamo
                                                if (address != null && address.size() > 0) {
                                                        Toast.makeText(ETaxiRilevazioneGPS.this,
                                                                        "invio messaggio all'handle", Toast.LENGTH_SHORT).show();
                                                        message.obj = address.get(0);
                                                        mapHandler.sendMessage(message);
                                                }
                                        } catch (IOException e) {
                                                e.printStackTrace();
                                                Log.e("ERRORE", "Location not found", e);
                                        }
                                }

                        };
                        // Facciamo partire il Thread
                        searchThread.start();
                }

                @Override
                public void onProviderDisabled(String provider) {
                        Toast.makeText(ETaxiRilevazioneGPS.this, "onProviderDisabled " + provider,
                                        Toast.LENGTH_SHORT).show();
                        // se il provider GPS è abilitato disattiviamo quello wifi
                        if (LocationManager.GPS_PROVIDER == provider) {
                                // Registriamo il LocationListener al provider GPS
                                locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0,
                                                locationListener);
                        }

                }

                @Override
                public void onProviderEnabled(String provider) {
                        Toast.makeText(ETaxiRilevazioneGPS.this, "onProviderEnabled " + provider,
                                        Toast.LENGTH_SHORT).show();
                        // se il provider GPS è abilitato disattiviamo quello wifi
                        if (LocationManager.GPS_PROVIDER == provider) {
                                // Registriamo il LocationListener al provider GPS
                                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,
                                                locationListener);
                        }
                }

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

                }
        };

        @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;
        }

        protected void cercaTaxi() {
                if (!trovato) {
                        return;
                }
                Intent intent = new Intent(this, ETaxiChiama.class);
                intent.putExtra("indirizzo", app.getIndirizzo());
                intent.putExtra("nominativo", app.getNominativo());
                intent.putExtra("telefono", app.getTelefono());
                intent.putExtra("note", app.getNote());
                startActivity(intent);

        }

        private final Handler mapHandler = new Handler() {

                @Override
                public void handleMessage(Message msg) {

                        Toast.makeText(ETaxiRilevazioneGPS.this,
                                        "sono nell'handle", Toast.LENGTH_SHORT).show();
                        // Si ottengono le informazioni se presenti sulla posizione
                        if (msg != null && msg.obj != null) {
                                // Estraiamo le informazioni di posizione
                                Address address = (Address) msg.obj;
                                GeoPoint pointToGo = new GeoPoint((int) address.getLatitude() * 1000000,
                                                (int) address.getLongitude() * 1000000);
                                mapView.getController().setCenter(pointToGo);
                                txtVia.setText(address.getAddressLine(0) + ", " + address.getAddressLine(1));
                                app.setIndirizzo(txtVia.getText().toString());
                                Toast.makeText(ETaxiRilevazioneGPS.this,
                                                txtVia.getText().toString(), Toast.LENGTH_SHORT).show();
                                trovato = true;
                        } else {
                                Toast.makeText(ETaxiRilevazioneGPS.this,
                                                "Non è stata trovata nessuna posizione GPS!!", Toast.LENGTH_SHORT).show();
                        }
                }

        };
}

Offline hunterbit

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S
  • Play Store ID:
    OpenWebs
  • Sistema operativo:
    Windows 7
Re:Aggiornamento coordinate GPS blocca UI
« Risposta #5 il: 22 Gennaio 2012, 12:36:41 CET »
0
non avevo visto che mi hai risposto mentre io scrivevo.
ho adottato una soluzione con i thread ma a quanto pare non va tanto bene. Forse il problema è l'uso dell'handler.
faccio magari una prova solo con l'uso dei thread, vediamo un pò

Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Aggiornamento coordinate GPS blocca UI
« Risposta #6 il: 22 Gennaio 2012, 12:49:28 CET »
0
Ciao. Utilizzando l'emulatore, essendo tu ad inviare la location, l'onLocationChanged viene richiamato solo una volta.
Sul dispositivo, invece, viene richiamato continuamente, dipendentemente dai valori di tempo e distanza che passi nel requestLocationUpdates. Potrebbe essere che, avviando un nuovo thread ogni volta che ricevi una location update, ti ritrovi ad avere più thread che accedono contemporaneamente al geocoder, creando problemi. Un'alternativa potrebbe essere salvare il thread in una variabile e, ad ogni location update, controllare che il thread abbia terminato l'esecuzione prima di avviarlo di nuovo.

Offline hunterbit

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S
  • Play Store ID:
    OpenWebs
  • Sistema operativo:
    Windows 7
Re:Aggiornamento coordinate GPS blocca UI
« Risposta #7 il: 22 Gennaio 2012, 12:52:07 CET »
0
ho capito il senso di quello che dici ma il come farlo non mi è molto chiaro.
L'uso cmq del thread con handler è corretto?

La cosa che però non capisco e del perchè non entra neanche nella sezione di codice dove dovrebbe prendere i dati.
Infatti ho inserito per debug (sempre se ho fatto bene) il seguente codice
Codice (Java): [Seleziona]
Toast.makeText(ETaxiRilevazioneGPS.this,
                "ricevo location", Toast.LENGTH_SHORT).show();

ma non mi appare niente quindi presumo che non ci vada proprio dentro il metodo ed ecco perchè non mi aggiora neanche la TextView.
« Ultima modifica: 22 Gennaio 2012, 13:02:11 CET da hunterbit »

Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Aggiornamento coordinate GPS blocca UI
« Risposta #8 il: 22 Gennaio 2012, 13:20:59 CET »
0
Sì, è corretto.
Il metodo che ti ho suggerito ha l'effetto negativo di non avviare il thread se ce n'è già uno attivo, quindi perderesti la location update.
Il metodo ideale sarebbe controllare che il thread non sia attivo, eventualmente fermarlo, potendo fermare anche il geocoder (usando una classe che estenda Thread e interrompendo il geocoder nel metodo cancel() ), ma purtroppo il geocoder non ha metodi per interrompere la ricerca.
Un'alternativa per non perdere nessun location update potrebbe essere creare un metodo synchronized:
Codice (Java): [Seleziona]
private synchronized Address getAddress(Location location){
Address address = null;
  try {
       address = geocoder.getFromLocation(location.getLatitude(),
           location.getLongitude(), 1);
 
        } catch (IOException e) {
  e.printStackTrace();
}
  return address;
}

e richiamarlo dal Thread:
Codice (Java): [Seleziona]
Thread searchThread = new Thread("RicercaThread") {

                                @Override
                                public void run() {

                                      Address address = getAddress(location);
                                      if (address!=null){
                                        Message message = mapHandler.obtainMessage();
                                         message.obj = address;
                                          mapHandler.sendMessage(message);
}
     }
  }

In questo modo, se il geocoder è impegnato nella ricerca perché già avviato da un thread precedente, il nuovo thread attenderà che si "liberi" prima di proseguire.
« Ultima modifica: 22 Gennaio 2012, 14:02:23 CET da Verandi »