Autore Topic: [GPS] calcolo velocità di spostamento  (Letto 1631 volte)

Offline eni992

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: 0
    • Mostra profilo
[GPS] calcolo velocità di spostamento
« il: 05 Settembre 2013, 16:47:19 CEST »
0
Salve, sto sviluppando una piccola app che mi consenta di calcolare la velocità di spostamento, e fin qui ci siamo, bastano delle banalissime formule di fisica, il vero problema nasce quando devo stabilire la connessione GPS... non so seriamente come fare, ho sviluppato le due classi di seguito basandomi su una guida trovata online, scaricato il codice proposto e modificato secondo me mie esigenze, sapete dirmi come mai mi da sempre il GPS spento?  :-(


il mio problema preciso è che è come se non riuscissi ad avviare la ricerca del GPS... non stabilire la connessione e la app alla canGetLocation() ritorna false e passa all'else...come risolvo? :/


p.s.
preciso che avendola testata sul cell...a GPS acceso, non mi parte proprio la notifica per dirmi che sta cercando il segnale >.<
Codice (Java): [Seleziona]
package com.example.contakm;
 
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
 
public class AndroidGPSTrackingActivity extends Activity {
   
    Button btnShowLocation;
    TextView speed,longitude,latitude;
   
    // GPSTracker class
    GPSTracker gps;
   
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        btnShowLocation = (Button) findViewById(R.id.btnShowLocation);
        speed=(TextView)findViewById(R.id.textView1);
        longitude=(TextView)findViewById(R.id.textView5);
        latitude=(TextView)findViewById(R.id.textView4);
       
        // show location button click event
        btnShowLocation.setOnClickListener(new View.OnClickListener() {
           
            @Override
            public void onClick(View arg0) {        
                // create class object
                gps = new GPSTracker(AndroidGPSTrackingActivity.this,speed,latitude,longitude);
 
                // check if GPS enabled        
                if(gps.canGetLocation()){
                   
                    double latitude = gps.getLatitude();
                    double longitude = gps.getLongitude();
                   
                   
                }else{
                    // can't get location
                    // GPS or Network is not enabled
                    // Ask user to enable GPS/network in settings
                    gps.showSettingsAlert();
                }
               
            }
        });
    }
   
}

Codice (Java): [Seleziona]
package com.example.contakm;
 
import android.app.AlertDialog;
import android.app.Service;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.provider.Settings;
import android.util.Log;
import android.widget.TextView;
 
public class GPSTracker extends Service implements LocationListener {
 
    private final Context mContext;
 
    double oldtime;
    // flag for GPS status
    boolean isGPSEnabled = false;
 
    // flag for network status
    boolean isNetworkEnabled = false;
 
    // flag for GPS status
    boolean canGetLocation = false;
 
    Location location; // location
    double latitude; // latitude
    double longitude; // longitude
    TextView speed,lo,la;
    // The minimum distance to change Updates in meters
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters
 
    // The minimum time between updates in milliseconds
    private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute
 
    // Declaring a Location Manager
    protected LocationManager locationManager;
 
    public GPSTracker(Context context, TextView speed,TextView latitude,TextView longitude) {
        this.mContext = context;
        this.speed=speed;
        la=latitude;
        lo=longitude;
        getLocation();
    }
    public GPSTracker(Context context) {
        this.mContext = context;
        getLocation();
    }
 
    public Location getLocation() {
        try {
            locationManager = (LocationManager) mContext
                    .getSystemService(LOCATION_SERVICE);
 
            // getting GPS status
            isGPSEnabled = locationManager
                    .isProviderEnabled(LocationManager.GPS_PROVIDER);
 
            // getting network status
            isNetworkEnabled = locationManager
                    .isProviderEnabled(LocationManager.NETWORK_PROVIDER);
 
            if (!isGPSEnabled && !isNetworkEnabled) {
                // no network provider is enabled
            } else {
                this.canGetLocation = true;
                if (isNetworkEnabled) {
                    locationManager.requestLocationUpdates(
                            LocationManager.NETWORK_PROVIDER,
                            MIN_TIME_BW_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    Log.d("Network", "Network");
                    if (locationManager != null) {
                        location = locationManager
                                .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                        if (location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }
                // if GPS Enabled get lat/long using GPS Services
                if (isGPSEnabled) {
                    if (location == null) {
                        locationManager.requestLocationUpdates(
                                LocationManager.GPS_PROVIDER,
                                MIN_TIME_BW_UPDATES,
                                MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                        Log.d("GPS Enabled", "GPS Enabled");
                        if (locationManager != null) {
                            location = locationManager
                                    .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                            if (location != null) {
                                latitude = location.getLatitude();
                                longitude = location.getLongitude();
                                oldtime=location.getTime();
                            }
                        }
                    }
                }
            }
 
        } catch (Exception e) {
            e.printStackTrace();
        }
 
        return location;
    }
   
    /**
     * Stop using GPS listener
     * Calling this function will stop using GPS in your app
     * */

    public void stopUsingGPS(){
        if(locationManager != null){
            locationManager.removeUpdates(GPSTracker.this);
        }        
    }
   
    /**
     * Function to get latitude
     * */

    public double getLatitude(){
        if(location != null){
            latitude = location.getLatitude();
        }
       
        // return latitude
        return latitude;
    }
   
    /**
     * Function to get longitude
     * */

    public double getLongitude(){
        if(location != null){
            longitude = location.getLongitude();
        }
       
        // return longitude
        return longitude;
    }
   
    /**
     * Function to check GPS/wifi enabled
     * @return boolean
     * */

    public boolean canGetLocation() {
        return this.canGetLocation;
    }
   
    /**
     * Function to show settings alert dialog
     * On pressing Settings button will lauch Settings Options
     * */

    public void showSettingsAlert(){
        AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);
     
        // Setting Dialog Title
        alertDialog.setTitle("GPS is settings");
 
        // Setting Dialog Message
        alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?");
 
        // On pressing Settings button
        alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog,int which) {
                Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                mContext.startActivity(intent);
            }
        });
 
        // on pressing cancel button
        alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
            dialog.cancel();
            }
        });
 
        // Showing Alert Message
        alertDialog.show();
    }
 
   
    @Override
    public void onLocationChanged(Location location) {
        double oldla=latitude,oldlo=longitude;
        double speed, distance,time,actualtime;
        la.setText(location.getLatitude()+"");
        lo.setText(location.getLongitude()+"");
       
        distance=(((oldla*oldla)-(location.getLatitude()*location.getLatitude()))+
                 ((oldlo*oldlo)-(location.getLongitude()*location.getLongitude())));
       
        time=location.getTime();
        actualtime=(time-oldtime)/1000;
        oldtime=time;
       
        speed=((distance/actualtime)/3.6);
        this.speed.setText(speed+"km/h");
    }
 
    @Override
    public void onProviderDisabled(String provider) {
    }
 
    @Override
    public void onProviderEnabled(String provider) {
    }
 
    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    }
 
    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }
 
}
« Ultima modifica: 05 Settembre 2013, 16:50:58 CEST da eni992 »

Offline minomic

  • Nuovo arrivato
  • *
  • Post: 24
  • Respect: +2
    • Mostra profilo
Re:[GPS] calcolo velocità di spostamento
« Risposta #1 il: 14 Settembre 2013, 11:56:30 CEST »
0
Ciao, confesso di non aver letto il tuo codice, però ti posto questo che è sicuramente funzionante... ;)
La tua Activity deve estendere LocationListener. Poi, ad esempio nell'evento onClick di un Button, metti
Codice (Java): [Seleziona]
                btnStart.setOnClickListener(new View.OnClickListener() {

                        @Override
                        public void onClick(View v) {

                                lm = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
                                try {
                                        isGPSEnabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
                                } catch (Exception ex) {}

                                if(!isGPSEnabled) {
                                        new AlertDialog.Builder(Pedometer.this)
                                        .setTitle("Error")
                                        .setMessage("GPS not enabled or not available")
                                        .setCancelable(false)
                                        .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                                                public void onClick(DialogInterface dialog, int which) {
                                                        dialog.dismiss();
                                                }
                                        })
                                        .show();
                                }
                                else {
                                        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, YourActivity.this);                                      
                                }
                        }
                });

Per la velocità non serve alcuna formula, visto che c'è un metodo apposito:
Codice (Java): [Seleziona]
        @Override
        public void onLocationChanged(Location location) {
                ...
                float speed = location.getSpeed();
                ...
        }
« Ultima modifica: 14 Settembre 2013, 12:03:57 CEST da minomic »

Offline eni992

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: 0
    • Mostra profilo
Re:[GPS] calcolo velocità di spostamento
« Risposta #2 il: 14 Settembre 2013, 16:42:39 CEST »
0
il tuo codice non l'ho tanto capito :/ ma ho risolto con questa  :)

[link rimosso]
« Ultima modifica: 14 Settembre 2013, 16:51:18 CEST da Ricky` »

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:[GPS] calcolo velocità di spostamento
« Risposta #3 il: 14 Settembre 2013, 16:52:40 CEST »
0
eni992, se vuoi postare il codice puoi farlo tranquillamente sul nostro sito, non c'è bisogno che ne link altri ;)

Offline minomic

  • Nuovo arrivato
  • *
  • Post: 24
  • Respect: +2
    • Mostra profilo
Re:[GPS] calcolo velocità di spostamento
« Risposta #4 il: 14 Settembre 2013, 22:31:12 CEST »
0
il tuo codice non l'ho tanto capito

Non ho capito cosa non ti è chiaro.  :-)
Comunque la prima parte controlla se il GPS è acceso e in caso non lo sia lo notifica all'utente con un AlertDialog. Se invece il GPS è acceso l'Activity si registra per ricevere aggiornamenti sulla posizione. La seconda parte riporta il metodo onLocationChanged (da implementare obbligatoriamente) e mostra come ricavare la velocità di spostamento con un metodo predefinito.

Offline Thunderjet

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Motorola Motog 2
  • Sistema operativo:
    Windows 8
Re:[GPS] calcolo velocità di spostamento
« Risposta #5 il: 07 Luglio 2015, 22:04:09 CEST »
0
Non ho capito cosa non ti è chiaro.  :-)
Comunque la prima parte controlla se il GPS è acceso e in caso non lo sia lo notifica all'utente con un AlertDialog. Se invece il GPS è acceso l'Activity si registra per ricevere aggiornamenti sulla posizione. La seconda parte riporta il metodo onLocationChanged (da implementare obbligatoriamente) e mostra come ricavare la velocità di spostamento con un metodo predefinito.

Però se sei fermo la velocità è l'ultima rilevata, perlomeno a me succede così.

Inoltre come si fa a ridurre il tempo di aggiornamento in modo da avere una velocità quasi istantanea?

Grazie