Autore Topic: Inserire percorso da posizione attuale  (Letto 707 volte)

Offline Ceciud

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Optimus G e Samsung Galaxy S3
  • Sistema operativo:
    Mac OS X
Inserire percorso da posizione attuale
« il: 10 Luglio 2014, 14:18:18 CEST »
0
Ciao ragazzi.
Ho seguito [medio] Maps API V2 - Visualizzare percorso su una Mappa - Android Developers Italia]questa guida per inserire google maps nella mia applicazione e tutto funziona.

Ora volevo modificarla in modo da trovare la posizione dell'utente e, cliccando su un tasto "Naviga", condurlo fino alla posizione stabilita.

Come devo modificare il codice?

Non sono molto pratico quindi se potete spiegate nel dettaglio :D

Grazie.

Offline LinkOut

  • Utente normale
  • ***
  • Post: 270
  • Respect: +38
    • Mostra profilo
  • Dispositivo Android:
    Xiaomi Mi5
Re:Inserire percorso da posizione attuale
« Risposta #1 il: 14 Luglio 2014, 16:22:21 CEST »
0
Ciao,
Per condurre l'utente ad una posizione partendo dalla propria ci sono essenzialmente due modi per farlo.
  • Puoi abilitare la funzione di "navigazione" all'interno della tua applicazione, tracciando semplicemente una Polyline dal punto in cui si trova l'utente al punto di destinazione.
  • La seconda opzione (quella che io ti consiglio) è quella di far partire le mappe native del dispositivo con le coordinate del punto di arrivo e partenza e magari preimpostando la modalità di navigazione (car,bike,walk etc), perchè così avrai a disposizione le mappe native di google per la navigazione che sono molto potenti.

Eccoti uno snippet di codice che esegue il punto 2.
Codice (Java): [Seleziona]
//START EXTERNAL GOOGLE MAPS WITH POSITIONS
Intent intent = new Intent(Intent.ACTION_VIEW,
                Uri.parse("http://maps.google.com/maps?saddr="+actual_lat+","+actual_lon+"&daddr="+dest_lat+","+dest_lon+mapsmode));
                startActivity(intent);;

actual_lat - actual_lon = posizione attuale
dest_lat - dest_lon = destinazione
(entrambi double)
mapsmode = modalità di apertura (&mode=driving per esempio)
in realtà sarebbe più corretto avere dentro "mapsmode" solo il tipo..
Quindi : ...dest_long+"&mode="+mapsmode

Saluti.

Offline Ceciud

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Optimus G e Samsung Galaxy S3
  • Sistema operativo:
    Mac OS X
Re:Inserire percorso da posizione attuale
« Risposta #2 il: 15 Luglio 2014, 00:04:17 CEST »
0
Grazie, nel progetto di partenza funziona tutto alla perfezione.
Ho provato a copiarlo nel progetto dove ho anche altri Fragment e il risultato è il seguente:

Codice (Java): [Seleziona]
import java.util.ArrayList;
import java.util.List;

import org.json.JSONArray;

import android.app.Fragment;
import android.app.ProgressDialog;
import android.content.Intent;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ImageView;
import android.widget.TextView;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMap.OnInfoWindowClickListener;
import com.google.android.gms.maps.GoogleMap.OnMyLocationButtonClickListener;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.model.PolylineOptions;

public class FragmentEight extends Fragment {
       
        final LatLng STARTING_POINT = new LatLng(45.4640704, 9.1719064); // Milano


        GoogleMap map;

        ProgressDialog pDialog;
        List<LatLng> polyz;
        JSONArray array;

        CameraPosition cameraPosition = new CameraPosition.Builder()
                        .target(STARTING_POINT).zoom(11).bearing(10).tilt(30).build();

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_map);
                setUpMapIfNeeded();

                                 
                                 
                map.getUiSettings().setMyLocationButtonEnabled(true);
                map.setMyLocationEnabled(true);

                map.addMarker(new MarkerOptions()
                                .position(STARTING_POINT)
                                .title("Raggiungi la destinazione")
                                .icon(BitmapDescriptorFactory
                                                .defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));


                map.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {

                        // Al click sull'infowindow viene disegnato il percorso
                        @Override
                        public void onInfoWindowClick(Marker marker) {

                                Intent intent = new Intent(android.content.Intent.ACTION_VIEW,
                                                 Uri.parse("google.navigation:q=45.6323665,13.0037416"));
                                                 startActivity(intent);

                        }
                });
                                 
                                 
                map.setOnMyLocationButtonClickListener(new OnMyLocationButtonClickListener() {

                        @Override
                        public boolean onMyLocationButtonClick() {

                                map.getMyLocation();

                                return true;
                        }
                });

        }

        @Override
        protected void onResume() {
                super.onResume();
                setUpMapIfNeeded();
        }

        private void setUpMapIfNeeded() {
                if (map == null) {
                        map = ((SupportMapFragment) getSupportFragmentManager()
                                        .findFragmentById(R.id.map)).getMap();
                        if (map != null) {
                                setUpMap();
                        }
                }
        }

        private void setUpMap() {
                map.getUiSettings().setZoomControlsEnabled(false);

                // map.moveCamera(CameraUpdateFactory.newLatLngZoom(STARTING_POINT, 5));
                map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));

        }



       

                protected void onPostExecute(String file_url) {

                        for (int i = 0; i < polyz.size() - 1; i++) {
                                LatLng src = polyz.get(i);
                                LatLng dest = polyz.get(i + 1);
                                map.addPolyline(new PolylineOptions()
                                                .add(new LatLng(src.latitude, src.longitude),
                                                                new LatLng(dest.latitude, dest.longitude))
                                                .width(4).color(Color.BLUE).geodesic(true));

                        }
                        pDialog.dismiss();

                }
       

        /* Method to decode polyline points */
        private List<LatLng> decodePoly(String encoded) {

                List<LatLng> poly = new ArrayList<LatLng>();
                int index = 0, len = encoded.length();
                int lat = 0, lng = 0;

                while (index < len) {
                        int b, shift = 0, result = 0;
                        do {
                                b = encoded.charAt(index++) - 63;
                                result |= (b & 0x1f) << shift;
                                shift += 5;
                        } while (b >= 0x20);
                        int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
                        lat += dlat;

                        shift = 0;
                        result = 0;
                        do {
                                b = encoded.charAt(index++) - 63;
                                result |= (b & 0x1f) << shift;
                                shift += 5;
                        } while (b >= 0x20);
                        int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
                        lng += dlng;

                        LatLng p = new LatLng((((double) lat / 1E5)),
                                        (((double) lng / 1E5)));
                        poly.add(p);
                }

                return poly;
               
        }
       

Ho alcuni errori (vedi allegati). L'unica cosa che ho modificato è all'inizio.
Da:
Codice (Java): [Seleziona]
extends FragmentActivity {
A:
Codice (Java): [Seleziona]
extends Fragment {
Altrimenti mi rimandava ad un errore nella gestione dei fragment che non saprei risolvere.

Come posso fare?

Grazie.

Offline LinkOut

  • Utente normale
  • ***
  • Post: 270
  • Respect: +38
    • Mostra profilo
  • Dispositivo Android:
    Xiaomi Mi5
Re:Inserire percorso da posizione attuale
« Risposta #3 il: 15 Luglio 2014, 08:28:42 CEST »
0
Il consiglio che ti posso dare è quello di usare le mappe in Activity, così è tutto più semplice, non in Fragment.
Se continui ad avere problemi scrivi, vedrò di farti un tutorial a riguardo...

Saluti.

Offline Ceciud

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Optimus G e Samsung Galaxy S3
  • Sistema operativo:
    Mac OS X
Re:Inserire percorso da posizione attuale
« Risposta #4 il: 16 Luglio 2014, 13:11:37 CEST »
0
Purtroppo devo usare in Fragment, altrimenti l'app non mi funziona.

Saresti così gentile da farmi una mini guida? Mi basta che funzioni il codice postato sopra.

Grazie mille