【问题标题】:Android emulate GPS satellites (not only location)Android 模拟 GPS 卫星(不仅是位置)
【发布时间】:2016-11-17 21:15:56
【问题描述】:

我正在寻找一种在 Android Emulator 中模拟卫星存在的方法。 我可以通过 telnet 将 lon/lat 对作为“geo fix”提交,并且在谷歌地图或类似应用程序中运行良好,或者通过扩展控件重播 .kml 文件。问题是其他应用程序(例如,chartcross 的 GPS 测试)仍在抱怨 GPS 信号丢失或找不到卫星。

也尝试发送 nmea 语句,但格式可能存在一些错误,因为即使在谷歌地图中也没有改变位置:

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

【问题讨论】:

    标签: java android gps satellite


    【解决方案1】:

    经过大量挖掘,最后我切换到原生 Android 的 API 以通过模拟位置设置纬度/经度

    NMEA 工作在系统调用之下的层,它通常对应用程序不可见 总而言之,这是 Android 中 GPS 数据的大致流程:

    GPS 设备 => GPS 驱动程序 =(NMEA 坐标)=> Android GPS 引擎 =(经纬度坐标)=> Android 服务层 来自应用程序的各种 API 调用

    因此,为了模拟位置,不需要深入。 99% 的应用程序依赖于 Service 层的数据,因此您可以轻松混淆 System 的 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();
                }
            }    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-12-04
      • 2011-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-13
      • 1970-01-01
      相关资源
      最近更新 更多