android模拟位置提供程序应用程序中的setElapsedRealtimeNanos()调用
我正在开发一个android应用程序,它将接收当前位置并在地图上用标记显示,然后定期更新。我遵循了以下教程: 我想用模拟位置测试我的应用程序,所以我遵循了本教程: 然而,尽管我尽了最大努力,但由于谷歌混乱的文档,第一种方法失败了。我有一个问题: 然后,我决定使用mock location provider应用程序,并发现即使下载的应用程序清单中有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: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);
}