在安卓系统中,地理围栏是否完全无法使用?

17
由于这个漏洞,我的团队决定不再使用地理围栏。在Android中使用地理围栏是否可行?
来自漏洞报告:

On all in-house test devices everything runs fine with debug and release builds. However, for some users out there we get crash reports that indicate a problem with the 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)

This happens on Android versions ranging from 4.4.2 to 7.0 with no noticeable pattern. The same applies to the device model and manufacturer: many and multiple manufacturers and models.

这听起来像是一个非常严重的Heisenbug。

更新:

在Android中似乎有两种不同的地理围栏实现方式:

  1. 使用Awareness [.fence] API
  2. 使用位置地理围栏API

我们需要使用Awareness API以获得我们所需的功能和省电性。

注意:

我看到有1个关闭投票,原因是“主要基于意见”。所以,请让我明确,我不想要不支持的意见答案。我想要事实、参考或具体专业知识。我已经进行了研究并引用了一个没有可靠解决方案的随机崩溃错误。我希望其他人注意到他们已经成功实现了地理围栏,并且要么:

  1. 他们的应用程序从未遇到过这个 bug(良好的崩溃报告从未捕获到“包的无效 API 密钥”)
  2. 曾经看到过这个 bug 并成功实施了修复
  3. 从未见过这个 bug

1
你尝试过直接使用Google的地理围栏API与使用Awareness API相比吗? - Pablo Baxter
2
我的理解是,Awareness API 应该取代其他API。哦?你从哪里得到这个信息的? - Simon Hutton
1
@SimonH 来自 Google I/O 演示。 - Bruno Bronosky
希望他们能在Awareness API中修复它 :) 同时,我很高兴使用com.google.android.gms.location上的Geofencing而没有任何问题(包括电池友好性)。如果他们从那里删除它,我会感到震惊的。 - Simon Hutton
我正在使用地理围栏API,就像你上面描述的那样,没有任何问题。您可以在此处检查代码的某些部分https://github.com/Turistforeningen/SjekkUT/blob/master/android/app/src/main/java/no/dnt/sjekkut/location/GeofenceHelper.java - 它似乎很准确,并且我没有注意到它在后台运行时会消耗大量电量。如果您必须使用Awareness API,则我无法帮助您,但是另一个虽然笨重,但似乎工作正常。 - Espen Riskedal
显示剩余7条评论
1个回答

1

你提供的链接已经包含了所有信息,是吗?

我们的检查中存在一个错误,当发生网络错误进行身份验证时,有时会抛出此SecurityException。修复程序将在下一个Google Play服务版本发布时推出。

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

更新

嗯,回答你的问题“Android中地理围栏是否完全不能使用?”,我会说不是“完全”无法使用,但显然存在一些问题。

因为这些错误而不使用地理围栏吗?我认为这在很大程度上取决于使用情况,实际上是一个基于个人观点的问题。就移动设备而言,您永远无法100%确定某些东西是否可行。您的手机可能没有信号,即使代码中没有错误,由于各种原因,它仍然可能无法通知有关某个位置的信息。在移动设备上,一切都取决于如何处理错误。

我会实现您想要实现的功能,尝试按照错误票证中所建议的(使用UncaughtExceptionHandler)来捕获错误并在应用程序中实现分析/崩溃报告,以便您至少能获得有关此问题在实际情况下发生的频率信息。
向您的用户明确表示,由于基础系统的原因,您的应用程序的地理围栏功能无法始终100%正常工作,并且我认为他们仍然会很高兴拥有这个功能。可能在应用程序中或主页上有一些常见问题解答(FAQ),以解决已知问题。希望这有助于您做出决定。

线程中还有其他评论表明该建议并未解决问题。此外,在提出这个问题18天后,谷歌发布了一个更新,应该可以解决这个问题。然而,该线程上最近的评论仍然显示他们仍在遇到此问题。 - Bruno Bronosky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接