我目前正在使用Android的示例应用程序,它使用地理围栏进行位置监控,我发现很难遵守Android Vitals后台唤醒限制(https://developer.android.com/topic/performance/vitals/wakeup. HTML).
我正在使用Battery Historian来监控唤醒,虽然我们自己的警报速度低于每小时一次,但com.google.android.location.ALARM_WAKEUP_ACTIVITY_DETECTION和com.google.android.location.ALARM_WAKEUP_LOCATOR触发的速率要高得多.我尝试将地理围栏响应延迟设置为5分钟,并且WAKEUP_LOCATOR警报大大减少.尽管如此,ALARM_WAKEUP_ACTIVITY_DETECTION警报仍然远远超过10 /小时限制.
我们使用半径为100米的地理围栏,并按照此处的建议监控退出过渡.我还使用了一个更大的地理围栏,半径可达2公里,以确定何时需要重新加载地理围栏,以避免一次装载太多地理围栏.
最近的测试是在Galaxy S8上的Android 7.1上进行的,但这种情况在其他设备上是常规的.有没有人有类似的问题?Google推荐使用Geofences,特别是考虑到Oreo对后台位置请求的限制,因此系统监控工具在建议的避免方式时会占用大量唤醒,这很奇怪.
Ps:我在这里读过Yvette Colomb的答案,我没有使用位置更新,只使用Geofence服务.我应该放弃它吗?
[编辑]关于android的地理围栏的文档可以在这里看到:https://developer.android.com/training/location/geofencing.html
[编辑2] Android跟踪器上有一个问题正在讨论这种情况,但在这方面也没有新的更新
[编辑3]:问题已在Google问题跟踪器上分配.在~22/08/2018
感谢您的关注,
我们开发了一个 Android SDK,在测试 Android 11 Beta 时,我们发现了一个似乎尚未报告的问题。
在 Android 11 中,为位置、麦克风和相机权限引入了新的一次性权限。使用此选项,一旦用户离开应用程序,权限就会被撤销(更多详细信息可在此处找到)。
问题是,在应用程序不再处于前台的一小段时间之后(不需要杀死应用程序,只需最小化就足够了),所有未来预定的警报或作业都会被删除,就像应用程序被强制一样被杀。这仅发生在此级别的权限下。拒绝或提供其他级别会按预期保留先前安排的警报或作业。我们已在 Beta 3 版本中使用 RPB3.200720.005 版本号在 Pixel 2 模拟器中重现了这一点。在此repo 中,您可以找到用于重现错误的示例应用程序。
这个单一的活动应用程序会在接下来的 5 分钟内安排一个闹钟响铃,并在 5 到 6 分钟内触发一个作业。屏幕上有三个按钮,每个按钮都会触发相应的权限请求。JobService 和 BroadcastReceiver 类只记录它们已被触发。可以通过以下步骤重现该情况:
adb shell dumpsys alarm | grep com.example.permissions.app并adb shell dumpsys jobscheduler | grep com.example.permissions.app看到警报和作业都已安排;adb shell dumpsys alarm | grep com.example.permissions.app和adb shell dumpsys jobscheduler | grep com.example.permissions.app。警报和作业将不再出现;大家有遇到过类似的情况吗?我们的预感是,为了撤销一次性权限,应用程序进程会以某种方式被终止,从而导致这些副作用。我们还在Android Issue Tracker上提交了一个问题,如果 Google 回答了这个问题 …
我在android 21及更高版本上出现以下错误。
我遇到以下错误,并且对该错误的制造商或型号没有限制。
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String[] android.content.pm.PackageManager.getPackagesForUid(int)' on a null object reference
at android.os.Parcel.readException(Parcel.java:1605)
at android.os.Parcel.readException(Parcel.java:1552)
at android.location.ILocationManager$Stub$Proxy.getLastLocation(ILocationManager.java:717)
at android.location.LocationManager.getLastKnownLocation(LocationManager.java:1200)
at [...]
Run Code Online (Sandbox Code Playgroud)
触发错误的调用是以下一种:
mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
Run Code Online (Sandbox Code Playgroud)
我事先检查mLocationManager是否不为null或我是否具有必要的权限。它适用于大多数情况,但确实有一些崩溃的情况。
有谁知道该怎么做才能避免发生这种情况,或者是否有任何方法可以检测到发生这种情况,所以我不要求该位置?
感谢您的关注,