2016-07-14 3 views
1

Я ищу способ имитации спутникового присутствия в Android Emulator. Я могу отправить lon/lat пару через telnet как «geo fix», и это отлично работает на картах Google или подобных приложениях, или воспроизводить файлы .kml через расширенные элементы управления. Проблема заключается в том, что другие приложения (например, GPS-тест by chartcross) по-прежнему жалуются на то, что сигнал 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

После многих рытье в конце концов я перешел на родной API Android, для установки Lat/Long через Mock Locations

NMEA работает на уровне ниже системных вызовов, и это обычно невидимы для приложений чтобы подвести итог, это примерный поток данных GPS в Android:

GPS-устройство => GPS-драйвер = (координаты NMEA) => Android GPS engine = (координаты 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(); 
      } 
     }  
    } 
}