2012-08-07 7 views
6

ユーザーがデバイスと共に移動している間に、ユーザーの速度を調べようとしました。ここでは、サンプルコードとのリンクを1つ続けました。すなわちHere SpeedDemo。アンドロイドでユーザーの速度を調べるGPSを使用する

問題は、location.getSpeed()メソッドを使用することによって、速度がわかります。だから、デバイスのロケーション値を変更したが、location.getspeed()の値が返されるたびに '0'だけが返される。なぜそれが起こるのか、場所自体を変更することさえある。

これについて知っている人はいますか?

答えて

7

位置更新を追跡する必要があります。方法onLocationChanged(Location location)がトリガーすると、location.getSpeed();に電話をかけると、電話機が実際に移動している場合に正しい速度が得られます。

しかし、あなたはシミュレータ上でそれをテストし、エミュレータコントローラによって場所を送信する場合、それは常に返します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); 
    } 
} 

上記のコードは、実際の場所サービスクラスで、このクラスのインスタンスを作成すると、偽のロケーションサービス(GPS、ネットワーク以外の)プロバイダを登録し、特定のファイルで偽のロケーションパラメータを入力します。

以下は、上記のクラスlatitude,longitude,speedを持つdata.txtファイルです。このdata.txtファイルを読み込んで、偽の緯度、経度、および速度を入力するだけでなく、場所を変更するトリガ時間もThread.sleep()コールによって実装されています。

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

は、私がLANで働いているので、可能ではなかったデバイスでの移動、返信いただきありがとうございます。エリア外では、GPSは私のために働いていませんでした。だから、偽の値を提供することで自分のデバイスの場所自体を変更しました。静止値は「0」です。場所を変更することによって出力を見つける方法はありますか?変更された位置の値は正しく出力されますが、出力は同じです。 –

+0

mocklocationを使って偽の値を入力している場合は、location.setSpeed(float meters)も設定する必要があります。 –

+0

私は市場からfakeGPSアプリをダウンロードし、毎回自分の位置の値を変更して、自分のアプリケーションをチェックアウトしました。私はlocation.setSpeed(フロートメーター)について私に説明してください。どこでこれを使うの? –

1

私は特定の場所はGPSで利用可能な速度成分を持っている場合getSpeedは()のみ動作すると思います。それ以外の場合、常に0.0が返されます。

これは、condition.hasSpeed()メソッドを使用して確認できます。本当なら、あなたのものは別の方法で考えてください。

+0

何を言っているのかは、location.hasSpeed()メソッドがすべての場所(特定のlat、lng)で使用できるわけではないということです。 location.hasSpeed()が利用できない場合、location.getSpeed()メソッドは0.0を返しますか? –

+0

はい、あなたのデバイスのGPSがスピードコンポーネントを持っていれば、それだけが適切な値を返します。そうでなければ、常に0.0を返します。だからまずはhasSpeed()メソッドで確認してください。 @QadirHussain –

-1

まず、Gpsがロケーションマネージャを使用しているかどうかを確認する必要があります。

isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 

次に、Gpsアップデートを取得するには、GpsStatus.Listenerを実装する必要があります。 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) { 
        } 
      }; 

現在の速度を取得できます。

speed = location.getSpeed(); 

詳細はここで私のウェブサイトを参照してください:http://velmm.com/get-current-user-speed-using-gps-android/

関連する問題