Autore Topic: Ritornare alla posizione corrente  (Letto 640 volte)

Offline megauni

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus Black
  • Sistema operativo:
    Windows 7
Ritornare alla posizione corrente
« il: 13 Febbraio 2012, 15:48:37 CET »
0
Ciao a tutti,

Sto sviluppano la mia prima app con le mappe e devo dire che, a parte i soliti problemi che da eclipse, i tutorial che ho trovato in questo forum sono fatti veramente bene, Complimenti!

comunque ora mi trovo davanti ad un problema davvero semplice e assurdo visto che va tutto il resto: come da titolo non riesco a fargli centrare la mappa alla posizione corrente perchè mi crasha proprio l'applicazione.

Cercando per il forum ho trovato una discussione dove se ne era già parlato ma l'utente poi non ha risposto su come ha risolto.

ora io ho individuato il problema, proprio non ne vuol sapere di raccattare le coordinate ad esempio se io gli chiedo di farmi un toast della latitudine

Codice (Java): [Seleziona]
private void centerMap() {
                //mapController.animateTo(getGeoPoint());
                //int lat = (int) (location.getLatitude());
                //int lng = (int) (location.getLongitude() * 1E6);
                Toast.makeText(PubMappingActivity.this, lat, Toast.LENGTH_LONG).show();
        }

mi si pianta.

ho provato anche a fare un metodo a parte usando GeoPoint ma niente stesso problema, logCat mi dice:

Codice: [Seleziona]
02-13 15:45:37.335: W/dalvikvm(3200): threadid=1: thread exiting with uncaught exception (group=0x4001a560)
02-13 15:45:37.343: E/AndroidRuntime(3200): FATAL EXCEPTION: main
02-13 15:45:37.343: E/AndroidRuntime(3200): java.lang.NullPointerException
02-13 15:45:37.343: E/AndroidRuntime(3200):         at ShuffleSoft.pubarena.PubMap.PubMappingActivity.centerMap(PubMappingActivity.java:127)
02-13 15:45:37.343: E/AndroidRuntime(3200):         at ShuffleSoft.pubarena.PubMap.PubMappingActivity.onMenuItemSelected(PubMappingActivity.java:109)
02-13 15:45:37.343: E/AndroidRuntime(3200):         at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:760)
02-13 15:45:37.343: E/AndroidRuntime(3200):         at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:143)
02-13 15:45:37.343: E/AndroidRuntime(3200):         at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:855)
02-13 15:45:37.343: E/AndroidRuntime(3200):         at com.android.internal.view.menu.IconMenuView.invokeItem(IconMenuView.java:532)
02-13 15:45:37.343: E/AndroidRuntime(3200):         at com.android.internal.view.menu.IconMenuItemView.performClick(IconMenuItemView.java:122)
02-13 15:45:37.343: E/AndroidRuntime(3200):         at android.view.View$PerformClick.run(View.java:9387)
02-13 15:45:37.343: E/AndroidRuntime(3200):         at android.os.Handler.handleCallback(Handler.java:587)
02-13 15:45:37.343: E/AndroidRuntime(3200):         at android.os.Handler.dispatchMessage(Handler.java:92)
02-13 15:45:37.343: E/AndroidRuntime(3200):         at android.os.Looper.loop(Looper.java:130)
02-13 15:45:37.343: E/AndroidRuntime(3200):         at android.app.ActivityThread.main(ActivityThread.java:3694)
02-13 15:45:37.343: E/AndroidRuntime(3200):         at java.lang.reflect.Method.invokeNative(Native Method)
02-13 15:45:37.343: E/AndroidRuntime(3200):         at java.lang.reflect.Method.invoke(Method.java:507)
02-13 15:45:37.343: E/AndroidRuntime(3200):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
02-13 15:45:37.343: E/AndroidRuntime(3200):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
02-13 15:45:37.343: E/AndroidRuntime(3200):         at dalvik.system.NativeStart.main(Native Method)

ah dimenticavo di dire che le coordinate le vado a prendere da un'altra classe apposita come in questo http://www.vogella.de/articles/AndroidLocationAPI/article.html

se ho scordato di inserire qualche dato per farvi capire, scusatemi. :)

Grazie mille per l'aiuto
« Ultima modifica: 13 Febbraio 2012, 18:27:05 CET da megauni »

Offline qualcuno

  • Nuovo arrivato
  • *
  • Post: 24
  • Respect: 0
    • Google+
    • Mostra profilo
    • Ingegnere Informatico Blog
Re:Ritornare alla posizione corrente
« Risposta #1 il: 14 Febbraio 2012, 22:41:40 CET »
0
non si capisce bene dalle informazioni che hai fornito... il center map da dove lo richiami???

cmq dovresti recuperare le coordinate nel metodo seguente (richiamato dal location service appena recupera le coordinate)


Codice (Java): [Seleziona]
public void onLocationChanged(Location location) {
                        int lat = (int) (location.getLatitude() * 1E6);
                        int lng = (int) (location.getLongitude() * 1E6);
                        GeoPoint point = new GeoPoint(lat, lng);
                        mapController.animateTo(point); //      mapController.setCenter(point);
                }

Offline megauni

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus Black
  • Sistema operativo:
    Windows 7
Re:Ritornare alla posizione corrente
« Risposta #2 il: 14 Febbraio 2012, 23:03:20 CET »
0
ciao,

grazie per la risposta, temevo di non esser stato chiaro.

comunque il centermap lo richiamo da un menuItem ma il problema è che quando vado a richiedere le nuove coordinate dentro al costruttore centermap non mi vede il "location" perchè sta dentro alla classe LocationListener.

temporaneamente ho ovviato alla cosa mettendo come variabile globale "point" di GeoPoint, ma non è una cosa che mi piace molto :)

Codice (Java): [Seleziona]
package ShuffleSoft.pubarena.PubMap;



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 com.google.android.maps.OverlayItem;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.location.Criteria;
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 PubMappingActivity extends MapActivity {
       
        private TextView tvLatitudine;
        private TextView tvLongitudine;
        private TextView tvVelocita;
        private TextView tvQuota;
        private TextView tvAccuratezza;
       
        private String provider;
        //private MyOverlays itemizedoverlay;
        //private List<Overlay> overlays;
       
        public static final int INSERT_ID = Menu.FIRST;
        public static final int CENTER_ID = Menu.FIRST + 1;
        public static final int SATELLITE_ID = Menu.FIRST + 2;
        public static final int MAP_ID = Menu.FIRST + 3;
       
        //Riferimento alla MapView
        private MapView mapView;

        //Riferimento al MapController
        MapController mapController;

        //Riferimento al MyLocationOverlay
        private MyLocationOverlay myLocationOverlay;

        // Otteniamo il riferimento al LocationManager
        LocationManager locationManager;
       
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);

                tvLatitudine = (TextView)this.findViewById(R.id.tvLatitudine);
                tvLongitudine = (TextView)this.findViewById(R.id.tvLongitudine);
                tvVelocita = (TextView)this.findViewById(R.id.tvVelocita);
                tvQuota = (TextView)this.findViewById(R.id.tvQuota);
                tvAccuratezza = (TextView)this.findViewById(R.id.tvAccuratezza);


                // 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(16);
               
                // Aggiungiamo l'overlay sulla mappa della nostra posizione
                myLocationOverlay = new MyLocationOverlay(this, mapView);
                List<Overlay> overlays = mapView.getOverlays();
                overlays.add(myLocationOverlay);
                myLocationOverlay.enableMyLocation();
                                               
                // Get the location manager
                locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
                // Define the criteria how to select the locatioin provider -> use
                // default
               
                Criteria criteria = new Criteria();
                //criteria.setAccuracy(Criteria.ACCURACY_FINE);
                provider = locationManager.getBestProvider(criteria, false);
                //provider = locationManager.getBestProvider(criteria, enabledOnly);
                Location location = locationManager.getLastKnownLocation(provider);

                // Initialize the location fields
                if (location != null) {
                        Toast.makeText(this, provider, Toast.LENGTH_LONG).show();
                        System.out.println("Provider " + provider + " has been selected.");
                       
                        Double geoLat = location.getLatitude()*1E6;
                        Double geoLng = location.getLongitude()*1E6;
                       
                        pointC = new GeoPoint(geoLat.intValue(), geoLng.intValue());
                       
                        tvLatitudine.setText(Double.toString(getRound(location.getLatitude(), 5)));
                        tvLongitudine.setText(Double.toString(getRound(location.getLongitude(), 5)));
                        tvVelocita.setText(Double.toString(getRound(location.getSpeed()*3.6, 1))+" km/h");
                        tvQuota.setText(Integer.toString((int)location.getAltitude())+" m");
                        tvAccuratezza.setText(Integer.toString((int)location.getAccuracy())+" m");
                       
                        mapController.animateTo(pointC);
                       
                } else {
                        tvLatitudine.setText("Provider not available");
                        tvLongitudine.setText("Provider not available");
                }
               
               
                List<Overlay> mapOverlays = mapView.getOverlays();
        Drawable drawable = this.getResources().getDrawable(R.drawable.androidmarker);
        MyOver itemizedoverlay = new MyOver(drawable, this);
 
        GeoPoint point = new GeoPoint(43400276,12963759);
        OverlayItem overlayitem = new OverlayItem(point, "Hola, Mundo!", "sono a milano");
       
        GeoPoint point2 = new GeoPoint(35410000, 139460000);
        OverlayItem overlayitem2 = new OverlayItem(point2, "Sekai, konichiwa!", "I'm in Japan!");
       
        itemizedoverlay.addOverlay(overlayitem);
        itemizedoverlay.addOverlay(overlayitem2);
        mapOverlays.add(itemizedoverlay);
               
        }
       
               
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                boolean result = super.onCreateOptionsMenu(menu);
                menu.add(0, INSERT_ID, 0, R.string.menu_add);
                menu.add(0, CENTER_ID, 0, R.string.menu_location);
                menu.add(0, SATELLITE_ID, 0, R.string.menu_satellite);
                menu.add(0, MAP_ID, 0, R.string.menu_map);
                return result;
        }
       
        @Override
        public boolean onMenuItemSelected(int featureId, MenuItem item) {
                switch (item.getItemId()) {
                case INSERT_ID:
                        createMarker();
                        return true;
                case CENTER_ID:
                        centerMap();
                        return true;
                case SATELLITE_ID:
                        satelliteMap(true);
                        return true;
                case MAP_ID:
                        satelliteMap(false);
                        return true;
                }

                return super.onMenuItemSelected(featureId, item);
        }
       
        private void centerMap() {
                Toast.makeText(PubMappingActivity.this, "aaaaaaaaaaaaaaaaaaaaaaaaa", Toast.LENGTH_LONG).show();
                mapController.animateTo(pointC);
        }

        GeoPoint pointC =null;
       
        public class locationListener implements LocationListener {
        //LocationListener locationListener = new LocationListener() { 
               
                @Override
                public void onLocationChanged(Location location) {
                        // Aggiorna il marker della mappa
                        mapView.invalidate();
                       
                        // Aggiorna la location
                        int lat = (int) (location.getLatitude() * 1E6);
                        int lng = (int) (location.getLongitude() * 1E6);
                        pointC = new GeoPoint(lat, lng);
                       
                        tvLatitudine.setText(Double.toString(getRound(location.getLatitude(), 5)));
                        tvLongitudine.setText(Double.toString(getRound(location.getLongitude(), 5)));
                        tvVelocita.setText(Double.toString(getRound(location.getSpeed()*3.6, 1))+" km/h");
                        tvQuota.setText(Integer.toString((int)location.getAltitude())+" m");
                        tvAccuratezza.setText(Integer.toString((int)location.getAccuracy())+" m");
                       
                        mapController.animateTo(pointC);
                }

                @Override
                public void onProviderDisabled(String provider) {
                }

                @Override
                public void onProviderEnabled(String provider) {
                }

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

        private void satelliteMap(boolean satellite) {
                if (satellite) {
                        mapView.setSatellite(true);
                } else {
                        mapView.setSatellite(false);
                }
        }
       
        private void createMarker(){
               
        }
        /*
        private void createMarker() {
                GeoPoint point = new GeoPoint(19240000,-99120000);
                OverlayItem overlayitem = new OverlayItem(point, "Hola, Mundo!", "I'm in Mexico City!");
               
                itemizedoverlay.addOverlay(overlayitem);
                overlays.add(itemizedoverlay);
        }*/

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

grazie