Autore Topic: Problema con drawMyLocation() in alcuni device. (Non disegna il marker)  (Letto 849 volte)

Offline A2PLab

  • Nuovo arrivato
  • *
  • Post: 37
  • [Close The World - txeN ehT nepO]
  • Respect: +1
    • Google+
    • http://it.linkedin.com/in/giuseppemastroeni
    • a2plab
    • a2plab
    • Mostra profilo
    • A2PLab
  • Dispositivo Android:
    HTC Desire, Acer Iconia Tab a500
  • Sistema operativo:
    Ubuntu 11.04
Salve a tutti ragazzi.
Finalmente dopo un lungo periodo di astinenza dal java torno a sviluppare su android, e vengo a proporre un problema che potrebbe essere allo stesso tempo banale o complicatissimo :-).

Sto sviluppando una app che usa le API di Maps, e tra le funzioni c'è quella di trovare dei POI vicino alla location dell'utente o a una posizione scelta dall'interfaccia.
Riesco già a stampare i POI da un database Mysql sulla mappa con gli Overlay e con i loro Marker personalizati.
Il prossimo passo dovrebbe essere quello di riuscire a recuperare la posizione del dispositivo e poi quella di settare una posizione specifica in base alla quale la app deve calcolare delle distanze.
Sono fermo al primo passo :-(

In realtà riesco a farlo, ma ho dei comportamenti strani in funzione del device che utilizzo per debuggare.

Descrivo il mio codice:

Classe HomeActivity:

Codice (Java): [Seleziona]
public class HomeActivity extends MapActivity {

        private final String LOG_TAG = getClass().getSimpleName();
        private MapController mapController;
        private LocationManager locationManager;
        private MyLocationOverlay myLocationOverlay;
        private MapView mapView;
        private String provider;
        private Location location;
        private LocationListener locationListener;
        private List<Overlay> mapOverlay;

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);

                this.mapView = (MapView) findViewById(R.id.mapView);
                this.mapView.setBuiltInZoomControls(true);
                this.mapView.setClickable(true);
        }

        @Override
        public void onStart() {
                super.onStart();
                // inizializzo il controller
                this.mapController = mapView.getController();
                this.mapController.setCenter(new GeoPoint(45479196, 9845241));
                this.mapController.setZoom(9);

                // Inizializzo il location listener
                this.locationListener = new CustomLocationListener(mapView);

                // Inizializzo l'Overlay della location
                this.mapOverlay = mapView.getOverlays();
                this.myLocationOverlay = new CustomLocationOverlay(this, mapView);
                mapOverlay.add(myLocationOverlay);
                myLocationOverlay.enableMyLocation();

                // Otteniamo il riferimento al LocationManager
                this.locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

                Criteria criteria = new Criteria();
                // criteria.setAccuracy(Criteria.ACCURACY_FINE);
                // criteria.setPowerRequirement(Criteria.POWER_LOW);
                // criteria.setAltitudeRequired(false);
                // criteria.setBearingRequired(false);
                // criteria.setSpeedRequired(false);
                // criteria.setCostAllowed(false);

                provider = locationManager.getBestProvider(criteria, true);
                location = locationManager.getLastKnownLocation(provider);

                locationManager.requestLocationUpdates(provider, 0, 0,this.locationListener);

        }

        @Override
        public void onPause() {
                super.onPause();
                // Stoppa Listener delle posizioni
                if (locationManager != null) {
                        locationManager.removeUpdates(this.locationListener);
                        myLocationOverlay.disableMyLocation();
                }
        }

        @Override
        protected void onResume() {
                super.onResume();
                locationManager.requestLocationUpdates(this.provider, 30000, 10,
                                this.locationListener);
                myLocationOverlay.enableMyLocation();
        }

        @Override
        protected boolean isRouteDisplayed() {
                // TODO Auto-generated method stub
                return false;
        }
}

Ho anche implementato ed esteso il Listener per Location

CustomLocationListener

Codice (Java): [Seleziona]
public class CustomLocationListener implements LocationListener {

        private final String LOG_TAG = getClass().getSimpleName();
        private MapView  mapView;

        public CustomLocationListener(MapView mapView) {
                this.mapView = mapView;
        }

        @Override
        public void onLocationChanged(Location location) {     
                        mapView.postInvalidate();
                Double geoLat = location.getLatitude() * 1E6;
                Double geoLng = location.getLongitude() * 1E6;
                GeoPoint point = new GeoPoint(geoLat.intValue(), geoLng.intValue());           
                mapView.getController().animateTo(point);
        }

....
}

Per avere un marker personalizzato.
CustomLocationOverlay
Codice (Java): [Seleziona]
public class CustomLocationOverlay extends MyLocationOverlay {

        private final String LOG_TAG = getClass().getSimpleName();

        public CustomLocationOverlay(Context context, MapView mapView) {
                super(context, mapView);
        }

        @Override
        protected void drawMyLocation(Canvas canvas, MapView mapView,
                        Location lastFix, GeoPoint myLocation, long when) {
                //super.drawMyLocation(canvas, mapView, lastFix, myLocation, when);

                Bitmap marker = BitmapFactory.decodeResource(
                                mapView.getResources(), R.drawable.blue_dot_circle);
                Point point = new Point();
                mapView.getProjection().toPixels(myLocation, point);
                int x = point.x - marker.getWidth() / 2;
                int y = point.y - marker.getHeight()/2;
                canvas.drawBitmap(marker, x, y, null);

//      Toast.makeText(this.context, "drawmylocation", 10000).show();
                Log.i(LOG_TAG, "drawMyLocation()");
        }
}

Allora, detto questo spiego il problema:
Ho due dispositivi di debug, un HTC Desire con android 2.3(rootato cyanogenmod) e un Acer Icona Tab a500(android 3.2 originale).
Nel seondo è risaputo che il GPS non funziona benissimo, ma funziona. :'(

Il mio problema è che con questo codice sull'iconia Tab non funziona neanche il provider "network".  Nioè non mi stampa il marker perchè ho visto che non entra mai dentro il metodo drawMylocation() dell'Overlay, ma funziona il riconoscimento della posizione, tant'è che la sposta nella mia posizione corrente.
Quando abilito Il GPS, il sistema riconosce la mia posizione (facendo l'animateTo()), ma non disegna il marker se prima non si associa a qualche satellite(minuti).
Stessa cosa se forzo la chiamata al metodo locationlistener.onlocationChanged(location)" dentro l'activity, trova il punto, sposta la mappa, ma niente marker.

Quindi ho il merker solo se il provider è GPS e solo dopo minuti. ?????

Mentre sul Desire funziona tutto correttamente, sia network che GPS, disegnando immediatamente il marker che dico io (anche con quello di default)

Il logCat non presente niente di anomalo, tranne: questo, anche se non credo importi:

Questo è quando uso il provider network


---------------------------
...
I/Maps.MyLocationOverlay(18977): Request updates from network
...
I/MapActivity(18977): Handling network change notification:CONNECTED
..
E/MapActivity(15582): Couldn't get connection factory client
---------------------------


P.S.  Penso che Sposterò  il codice dell'activity in un service o cmq in un thread in background che si occupa di controllare il provider attivo e la posizione dell'utente.




« Ultima modifica: 17 Febbraio 2012, 16:39:36 CET da pippopeppe »
[Close The World - txeN ehT nepO]

Offline A2PLab

  • Nuovo arrivato
  • *
  • Post: 37
  • [Close The World - txeN ehT nepO]
  • Respect: +1
    • Google+
    • http://it.linkedin.com/in/giuseppemastroeni
    • a2plab
    • a2plab
    • Mostra profilo
    • A2PLab
  • Dispositivo Android:
    HTC Desire, Acer Iconia Tab a500
  • Sistema operativo:
    Ubuntu 11.04
Re:Problema con drawMyLocation() in alcuni device. (Non disegna il marker)
« Risposta #1 il: 20 Febbraio 2012, 11:43:43 CET »
0
UP.

Può essere che è dovuto al fatto che devo aggiornare la mappa da un'altro thread?
Service o AsyncTask?
[Close The World - txeN ehT nepO]

Offline A2PLab

  • Nuovo arrivato
  • *
  • Post: 37
  • [Close The World - txeN ehT nepO]
  • Respect: +1
    • Google+
    • http://it.linkedin.com/in/giuseppemastroeni
    • a2plab
    • a2plab
    • Mostra profilo
    • A2PLab
  • Dispositivo Android:
    HTC Desire, Acer Iconia Tab a500
  • Sistema operativo:
    Ubuntu 11.04
Re:Problema con drawMyLocation() in alcuni device. (Non disegna il marker)
« Risposta #2 il: 22 Marzo 2012, 13:21:43 CET »
0
Ho implementato diversamente la localizzazione e l'aggiornamento della mappa utilizzando le librerie aniqdroid per le quali ho fatto un topic apposito:
Proposta di utilizzo di libreria - Android Developers Italia.

Il problema del non disegnare la posizione rimane, se qualcuno ha idee, che ben venga.

Ho scoperto che il problema lo ho se mi estendo MyLocataionOverlay e funziona invece se uso quello di default.
« Ultima modifica: 22 Marzo 2012, 13:23:26 CET da pippopeppe »
[Close The World - txeN ehT nepO]