Autore Topic: Google maps e sorgente da impostare con valore attuale  (Letto 1582 volte)

Offline fedeair10

  • Nuovo arrivato
  • *
  • Post: 20
  • Respect: 0
    • Mostra profilo
Google maps e sorgente da impostare con valore attuale
« il: 18 Settembre 2010, 10:48:57 CEST »
0
Ciao a tutti,
prendendo spunto da vari tutorial sono riuscito a disegnare un percorso sulla mappa. Però sia l'origine che la destinazione le ho fissate a mano..mi servirebbe settare l'origine con la posizione corrente ovviamente!

Vi allego il codice:

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

        MapView mapView;
        MapController mapController;
        private Bitmap bubbleIcon;
       
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.route);
               
                MapView mapView = (MapView) findViewById(R.id.myMapView1);
               
                mapView.setClickable(true);
               
                mapView.setBuiltInZoomControls(true);
               
                mapController = mapView.getController();
               
                mapController.setZoom(12);
               
                double src_lat = 46.092838;
                double src_long = 13.242527;
                double dest_lat = 46.087473;
                double dest_long = 13.261036;
                GeoPoint srcGeoPoint = new GeoPoint((int) (src_lat * 1E6),(int) (src_long * 1E6));
                GeoPoint destGeoPoint = new GeoPoint((int) (dest_lat * 1E6),(int) (dest_long * 1E6));
               
                DrawPath(srcGeoPoint, destGeoPoint, Color.GREEN, mapView);
               
                mapView.getController().animateTo(srcGeoPoint);
                mapView.getController().setZoom(15);
       
        }
       
        @Override
        protected boolean isRouteDisplayed() {
                // TODO Auto-generated method stub
                return false;
        }
       
        private void DrawPath(GeoPoint src,GeoPoint dest, int color, MapView mMapView01) {
                StringBuilder urlString = new StringBuilder();
                urlString.append("[url=http://maps.google.com/maps?f=d&hl=en"]Google Maps[/url]);
                urlString.append("&saddr=");
                urlString.append( Double.toString((double)src.getLatitudeE6()/1.0E6 ));
                urlString.append(",");
                urlString.append( Double.toString((double)src.getLongitudeE6()/1.0E6 ));
                urlString.append("&daddr=");
                urlString.append( Double.toString((double)dest.getLatitudeE6()/1.0E6 ));
                urlString.append(",");
                urlString.append( Double.toString((double)dest.getLongitudeE6()/1.0E6 ));
                urlString.append("&ie=UTF8&0&om=0&output=kml");

                Document doc = null;
                HttpURLConnection urlConnection= null;
                URL url = null;
                try {
                        url = new URL(urlString.toString());
                        urlConnection=(HttpURLConnection)url.openConnection();
                        urlConnection.setRequestMethod("GET");
                        urlConnection.setDoOutput(true);
                        urlConnection.setDoInput(true);
                        urlConnection.connect();
                       
                        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
                        DocumentBuilder db = dbf.newDocumentBuilder();
                        doc = db.parse(urlConnection.getInputStream());
                       
                        if(doc.getElementsByTagName("GeometryCollection").getLength()>0) {
                                String path = doc.getElementsByTagName("GeometryCollection").item(0).getFirstChild().getFirstChild().getFirstChild().getNodeValue();
                                String [] pairs = path.split(" ");
                                String[] lngLat = pairs[0].split(",");
                                GeoPoint startGP = new GeoPoint((int)(Double.parseDouble(lngLat[1])*1E6),(int)(Double.parseDouble(lngLat[0])*1E6));

                                bubbleIcon = BitmapFactory.decodeResource(getResources(),R.drawable.bubble1);
                                mMapView01.getOverlays().add(new MyOverLay(startGP,startGP,1,bubbleIcon));
                                GeoPoint gp1;
                                GeoPoint gp2 = startGP;
                                for(int i=1;i<pairs.length;i++) {
                                        lngLat = pairs[i].split(",");
                                        gp1 = gp2;
                                        gp2 = new GeoPoint((int)(Double.parseDouble(lngLat[1])*1E6),(int)(Double.parseDouble(lngLat[0])*1E6));
                                        mMapView01.getOverlays().add(new MyOverLay(gp1,gp2,2,color));
                                }
                                mMapView01.getOverlays().add(new MyOverLay(dest,dest, 3,bubbleIcon));
                        }
                }
                catch (MalformedURLException e)
                {
                        e.printStackTrace();
                }
                catch (IOException e)
                {
                        e.printStackTrace();
                }
                catch (ParserConfigurationException e)
                {
                        e.printStackTrace();
                }
                catch (SAXException e)
                {
                        e.printStackTrace();
                }
        }
}

Come faccio a settare le due variabili src_lat e src_long?
e il refresh della posizione attuale?

Ultima domanda: con l'emulatore è possibile emulare il comportamento? Devo usare il DDMS?

Grazie mille per l'aiuto  :-)

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Google maps e sorgente da impostare con valore attuale
« Risposta #1 il: 20 Settembre 2010, 22:33:23 CEST »
0
Puoi accedere alla posizione dell'utente attraverso le Location API:
Codice (Java): [Seleziona]
                LocationManager locManager = (LocationManager) getSystemService(LOCATION_SERVICE);
                Criteria c = new Criteria();
                c.setAccuracy(Criteria.ACCURACY_FINE);
                Location userLocation = locManager.getLastKnownLocation(locManager.getBestProvider(c,
                                false));

                //Se è null l'utente non ha il gps attivo percui gli presentiamo la schermata dove può attivarlo
                if (userLocation == null) {
                        Intent intent = new Intent(Settings.ACTION_SECURITY_SETTINGS);
                        startActivity(intent);
                }else{
               
                //Prendi dall'oggetto userLocation la latitudine e la longitudine
               
                }

Ovviamente sarà necessario richiedere nel Manifest i sueguenti permessi:
Codice (XML): [Seleziona]
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />


Offline fedeair10

  • Nuovo arrivato
  • *
  • Post: 20
  • Respect: 0
    • Mostra profilo
Re:Google maps e sorgente da impostare con valore attuale
« Risposta #2 il: 20 Settembre 2010, 23:18:06 CEST »
0
Ok, quindi semplicemente vado ad inizializzare le due variabili e poi dentro il ramo else ci scrivo:
Codice (Java): [Seleziona]
src_lat = userLocation.getLatitude();
src_long = userLocation.getLongitude();

Per testare con l'emulatore se il tutto funziona cosa posso usare?

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Google maps e sorgente da impostare con valore attuale
« Risposta #3 il: 20 Settembre 2010, 23:20:07 CEST »
0
Devi impostare le coordinate fittizie tramite DDMS o connettendoti tramite telnet all'emulatore.

Offline fedeair10

  • Nuovo arrivato
  • *
  • Post: 20
  • Respect: 0
    • Mostra profilo
Re:Google maps e sorgente da impostare con valore attuale
« Risposta #4 il: 24 Settembre 2010, 22:40:13 CEST »
0
Questo è il nuovo codice:

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

        MapView mapView;
        MapController mapController;
        private Bitmap bubbleIcon;

        double src_lat = 0;
        double src_long = 0;
       
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.route);
               
                MapView mapView = (MapView) findViewById(R.id.myMapView1);
                mapView.setClickable(true);
                mapView.setBuiltInZoomControls(true);
                mapController = mapView.getController();
                mapController.setZoom(12);
               
                LocationManager locManager = (LocationManager) getSystemService(LOCATION_SERVICE);
        Criteria c = new Criteria();
        c.setAccuracy(Criteria.ACCURACY_FINE);
        Location userLocation = locManager.getLastKnownLocation(locManager.getBestProvider(c,
                        false));
        //Se è null l'utente non ha il gps attivo percui gli presentiamo la schermata dove può attivarlo
        if (userLocation == null) {
                Intent intent = new Intent(Settings.ACTION_SECURITY_SETTINGS);
                startActivity(intent);
        }else{
       
        //Prendi dall'oggetto userLocation la latitudine e la longitudine
                src_lat = userLocation.getLatitude();
                src_long = userLocation.getLongitude();
        }

                double dest_lat = 32.083473;
                double dest_long = 11.261022;
                GeoPoint srcGeoPoint = new GeoPoint((int) (src_lat * 1E6),(int) (src_long * 1E6));
                GeoPoint destGeoPoint = new GeoPoint((int) (dest_lat * 1E6),(int) (dest_long * 1E6));
               
                DrawPath(srcGeoPoint, destGeoPoint, Color.GREEN, mapView);
               
                mapView.getController().animateTo(srcGeoPoint);
                mapView.getController().setZoom(15);
       
        }
       
        @Override
        protected boolean isRouteDisplayed() {
                // TODO Auto-generated method stub
                return false;
        }
       
        private void DrawPath(GeoPoint src,GeoPoint dest, int color, MapView mMapView01) {
                // connect to map web service
                StringBuilder urlString = new StringBuilder();
                urlString.append("[url=http://maps.google.com/maps?f=d&hl=en"]Google Maps[/url]);
                urlString.append("&saddr=");
                urlString.append( Double.toString((double)src.getLatitudeE6()/1.0E6 ));
                urlString.append(",");
                urlString.append( Double.toString((double)src.getLongitudeE6()/1.0E6 ));
                urlString.append("&daddr=");
                urlString.append( Double.toString((double)dest.getLatitudeE6()/1.0E6 ));
                urlString.append(",");
                urlString.append( Double.toString((double)dest.getLongitudeE6()/1.0E6 ));
                urlString.append("&ie=UTF8&0&om=0&output=kml");
                Document doc = null;
                HttpURLConnection urlConnection= null;
                URL url = null;
                try {
                        url = new URL(urlString.toString());
                        urlConnection=(HttpURLConnection)url.openConnection();
                        urlConnection.setRequestMethod("GET");
                        urlConnection.setDoOutput(true);
                        urlConnection.setDoInput(true);
                        urlConnection.connect();
                       
                        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
                        DocumentBuilder db = dbf.newDocumentBuilder();
                        doc = db.parse(urlConnection.getInputStream());
                       
                        if(doc.getElementsByTagName("GeometryCollection").getLength()>0) {
                                String path = doc.getElementsByTagName("GeometryCollection").item(0).getFirstChild().getFirstChild().getFirstChild().getNodeValue();
                                String [] pairs = path.split(" ");
                                String[] lngLat = pairs[0].split(","); // lngLat[0]=longitude lngLat[1]=latitude lngLat[2]=height
                                // src
                                GeoPoint startGP = new GeoPoint((int)(Double.parseDouble(lngLat[1])*1E6),(int)(Double.parseDouble(lngLat[0])*1E6));

                                bubbleIcon = BitmapFactory.decodeResource(getResources(),R.drawable.bubble1);
                                mMapView01.getOverlays().add(new MyOverLay(startGP,startGP,1,bubbleIcon));
                                GeoPoint gp1;
                                GeoPoint gp2 = startGP;
                                for(int i=1;i<pairs.length;i++) {
                                        lngLat = pairs[i].split(",");
                                        gp1 = gp2;
                                        gp2 = new GeoPoint((int)(Double.parseDouble(lngLat[1])*1E6),(int)(Double.parseDouble(lngLat[0])*1E6));
                                        mMapView01.getOverlays().add(new MyOverLay(gp1,gp2,2,color));
                                }
                                mMapView01.getOverlays().add(new MyOverLay(dest,dest, 3,bubbleIcon));
                        }
                }
                catch (MalformedURLException e)
                {
                        e.printStackTrace();
                }
                catch (IOException e)
                {
                        e.printStackTrace();
                }
                catch (ParserConfigurationException e)
                {
                        e.printStackTrace();
                }
                catch (SAXException e)
                {
                        e.printStackTrace();
                }
        }
}

non mi fa il rendering corretto, nel senso che la mappa viene caricata, ma non ho nè il percorso, nè tantomeno il punto di partenza, vedo la schermata blu e niente strade...dove sbaglio  :( ?

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Google maps e sorgente da impostare con valore attuale
« Risposta #5 il: 27 Settembre 2010, 15:28:59 CEST »
0
Ti sei accertato che il gps abbia fatto effettivamente il fix della posizione? Oppure, se stai facendo le prove sull'emulatore assicurati di aver correttamente assegnato i valori "fittizi".

Offline fedeair10

  • Nuovo arrivato
  • *
  • Post: 20
  • Respect: 0
    • Mostra profilo
Re:Google maps e sorgente da impostare con valore attuale
« Risposta #6 il: 28 Settembre 2010, 00:23:44 CEST »
0
Purtroppo non posso provarlo con un dispositivo..sto sviluppando solo con l'emulatore!
Mi sembra di capire, da come mi hai risposto, che non c'è nulla di sbagliato nel codice, giusto?
...forse sbaglio io ad utilizzare l'emulatore allora  o_O..

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Google maps e sorgente da impostare con valore attuale
« Risposta #7 il: 28 Settembre 2010, 00:47:31 CEST »
0
Prova a settare le coordinate gps dell'emulatore attraverso la console dell'emulatore:

Android Emulator | Android Developers

vedi poi

Android Emulator | Android Developers

sostanzialmente ti connetti all'emulatore con telnet (la porta è quella dell'emulatore, di solito 5554 o 5556) e tramite l'apposito comando "geo fix longitudine latitudine" imposti i valori.

Offline fedeair10

  • Nuovo arrivato
  • *
  • Post: 20
  • Respect: 0
    • Mostra profilo
Re:Google maps e sorgente da impostare con valore attuale
« Risposta #8 il: 28 Settembre 2010, 19:47:09 CEST »
0
Avevo già provato ad utilizzare telnet ma non funziona...sempre stesso problema!
Se non ho capito male, il metodo getLastKnownLocation è un metodo non bloccante..quindi probabilmente con l'emulatore non riesco a prendere la posizione..giusto? Teoricamente mettendolo sul dispositivo non dovrei avere problemi..

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Google maps e sorgente da impostare con valore attuale
« Risposta #9 il: 28 Settembre 2010, 20:08:48 CEST »
0
Prova sull'emulatore ad avviare google maps :)