地理围栏在 Android 中完全无法使用吗?

Posted

技术标签:

【中文标题】地理围栏在 Android 中完全无法使用吗?【英文标题】:Is geofencing completely unusable in Android? 【发布时间】:2017-06-23 23:48:38 【问题描述】:

由于this bug,我的团队决定完全不使用地理围栏。 android 中的地理围栏是否可用?

来自错误报告:

在所有内部测试设备上,一切都运行良好,调试和 发布版本。但是,对于某些用户,我们会收到崩溃报告 表明 API 存在问题:

Fatal Exception: java.lang.SecurityException: Invalid API Key for package = de.stocard.stocard .Status code received = -1
       at android.os.Parcel.readException(Parcel.java:1620)
       at android.os.Parcel.readException(Parcel.java:1573)
       at com.google.android.gms.common.internal.zzu$zza$zza.zza(Unknown Source)
       at com.google.android.gms.common.internal.zzd.zzqz(Unknown Source)
       at com.google.android.gms.internal.zzpw$zzc.zzapl(Unknown Source)
       at com.google.android.gms.internal.zzpw$zzf.run(Unknown Source)
       at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423)
       at java.util.concurrent.FutureTask.run(FutureTask.java:237)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
       at com.google.android.gms.internal.zzrn.run(Unknown Source)
       at java.lang.Thread.run(Thread.java:818)

这发生在从 4.4.2 到 7.0 的 Android 版本上,没有 明显的模式。这同样适用于设备型号和 制造商:许多和多个制造商和型号。

这听起来像一个非常严重的黑森虫。

更新:

在 Android 中似乎有 2 种不同的方式来进行地理围栏:

    使用Awareness[.fence] API 使用location Geofence API

我们需要使用 Awareness API 来获得我们想要的功能和电池友好性。

注意:

由于“主要基于意见”,我看到 1 票接近投票。所以,让我明确一点,我不想要不受支持的意见答案。我想要事实、参考资料或特定的专业知识。我完成了研究引用了一个随机崩溃错误,没有可靠的解决方法。我想让其他人注意到他们已经成功实施了地理围栏并且有:

    证明他们的应用从未遇到过此错误(良好的崩溃报告从未发现 Invalid API Key for package) 已看到此错误并已成功实施修复 从未见过此错误

【问题讨论】:

您是否尝试过直接使用 Google 的地理围栏 API 与使用感知 API? 我没有。我建议在我们的应用程序中使用 Android 地理围栏功能。另一位开发人员回来说:“我在另一家公司试过,但它坏了;这是错误票。”因此,现在我正在尝试从任何可能有证据表明今天可以在 Android 中完成地理围栏的开发人员那里获得反馈。 我没有使用过 Awareness API,所以我无法评价它的效果如何。但是,在我使用地理围栏 API 的两年中,我还没有看到这个错误。我会说 Geofencing API 在准确性、时间、错误事件和可用性方面有自己的一系列问题,但这个错误似乎只与 Awareness API 有关。 “我的理解是 Awareness API 应该取代其他的”。哦?你从哪里得到的? @SimonH 来自 Google I/O 演示文稿。 【参考方案1】:

您链接的错误已经包含所有信息,不是吗?

我们的检查中存在一个错误,当需要验证的网络错误时,有时会抛出此 SecurityException。该修复程序将在下一版本的 Google Play 服务中推出。

目前,最好的解决方法是在您调用 GoogleApiClient.connect() 的线程上设置 UncaughtExceptionHandler。对于大多数人来说,这将在主线程上,您可以通过 Looper.myLooper().getThread() 获得。

更新

好吧,要回答您的问题“地理围栏在 Android 中完全不可用吗?”,我会说不,它不是“完全”不可用,但显然包含一些问题。

您是否应该因为这些错误而根本不使用地理围栏?我想这在很大程度上取决于用例,并且确实是一个基于意见的问题。与移动设备一样,您永远无法 100% 确定某些东西是否有效。您的手机可能没有信号,即使代码中没有错误,由于各种原因,它可能仍然无法收到有关某个位置的通知。在移动设备上,关键在于您如何处理错误。

我会实现您想要实现的任何东西,尝试执行错误票 (UncaughtExceptionHandler) 中的建议以捕获错误并在应用程序中实现分析/崩溃报告,以便您至少可以获得有关如何执行的信息这经常发生在现场。

向您的用户明确表示,由于底层系统的原因,无法 100% 保证您的应用的地理围栏功能始终有效,我认为他们仍然会很高兴拥有该功能。可能在您的应用程序或主页上的某处有一些解决已知问题的常见问题解答。希望这可以帮助您做出决定

【讨论】:

线程中还有其他几个 cmets 表明该建议无法解决问题。此外,在提出此问题 18 天后,Google released an update 应该可以解决此问题。但是,就在昨天,该线程上的 cmets 表示他们仍在看到它。

以上是关于地理围栏在 Android 中完全无法使用吗?的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Android 中添加地理围栏,因为“网络位置已禁用”

如何在 android 地理围栏中实现“取消驻留”?

Android Oreo 上未添加地理围栏

Android 磨损:地理围栏 - ApiException:1000

Android 地理围栏示例代码中的错误?有人可以确认吗?

未触发 Android 地理围栏广播接收器