2012-08-07 14 views
6

He intentado averiguar la velocidad del usuario, mientras que el usuario se está moviendo con el dispositivo. Aquí, seguí un enlace con código de muestra. es decir: Here SpeedDemo.Averigüe la velocidad del usuario en Android usando el GPS

El problema es que al utilizar el método location.getSpeed(), estamos encontrando la velocidad. Entonces, para eso cambié los valores de ubicación en el dispositivo, pero cada vez que el valor de location.getspeed() devuelve '0' solamente. Por qué sucede, incluso cambiando la ubicación en sí.

¿Se puede saber al respecto?

Respuesta

7

Tiene que realizar un seguimiento de la ubicación de las actualizaciones, y cuando se activa el método onLocationChanged(Location location), puede llamar al location.getSpeed(); y le dará la velocidad correcta, si su teléfono se está moviendo realmente.

Pero si está probando en simulador, y el envío de ubicación por el controlador emulador, siempre devolverá 0.

Updated with Example

public class LocationService implements LocationListener { 

    LocationService locationService; 
    LocationManager locationManager; 
    Location lastLocation; 
    private final String TAG = "LocationService" ; 

    private final String MOCK_LOCAION_PROVIDER = "FAKE_PROVIDER"; 

    LocationService(Context ctx) { 
     LocationManager locationManager = (LocationManager) ctx.getSystemService(Context.LOCATION_SERVICE); 
     String mocLocationProvider = MOCK_LOCAION_PROVIDER; 


     if (locationManager.getProvider(mocLocationProvider) != null) { 
      locationManager.removeTestProvider(mocLocationProvider); 
     } 
     locationManager.addTestProvider(mocLocationProvider, false, false, false, false, true, true, true, 0, 5); 

     locationManager.setTestProviderEnabled(mocLocationProvider, true); 
     locationManager.requestLocationUpdates(mocLocationProvider, 0, 0, 
     this); 


     try { 

      List<String> data = new ArrayList<String>(); 
      InputStream is = ctx.getAssets().open("data.txt"); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
      String line = null; 
      while ((line = reader.readLine()) != null) { 

       data.add(line); 
      } 
      // Log.e(TAG, data.size() + " lines"); 

      new MockLocationProvider(locationManager, mocLocationProvider, data).start(); 

     } catch (IOException e) { 

      e.printStackTrace(); 
     } 

    } 

    class MockLocationProvider extends Thread { 

     private List<String> data; 
     private LocationManager locationManager; 
     private String mocLocationProvider; 
     private String LOG_TAG = "MockLocationProvider"; 

     public MockLocationProvider(LocationManager locationManager, String mocLocationProvider, List<String> data) throws IOException { 

      this.locationManager = locationManager; 
      this.mocLocationProvider = mocLocationProvider; 
      this.data = data; 
     } 

     @Override 
     public void run() { 

      for (String str : data) { 

       try { 

        Thread.sleep(5000); 

       } catch (InterruptedException e) { 

        e.printStackTrace(); 
       } 

       // Set one position 
       String[] parts = str.split(","); 
       Double latitude = Double.valueOf(parts[0]); 
       Double longitude = Double.valueOf(parts[1]); 
       float speed = Float.valueOf(parts[2]); 
       Location location = new Location(mocLocationProvider); 
       location.setLatitude(latitude); 
       location.setLongitude(longitude); 
       location.setSpeed(speed); 
       // location.setAltitude(altitude); 

       // Log.d(LOG_TAG, location.toString()); 

       // set the time in the location. If the time on this location 
       // matches the time on the one in the previous set call, it will 
       // be 
       // ignored 
       location.setTime(System.currentTimeMillis()); 

       locationManager.setTestProviderLocation(mocLocationProvider, location); 
      } 
     } 
    } 

    public void onLocationChanged(Location location) { 
     // TODO Auto-generated method stub 
     Log.e(TAG, "onLocationChanged"); 

     // Get Location Speed Here 
     Log.d(TAG, "Speed " +location.getSpeed()); 



    } 

    public void onProviderDisabled(String provider) { 
     // TODO Auto-generated method stub 
     // Log.e(TAG, "onProviderDisabled : "+provider); 
    } 

    public void onProviderEnabled(String provider) { 
     // TODO Auto-generated method stub 
     // Log.e(TAG, "onProviderEnabled : "+provider); 
    } 

    public void onStatusChanged(String provider, int status, Bundle arg2) { 
     // TODO Auto-generated method stub 
     // Log.e(TAG, "onStatusChanged : "+status); 
    } 
} 

el código anterior es en realidad una clase de servicio de localización, cuando crea una instancia de esta clase, registra un proveedor falso de Servicio de ubicación (que no sea GPS ni red) e ingresa algunos parámetros de ubicación falsos en un archivo determinado.

A continuación se muestra el archivo data.txt que tiene latitude,longitude,speed la clase anterior lee este archivo data.txt e ingresa latitud, lon y velocidad falsas en la ubicación, así como el tiempo de activación para cambiar la ubicación también implementado por Thread.sleep() llamada .

archivo Data.txt

24.856449265609735,67.04308920288086,1.64 
24.856749265609735,67.04408920288086,7.64 
24.856949265609735,67.04508920288086,11.64 
24.857649265609735,67.04716920288086,13.64 
24.857949265609735,67.04736920288086,12.64 
24.857949265609735,67.04742520288086,8.64 
24.857949265609735,67.04747020288086,4.64 
24.856749265609735,67.04408920288086,6.11 
24.856949265609735,67.04508920288086,2.12 
24.857249265609735,67.04608920288086,1.1 
24.856949265609735,67.04508920288086,2.13 
24.857249265609735,67.04608920288086,0.6 
24.856949265609735,67.04508920288086,1.19 
24.857249265609735,67.04608920288086,1.6 
24.856949265609735,67.04508920288086,2.12 
24.857249265609735,67.04608920288086,1.15 
24.857849265609735,67.04729920288086,17.64 
24.857949265609735,67.04736920288086,12.64 
24.857949265609735,67.04739920288086,16.64 
24.857949265609735,67.04742520288086,8.64 
24.857949265609735,67.04747020288086,4.64 
24.856749265609735,67.04408920288086,6.11 
24.856949265609735,67.04508920288086,2.12 
24.857249265609735,67.04608920288086,1.1 
24.856949265609735,67.04508920288086,2.13 
24.857249265609735,67.04608920288086,0.6 
24.856949265609735,67.04508920288086,1.19 
24.857249265609735,67.04608920288086,1.6 
24.856949265609735,67.04508920288086,2.12 
24.857249265609735,67.04608920288086,1.15 
24.857849265609735,67.04729920288086,17.64 
24.857949265609735,67.04736920288086,12.64 
24.857949265609735,67.04739920288086,16.64 
24.857949265609735,67.04742520288086,8.64 
24.857949265609735,67.04747020288086,4.64 
24.856749265609735,67.04408920288086,6.11 
24.856949265609735,67.04508920288086,2.12 
24.857249265609735,67.04608920288086,1.1 
24.857849265609735,67.04729920288086,17.64 
24.857949265609735,67.04736920288086,12.64 
24.857949265609735,67.04739920288086,16.64 
24.857949265609735,67.04742520288086,8.64 
24.857949265609735,67.04747020288086,4.64 
24.856749265609735,67.04408920288086,6.11 
24.856949265609735,67.04508920288086,2.12 
24.857249265609735,67.04608920288086,1.15 
24.856949265609735,67.04508920288086,2.13 
24.857249265609735,67.04608920288086,0.6 
24.856949265609735,67.04508920288086,1.19 
24.857249265609735,67.04608920288086,1.6 
24.856949265609735,67.04508920288086,2.12 
24.857249265609735,67.04608920288086,1.15 
24.856949265609735,67.04508920288086,2.13 
24.857249265609735,67.04608920288086,0.6 
24.856949265609735,67.04508920288086,1.19 
24.857249265609735,67.04608920288086,1.6 
24.856949265609735,67.04508920288086,2.12 
24.857249265609735,67.04608920288086,1.15 
+0

Gracias por la respuesta, en movimiento con el dispositivo no era posible, porque estoy trabajando en LAN. Fuera del área, el GPS no funcionaba para mí. Por lo tanto, cambié las ubicaciones de mis dispositivos por sí mismo al proporcionar valores falsos. Aún valor '0'. ¿Hay alguna forma de encontrar el valor de salida cambiando las ubicaciones? Los valores de ubicación modificados se imprimen correctamente, pero la salida fue la misma. –

+0

¿Está utilizando la localización simulada para ingresar el valor falso, si es así, entonces también debe establecer la ubicación.setSpeed ​​(flotador metros). –

+0

Acabo de descargar la aplicación fakeGPS del mercado, y estoy cambiando cada vez que mi ubicación valora y comprobando si mi aplicación está lista. ¿Puedes explicarme acerca de location.setSpeed ​​(flotadores)? ¿Dónde puedo usar esto exactamente ...? –

1

Creo getSpeed ​​() sólo funcionará si el lugar en particular tiene componente de velocidad disponible con GPS. De lo contrario, devolverá 0.0 todo el tiempo.

Para eso, puede verificar que con el método de condición location.hasSpeed ​​(). Si es cierto, haz lo que piensas de otra manera.

+0

lo que está diciendo es que el método location.hasSpeed ​​() no está disponible para todas las ubicaciones (con cierto lat, lng). Y si location.hasSpeed ​​() no está disponible, entonces el método location.getSpeed ​​() devolverá 0.0? –

+0

Sí, si el dispositivo GPS tiene componente de velocidad, solo devolverá el valor adecuado, de lo contrario, devolverá 0.0 todo el tiempo. Por lo tanto, primero verifique con el método hasSpeed ​​() y luego continúe. @QadirHussain –

-1

Primero debemos verificar si el Gps está activado o no usando el administrador de ubicación.

isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 

Luego, debe implementar GpsStatus.Listener para obtener las actualizaciones de Gps. Devolverá las actualizaciones de ubicación de Gps.

GPSManager.locationListener = new LocationListener() { 
        @Override 
        public void onLocationChanged(final Location location) { 
          if (GPSManager.gpsCallback != null) { 
            GPSManager.gpsCallback.onGPSUpdate(location); 
          } 
        } 

        @Override 
        public void onProviderDisabled(final String provider) { 
        } 

        @Override 
        public void onProviderEnabled(final String provider) { 
        } 

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

Desde esa ubicación, puede obtener la velocidad actual.

speed = location.getSpeed(); 

referencia a mi página web aquí para más detalles: http://velmm.com/get-current-user-speed-using-gps-android/

Cuestiones relacionadas