我更新the sample project you referenced今晚與建設的gradle,並發現與使用setElapsedRealtimeNanos
同樣的問題,在API級別17的應用我4.4的設備上運行良好出臺,但會用的NoSuchMethodError崩潰我的4.1設備上。
我去的位置類的源代碼,挖,看看究竟是什麼改變了API 17.下面是相應的DIFF:
https://android.googlesource.com/platform/frameworks/base/+/2eeeec248a38ff33999c83f4b8d5bab7d50e79d2%5E%21/
如果你搜索新推出的場mElapsedRealtimeNano
的用法,你會看到它的價值是在單點只查詢(+
保留,以表明新插入的行):
+ public boolean isComplete() {
+ if (mProvider == null) return false;
+ if (!mHasAccuracy) return false;
+ if (mTime == 0) return false;
+ if (mElapsedRealtimeNano == 0) return false;
+ return true;
+ }
一個位置的新引進的概念是「完整的」,也只在一個點使用:
public void setTestProviderLocation(String provider, Location loc) {
+ if (!loc.isComplete()) {
+ if (mContext.getApplicationInfo().targetSdkVersion <= Build.VERSION_CODES.JELLY_BEAN) {
+ // for backwards compatibility, allow mock locations that are incomplete
+ Log.w(TAG, "Incomplete Location object", new Throwable());
+ loc.makeComplete();
+ } else {
+ throw new IllegalArgumentException(
+ "Location object not complete. Missing timestamps or accuracy?");
+ }
+ }
+
// original setTestProviderLocation code is then executed here
}
由於此驗證從位置類API 17日之前丟失,應用程序應該只是罰款上的所有API等級> = 7,如果你換兩個在版本檢查中調用SystemClock.elapsedRealtimeNanos()
,即
應由
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
elapsedTimeNanos = SystemClock.elapsedRealtimeNanos();
}
和
mockLocation.setElapsedRealtimeNanos(elapsedTimeNanos);
替換應由
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
mockLocation.setElapsedRealtimeNanos(elapsedTimeNanos);
}
的SendMockLocationService類內
代替。 Android Studio會抱怨elapsedTimeNanos
可能尚未初始化 - 您可以安全地使用值0初始化它以解決此問題。
有了這些更改,該應用程序在我的4.1設備上運行良好。如果您在舊版Android上有任何問題,請告訴我。編號:repository for my updated version of the Google sample app。
您不會更改該行,因爲您已經更改了elapsedTimeNanos的值。 – danny117 2014-10-28 04:05:37