Seb*_*cks 9 gps android android-compatibility android-api-levels android-gps
我只是尝试将我们的应用程序的目标和编译 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 的当前代码:
Android SDK 29 版本中似乎存在问题,并且忽略了提供复古兼容性的方法。
从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
}
Run Code Online (Sandbox Code Playgroud)
编辑:.invoke()调用中缺少一个参数。它需要目标对象引用来执行调用!(自从学习反射太久了……从那以后就没有使用过它!)
| 归档时间: |
|
| 查看次数: |
1425 次 |
| 最近记录: |