当编译的目标API级别为29时,在Android API级别<24上访问NMEA?

9
我刚试着将我们的应用程序的目标和编译 API 级别更新为 29(Android 10),发现我不能再进行编译,因为 LocationManager.addNmeaListener 只接受 OnNmeaMessageListener(在 API 级别 24 中引入)而不是旧的且已弃用的 GpsStatus.NmeaListener(所以我得到了 "incompatible types: NmeaListener cannot be converted to OnNmeaMessageListener")。
我知道 addNmeaListener(NmeaListener) 已经在之前的版本中被弃用,并且我准备重构我的代码以支持不同的 API 级别。但是,由于我找不到任何具有不同名称的弃用方法或任何与 LocationManager 兼容的库,似乎在针对 Android 10 的情况下无法访问 Android 6 设备上的 NMEA 数据(这将在某个时候成为必须)。
您有什么建议,可以让我在旧设备上仍然获取 NMEA 数据吗?
如果有人有办法避免使用 NMEA 数据,以下是一些额外的背景信息:
我们的应用程序 "phyphox" 旨在允许学生使用其手机的传感器进行物理实验。对于我们来说能够运行在旧设备(Android 4+)上非常重要,因为在物理教育中使用智能手机传感器对于经费有限的学校和学生尤其有价值。同时,我们希望所有设备(新/旧,Android/iOS)的实验结果具有可比性。因此,我们需要 NMEA 数据以计算相对于大地水准面的高度,而不是相对于 WGS84 椭球体的高度(由 Location.getAltitude() 提供),以便学生获得一致且可比较的结果。因此,任何关于实现这一目标的替代方法的建议也是受欢迎的。
您可以在此处查看 API 28 的当前代码:https://github.com/Staacks/phyphox-android/blob/master/app/src/main/java/de/rwth_aachen/phyphox/gpsInput.java

小更新,但并非原问题的解决方案: 我们现在使用本地数据库和简化版的https://geographiclib.sourceforge.io/来计算椭球体<->大地水准面,这应该更可靠,并且将允许我们在iOS端执行相同的操作以提供高度。不过,如果有办法访问NMEA消息,我们仍然很感兴趣。 - Sebastian Staacks
2个回答

9

似乎在Android SDK 29版本中存在问题,提供向后兼容的方法被遗漏了。

在Android bugtracker上有一个问题已经被开启

从那个问题的评论中,Android工程师推荐的方法是通过反射访问...我仍需要测试一下,但我猜应该是以下方式:

nmeaListenerDeprecated = new GpsStatus.NmeaListener() {
    @Override
    public void onNmeaReceived(long timestamp, String message) {
        // TODO
    }
};
try {
    //noinspection JavaReflectionMemberAccess
    Method addNmeaListener =
        LocationManager.class.getMethod("addNmeaListener", GpsStatus.NmeaListener.class);
    addNmeaListener.invoke(locationManager, nmeaListenerDeprecated);
} catch (Exception exception) {
    // TODO
}

编辑:在.invoke()调用中缺少参数。它需要目标对象引用来执行调用!(太久没有学习反射了...而且从未使用过!)


1
谢谢,这似乎非常准确。不过我还没有测试代码,因为我们改为在应用程序中附带大地高数据。这样,我们可以在iOS上进行相同的转换(实际上是相反的方向),并在两个系统上提供两个高度值。 - Sebastian Staacks
1
更新一下:Android bugtracker 上的问题已经关闭,API 已重新添加到 Android R 中。 - Andy
这适用于所有版本的API还是只适用于29版本? - SMBiggs

1
自2020年11月起,当部署到谷歌时,最低允许的目标SDK为29,否则可能会再次遇到此错误(就像我遇到的那样)。然后,今天有一个更快的解决方案:
compileSdkVersion 30 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接