android模拟位置提供程序应用程序中的setElapsedRealtimeNanos()调用

android模拟位置提供程序应用程序中的setElapsedRealtimeNanos()调用,android,google-maps-android-api-2,Android,Google Maps Android Api 2,我正在开发一个android应用程序,它将接收当前位置并在地图上用标记显示,然后定期更新。我遵循了以下教程: 我想用模拟位置测试我的应用程序,所以我遵循了本教程: 然而,尽管我尽了最大努力,但由于谷歌混乱的文档,第一种方法失败了。我有一个问题: 然后,我决定使用mock location provider应用程序,并发现即使下载的应用程序清单中有android:minSdkVersion=“7”,它也有一个sendmockotionservice.java文件,其中有两个函数调用ela

我正在开发一个android应用程序,它将接收当前位置并在地图上用标记显示,然后定期更新。我遵循了以下教程:

我想用模拟位置测试我的应用程序,所以我遵循了本教程:

然而,尽管我尽了最大努力,但由于谷歌混乱的文档,第一种方法失败了。我有一个问题:

然后,我决定使用mock location provider应用程序,并发现即使下载的应用程序清单中有
android:minSdkVersion=“7”
,它也有一个
sendmockotionservice.java
文件,其中有两个函数调用
elapsedrealtimenos()
setelapsedrealtimenos()
,它们是在API 17级中添加的。我需要在API级别为8的设备中运行此模拟位置提供程序应用程序。因此,我改变了思路:

elapsedTimeNanos = SystemClock.elapsedRealtimeNanos();

我不清楚如何更改此行:

mockLocation.setElapsedRealtimeNanos(elapsedTimeNanos);
如何更改上述行,使模拟位置提供程序应用程序与API级别8兼容?

我今晚用gradle更新了build,并注意到了API级别17中引入的使用的相同问题。该应用程序在我的4.4设备上运行良好,但在我的4.1设备上会因NoSuchMethodError而崩溃

我深入研究location类的源代码,看看API 17到底发生了什么变化。以下是相应的差异:

如果搜索新引入的字段
mElapsedRealtimeNano
,您将看到其值仅在单个点中查询(
+
保留以指示新插入的行):

新引入的位置“完整”的概念也仅用于单个地点:

     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
     }
应该由

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
    elapsedTimeNanos = SystemClock.elapsedRealtimeNanos();
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
    mockLocation.setElapsedRealtimeNanos(elapsedTimeNanos);
}

应该由

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
    elapsedTimeNanos = SystemClock.elapsedRealtimeNanos();
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
    mockLocation.setElapsedRealtimeNanos(elapsedTimeNanos);
}
在SendMockLocationService类中。Android Studio将抱怨
elapsedTimeNanos
可能尚未初始化-您可以使用值0安全地初始化它以解决此问题

通过这些更改,应用程序在我的4.1设备上运行良好。如果您在旧版本的Android上有任何问题,请告诉我


编辑:。

您不会更改该行,因为您已经更改了elapsedTimeNanos的值。
mockLocation.setElapsedRealtimeNanos(elapsedTimeNanos);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
    mockLocation.setElapsedRealtimeNanos(elapsedTimeNanos);
}