我写了一个应用程序,它可以使用来获取GNSS原始测量数据
LocationManager.registerGnssMeasurementsCallback(...)
应用程序可以处理此数据并计算新的位置。现在,我想将此计算的位置模拟到Android OS中,以便其他应用可以使用此位置。要实现这一点,我可以授予应用位置模拟权限,将其添加到开发人员选项中的位置模拟应用列表中并使用类似的方法
LocationManager.addTestProvider(...)
LocationManager.setTestProviderEnabled(...)
LocationManager.setTestProvderLocation(...)
首先,我需要确定要模拟的位置提供者。不允许模拟PASSIVE_PROVIDER。可以模拟NETWORK_PROVIDER,但用户必须在系统设置中选择此定位方法。如果他这样做,系统将停止向已注册这些回调的任何应用发送GNSS测量回调,因此无法再计算位置。在这种情况下,将调用状态更改为“禁用GNSS测量监听器”的回调。当我尝试模拟GPS_PROVIDER时(调用setTestProviderEnabled()时),会发生相同的事情。所以我想到了模拟融合的位置提供程序。由于我的Android Studio链接器无法解析LocationManager.FUSED_PROVIDER(不知道为什么),我直接使用了字符串“ fused”并尝试模拟位置。没有例外,gnss原始测量结果仍然可以接收。但是,在GoogleMaps上,我只能看到内部芯片提供的原始位置。无论在系统中选择“仅GPS”还是“最佳”定位方法,都是这种情况。
那么,我该如何解决呢?有什么方法可以模拟GPS_PROVIDER,而不会中断原始gnss测量或防止在模拟时将gnss芯片位置应用于融合提供者?
顺便说一句,我的代码如下:
locationManager.addTestProvider("fused" , false, false, false, false, false, false, false, Criteria.POWER_LOW, Criteria.ACCURACY_FINE);
locationManager.setTestProviderEnabled("fused", true);
Location location = new Location("fused");
location.setLatitude(lat);
location.setLongitude(lon);
location.setAltitude(alt);
location.setAccuracy(1.0f);
location.setTime(System.currentTimeMillis());
location.setElapsedRealtimeNanos(System.nanoTime());
locationManager.setTestProviderLocation("fused", location);