首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >android模拟位置提供程序应用中的setElapsedRealtimeNanos()调用

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

Stack Overflow用户
提问于 2014-10-19 18:02:50
回答 1查看 1.9K关注 0票数 1

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

Google Maps Android API v2

Retrieving the Current Location

Receiving Location Updates

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

Testing Using Mock Locations

然而,由于Google的文档令人困惑,尽管我尽了最大努力,第一种方法还是失败了。我遇到了这个问题:

Android LocationClient mock location not set

然后,我决定使用模拟位置提供程序应用程序,并发现尽管下载的应用程序的清单中有android:minSdkVersion="7",但它有一个SendMockLocationService.java文件,其中有两个函数调用elapsedRealtimeNanos()setElapsedRealtimeNanos(),这两个函数是在API17级中添加的。我需要在API8级的设备上运行这个模拟位置提供程序应用程序。因此,我更改了行:

代码语言:javascript
运行
复制
elapsedTimeNanos = SystemClock.elapsedRealtimeNanos();

代码语言:javascript
运行
复制
elapsedTimeNanos = SystemClock.elapsedRealtime()*1000000;

我不清楚如何更改这一行:

代码语言:javascript
运行
复制
mockLocation.setElapsedRealtimeNanos(elapsedTimeNanos);

如何更改上面提到的行,以使模拟位置提供程序应用程序与API Level 8兼容?

EN

回答 1

Stack Overflow用户

发布于 2014-11-23 11:20:07

今天晚上,我用gradle更新了the sample project you referenced,并注意到在API17级引入的setElapsedRealtimeNanos的使用也存在同样的问题。这个应用程序在我的4.4设备上运行良好,但在我的4.1设备上使用NoSuchMethodError就会崩溃。

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

https://android.googlesource.com/platform/frameworks/base/+/2eeeec248a38ff33999c83f4b8d5bab7d50e79d2%5E%21/

如果您搜索新引入的字段mElapsedRealtimeNano的用法,您将看到它的值只在一个点上被查询(保留的+表示新插入的行):

代码语言:javascript
运行
复制
+    public boolean isComplete() {
+        if (mProvider == null) return false;
+        if (!mHasAccuracy) return false;
+        if (mTime == 0) return false;
+        if (mElapsedRealtimeNano == 0) return false;
+        return true;
+    }

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

代码语言:javascript
运行
复制
     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上正常工作。

代码语言:javascript
运行
复制
elapsedTimeNanos = SystemClock.elapsedRealtimeNanos();

应替换为

代码语言:javascript
运行
复制
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
    elapsedTimeNanos = SystemClock.elapsedRealtimeNanos();
}

代码语言:javascript
运行
复制
mockLocation.setElapsedRealtimeNanos(elapsedTimeNanos);

应替换为

代码语言:javascript
运行
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26449391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档