2012-08-07 27 views
6

Ich habe versucht, die Geschwindigkeit des Benutzers herauszufinden, während der Benutzer mit dem Gerät bewegt. Hier folgte ich einem Link mit Beispielcode. d.h.: Here SpeedDemo.Ermitteln Sie die Geschwindigkeit des Benutzers in Android Mit GPS

Das Problem ist, mit der location.getSpeed() Methode finden wir die Geschwindigkeit. Also habe ich die Positionswerte im Gerät geändert, aber jedes Mal gibt der Wert location.getspeed() nur '0' zurück. Warum es passiert, sogar den Standort selbst ändern.

Kann jemand davon wissen?

Antwort

7

Sie müssen Standort-Updates verfolgen, und wenn die Methode onLocationChanged(Location location) auslöst, können Sie location.getSpeed(); anrufen gibt Ihnen die richtige Geschwindigkeit, wenn Ihr Telefon tatsächlich bewegt.

Aber wenn man es auf Simulator zu testen sind, und Sendeort von Emulator-Controller, wird es immer wieder zurückkehren 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); 
    } 
} 

Der obige Code ist eigentlich ein Ort Service-Klasse, Wenn Sie eine Instanz dieser Klasse erstellen, wird ein falscher Standortdienstanbieter (anders als GPS und Netzwerk) registriert und einige falsche Standortparameter von einer bestimmten Datei eingegeben.

Unten ist die data.txt Datei, die latitude,longitude,speed die obige Klasse diese data.txt Datei und Eingabe gefälschte Lat, Lon und Geschwindigkeit in der Lage ist, durch Thread.sleep() Aufruf ebenfalls implementiert, sowie Triggerzeitpunkt ändern Ort gelesen hat .

Data.txt Datei

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

Danke für die Antwort, mit Gerät Umzug war nicht möglich, weil ich in LAN arbeiten bin. Außerhalb der Gegend funktionierte GPS nicht für mich. Also habe ich meine Gerätestandorte selbst geändert, indem ich falsche Werte angegeben habe. Still Wert "0". Gibt es eine Möglichkeit, den Ausgang durch Ändern der Positionen zu finden? Geänderte Positionswerte werden korrekt gedruckt, aber der Ausgangswert ist derselbe. –

+0

Verwenden Sie mocklocation, um falschen Wert einzugeben, wenn ja, dann sollten Sie auch location.setSpeed ​​(float meter) einstellen. –

+0

Ich habe gerade fakeGPS App vom Markt heruntergeladen, und jedes Mal, wenn mein Standort Werte und meine Anwendung für output überprüft. Kannst du mir bitte etwas über location.setSpeed ​​(Float Meter) erklären. Wo kann ich das genau benutzen .. ?? –

1

denke ich getSpeed ​​() funktioniert nur, wenn die besondere Lage Geschwindigkeitskomponente mit GPS zur Verfügung haben. Sonst wird 0.0 die ganze Zeit zurückgegeben.

Dafür können Sie das mit der Bedingung location.hasSpeed ​​() - Methode überprüfen. Wenn das wahr ist, dann denken deine Sachen anders darüber nach.

+0

Was Sie sagen, ist, dass location.hasSpeed ​​() -Methode nicht für alle Standorte verfügbar ist (mit bestimmten Lat, Lng). Und wenn location.hasSpeed ​​() nicht verfügbar ist, gibt die location.getSpeed ​​() -Methode 0.0? –

+0

Ja, wenn Ihr GPS-Gerät eine Geschwindigkeitskomponente hat, dann wird nur der richtige Wert zurückgegeben, sonst wird 0.0 die ganze Zeit zurückgegeben. Also bitte zuerst mit der hasSpeed ​​() Methode und dann weiter. @QadirHussain –

-1

Zuerst müssen wir prüfen, ob die GPS aktiviert oder nicht mit Location Manager.

isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 

Dann müssen Sie GpsStatus.Listener erhalten die GPS-Updates implementieren. Es wird die GPS-Standortaktualisierungen zurückgeben.

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

Von diesem Ort können Sie die aktuelle Geschwindigkeit erhalten.

speed = location.getSpeed(); 

auf meiner Website finden Sie hier für weitere Details: http://velmm.com/get-current-user-speed-using-gps-android/

Verwandte Themen