1

我写了一个应用程序,它可以使用获取 GNSS 原始测量数据

LocationManager.registerGnssMeasurementsCallback(...)

该应用程序可以处理这些数据并计算新的位置。现在,我想将这个计算出的位置模拟到 Android 操作系统中,以便其他应用程序可以使用这个位置。为了实现这一点,我可以给应用程序位置模拟权限,将其添加到开发人员选项中的位置模拟应用程序列表中并使用类似的方法

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);
4

0 回答 0