[英]Accessing NMEA on Android API level < 24 when compiled for target API level 29?
我只是嘗試將我們的應用程序的目標和編譯 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
}
編輯: .invoke()
調用中缺少一個參數。 它需要目標對象引用來執行調用! (自從學習反射太久了……從那以后就沒有使用過它!)
由於從現在開始(2020 年 11 月)部署到 Google 時允許的最小目標 SDK 為 29,因此有人可能會再次遇到此錯誤(就像我發生的那樣)。 那么,今天一個更快的解決方案是:
compileSdkVersion 30
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.