2014-10-19 102 views
1

我正在開發一個android應用程序,它將接收當前位置並使用標記將其顯示在地圖上,然後將定期更新。我跟着以下教程:setElapsedRealtimeNanos()在android模擬位置提供程序中調用

Google Maps Android API v2

Retrieving the Current Location

Receiving Location Updates

我想測試我的模擬位置的應用程序,所以我跟着這個教程:

Testing Using Mock Locations

然而,因爲Google的困惑g儘管我嘗試了第一種方法失敗的最佳嘗試。我是有這個問題:

Android LocationClient mock location not set

於是,我決定使用模擬位置提供應用程序,並發現,儘管下載的應用程序的清單具有​​,它有一個SendMockLocationService.java文件,其中有兩個函數調用這是在API級別17.添加elapsedRealtimeNanos()setElapsedRealtimeNanos()我需要運行在API級別8所以設備這個模擬位置提供的應用程序,我已經改了行:

​​

elapsedTimeNanos = SystemClock.elapsedRealtime()*1000000; 

這是我不清楚如何改變這一行:

mockLocation.setElapsedRealtimeNanos(elapsedTimeNanos); 

我怎樣才能改變上述行,以便模擬位置提供的應用程序變得與API等級8兼容?

+0

您不會更改該行,因爲您已經更改了elapsedTimeNanos的值。 – danny117 2014-10-28 04:05:37

回答

2

我更新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