2016-07-14 2 views
1

Androidエミュレータで衛星の存在をシミュレートする方法を探しています。 私はtelnetでlon/latのペアを "geo fix"として提出することができます。それはgoogleマップや類似のアプリでうまく動作します。拡張されたコントロールを使って.kmlファイルを再生します。問題は、他のアプリケーション(例えば、チャートクロスによるGPSテスト)が、GPS信号が失われているか、または衛星が見つからないと不平を言っているということです。AndroidはGPS衛星をエミュレートします(場所だけでなく)

はまた、NMEA文を送信しようとしたが、それもGoogleマップで場所を変更しなかった原因はおそらく形式でいくつかのミスがあります:

geo nmea $GPGGA,090000.00,4452.85370156,N,06330.55438023,W,1,05,2.87,160.00,M,-21.3213,M,,*61 

答えて

1

最後に掘り多くの後、私はネイティブのAndroidのAPIに切り替え緯度を設定する/ロングモック場所を経由NMEAは、システムコールの下の層の上で動作し、それが要約するアプリケーション に、一般的には見えないのです

、これは、AndroidでのGPSデータのおおよその流れです:

GPSデバイス=> GPSドライバ=(NMEA座標)=> Android GPSエンジン=(Lat/Long座標)=> Androidサービスレイヤー< =>アプリケーションからのさまざまなAPI呼び出し

したがって、それを深くする必要があった。 99%のアプリがサービス層のデータに依存しているため、簡単にシステムのGPS_PROVIDERを難読化できます。

import android.content.Context; 
import android.location.*; 
import android.os.SystemClock; 
import android.util.Log; 


/** 
* Created by the.Legend on 17/07/2016. 
*/ 
public class FakeGPS { 

    private LocationManager locationManager; 
    public static final String GPS_MOCK_PROVIDER = "gps"; 

    public FakeGPS(){  
     locationManager = (LocationManager) Environment.mainContext.getSystemService(Context.LOCATION_SERVICE); 

     if(!locationManager.isProviderEnabled(GPS_MOCK_PROVIDER)) { 

      locationManager.addTestProvider(GPS_MOCK_PROVIDER, false, false, 
        false, false, true, false, false, 0, 5); 
      locationManager.setTestProviderEnabled(GPS_MOCK_PROVIDER, true); 

      locationManager.setTestProviderStatus(GPS_MOCK_PROVIDER, LocationProvider.AVAILABLE, null, System.currentTimeMillis()); 
     }  
    }  

    public void applyCoordinates( Double longitude, Double latitude){ 

     if(locationManager.isProviderEnabled(GPS_MOCK_PROVIDER)) { 
      Double altitude= 0.0; 
      Float accuracy=3.0f; 
      long timestamp=System.currentTimeMillis();  

      try {  
       Location location = new Location(LocationManager.GPS_PROVIDER); 
       location.setLatitude(latitude); 
       location.setLongitude(longitude); 
       location.setAltitude(altitude); 
       location.setAccuracy(accuracy); 
       location.setTime(timestamp); 
       location.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());     locationManager.setTestProviderLocation(GPS_MOCK_PROVIDER, location);  
      } 
      catch (Exception e) { 
       e.printStackTrace(); 
      } 
     }  
    } 
} 
関連する問題