在针对目标API级别29进行编译时,要以Android API级别<24访问NMEA吗?

时间:2019-09-17 14:01:46

标签: android gps android-gps android-api-levels android-compatibility

我刚刚尝试将应用程序的目标和编译API级别更新为29(Android 10),并发现我无法再进行编译,因为LocationManager.addNmeaListener仅接受OnNmeaMessageListener(API级别24引入)而不是较旧且过时的GpsStatus.NmeaListener(因此,我得到“ 不兼容的类型:NmeaListener无法转换为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

2 个答案:

答案 0 :(得分:2)

Android SDK 29发行版似乎存在问题,提供追溯兼容性的方法被忽略了。

There is an issue opened in the Android bugtracker

从该问题的Android工程师的评论中,推荐的方法是通过反射来访问它……我仍然必须对其进行测试,但是我想它应该是以下代码:

try {
    //noinspection JavaReflectionMemberAccess
    Method addNmeaListener =
        LocationManager.class.getMethod("addNmeaListener", GpsStatus.NmeaListener.class);
    addNmeaListener.invoke(locationManager, nmeaListenerDeprecated);
} catch (Exception exception) {
    // TODO
}

编辑:.invoke()调用中缺少参数。它需要目标对象引用来执行调用! (距离学习反射太久了……从那以后就再没有使用过!)

答案 1 :(得分:0)

由于从现在开始(2020年11月),部署到Google时允许的最低Target SDK为29,所以有人会再次遇到此错误(就像我发生的那样)。 那么,今天更快的解决方案是:

compileSdkVersion 30