java - Android 模拟 GPS 卫星(不仅仅是位置)

标签 java android gps satellite

我正在寻找一种在 Android 模拟器中模拟卫星存在的方法。 我可以通过 telnet 作为“地理修复”提交经度/纬度对,并且在谷歌地图或类似应用程序中运行良好,或者通过扩展控件重播 .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

最佳答案

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

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

GPS 设备 => GPS 驱动程序 =(NMEA 坐标)=> Android GPS 引擎 =(纬度/经度坐标)=> 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();
            }
        }    
    }
}

关于java - Android 模拟 GPS 卫星(不仅仅是位置),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38382931/

相关文章:

java - 如何重复整个程序直到手动终止?

android - Realm 和 Runtime.getRuntime().exit(0)

android - 来自地理标记照片的 GPS 经度和纬度

android - React Native Android 位置请求超时

java - 创建带有填充变量且没有任何 setter 或构造函数的对象

java - 创建自定义计划作业监视器 ATG

android - 带wrap_content的LinearLayout的LayoutTransition

java - 问:Android GPS 位置

java - 使用从数据库事件返回的 RowId 更新数据库中的另一个表

java - .set 背景颜色与十六进制颜色代码 Android Studio