2017-01-25 3 views
0

AndroidアプリでGPS位置をモックしようとしています。Google FusedLocationApi.setMockLocationはonLocationChangedをトリガーしません

私が行います

  • 使用com.google.android.gms:遊ぶ - サービス - 場所:ALLOW_MOCK_LOCATIONSACCESS_MOCK_LOCATION、:9.4.0
  • が登録GoogleApiClient
  • は、すべての必要な権限を持っている持っているがACCESS_COARSE_LOCATIONACCESS_FINE_LOCATION
  • をするとき、実際の場所を受け取り、デバッグモードでは、実際のデバイス上でアプリケーションを実行します

    private void registerLocationListener(){ 
        if(isStarted&&googleApiClient.isConnected()) { 
         LocationRequest request = new LocationRequest() 
           .setInterval(1000) 
           .setSmallestDisplacement(0.5f) 
           .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    
         LocationServices.FusedLocationApi.requestLocationUpdates(
           googleApiClient, request, this); 
         LocationServices.FusedLocationApi.getLastLocation(googleApiClient); 
        } 
    } 
    

    、私は次のようになり、同じGoogleApiClientを共有する別のクラスがあります:このような場所の更新のための

マイレシーバ・クラス・レジスタを模擬しようとしていない

public class LocationMocker{ 
    private final GoogleApiClient googleApiClient; 

    public LocationMocker(GoogleApiClient apiClient){ 
     this.googleApiClient = apiClient; 
    } 


    private void start(){ 
     LocationServices.FusedLocationApi.setMockMode(googleApiClient, true).setResultCallback(new ResultCallbacks<Status>() { 
      @Override 
      public void onSuccess(@NonNull Status status) { 
       Log.e(TAG,"SUCCESS "+status); 

       new Thread(){ 
        public void run(){ 
         while(!this.isInterrupted()){ 
          Thread.sleep(timeout); 

         LocationServices.FusedLocationApi.setMockLocation(googleApiClient, generateMockLocation()) 
            .setResultCallback(new ResultCallbacks<Status>() { 
             @Override 
             public void onSuccess(@NonNull Status status) { 
              Log.e(TAG,"NEW MOCKED LOCATION!"); 
             } 

             @Override 
             public void onFailure(@NonNull Status status) { 
              Log.e(TAG,"FAILURE "+status); 
             } 
            }); 
         } 
        } 
       }.start(); 
      } 

      @Override 
      public void onFailure(@NonNull Status status) { 
       Log.e(TAG,"FAILURE "+status); 
      } 
     }); 
    } 
} 

何が起こるかは、すべてが正しい方法を登録する(私はすべてのコールバックを記録する)、私は定期的に私の "新しいMOCKED LOCATION!"私のLocationListeners onLocationChanged(Location location)は決して呼び出されません。

私はまた別の注文を試みました(最初にlocationListenerを登録、最初にsetMockMode ...)。

私は間違っていると思いますか? 私がすでに言ったように、私が実際のGPSを使用すればすべて正常に動作します。

答えて

0

なぜスレッドを使用してfusedlocationを更新していますか? あなたは使用する必要があります:あなたが実行を確認する場合は、LocationMocker`andあなたがスレッドが `内部にあることを認識可能性があるクラスを確認した場合 https://developer.android.com/training/location/receive-location-updates.html

+0

LocationServices.FusedLocationApi.requestLocationUpdates( mGoogleApiClient, mLocationRequest, this); 

@Override public void onLocationChanged(Location location) { mCurrentLocation = location; mLastUpdateTime = DateFormat.getTimeInstance().format(new Date()); updateUI(); } 

がこれを読みますメソッドを呼び出すと、 'LocationServices.FusedLocationApi.setMockLocation'が呼び出されます。ここで行うことは、位置情報を提供することです。その変更を聞くのではありません。 – simmerl

関連する問題