我正在开发一个android应用程序,它将接收当前位置,并将其显示在地图上的标记,然后将保持定期更新。我遵循了以下教程:
Retrieving the Current Location
我想用模拟位置测试我的应用程序,所以我遵循了这个教程:
然而,由于Google的文档令人困惑,尽管我尽了最大努力,第一种方法还是失败了。我遇到了这个问题:
Android LocationClient mock location not set
然后,我决定使用模拟位置提供程序应用程序,并发现尽管下载的应用程序的清单中有android:minSdkVersion="7"
,但它有一个SendMockLocationService.java
文件,其中有两个函数调用elapsedRealtimeNanos()
和setElapsedRealtimeNanos()
,这两个函数是在API17级中添加的。我需要在API8级的设备上运行这个模拟位置提供程序应用程序。因此,我更改了行:
elapsedTimeNanos = SystemClock.elapsedRealtimeNanos();
至
elapsedTimeNanos = SystemClock.elapsedRealtime()*1000000;
我不清楚如何更改这一行:
mockLocation.setElapsedRealtimeNanos(elapsedTimeNanos);
如何更改上面提到的行,以使模拟位置提供程序应用程序与API Level 8兼容?
发布于 2014-11-23 11:20:07
今天晚上,我用gradle更新了the sample project you referenced,并注意到在API17级引入的setElapsedRealtimeNanos
的使用也存在同样的问题。这个应用程序在我的4.4设备上运行良好,但在我的4.1设备上使用NoSuchMethodError就会崩溃。
我深入研究了location类的源代码,看看API 17到底发生了什么变化。下面是相应的差异:
如果您搜索新引入的字段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
}
由于在API17之前的Location类中缺少此验证,因此如果您将两个对SystemClock.elapsedRealtimeNanos()
的调用都包装在版本检查中,则应用程序应该可以在所有API级别的>= 7上正常工作。
elapsedTimeNanos = 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。
https://stackoverflow.com/questions/26449391
复制相似问题