gpt4 book ai didi

android - 当设备处于深度 sleep (打瞌睡)模式时,Geofence 未决 Intent 触发太迟

转载 作者:太空宇宙 更新时间:2023-11-03 13:13:55 27 4
gpt4 key购买 nike

我需要在用户靠近给定地点时通知他。我为此使用地理围栏 API。当我使用模拟位置在 Android 模拟器上测试应用程序时,一切正常。与模拟位置的真实设备相同。但是当我走路并且我的手机处于深度 sleep 模式时,地理围栏会在 5 到 10 分钟后触发。如果我在地理围栏半径内并且我解锁了我的手机,请打开任何使用我的地理围栏触发位置的应用程序。 (Android 5.1,摩托罗拉 moto G 第一代)

下面是我注册地理围栏的方式:

  public void registerLocation(RegisterAlarmRequestModel data) {
if (isLocationDetectionAllowed() && isConnected) {
GeofencingRequest geofencingRequest = prepareGeofencingRequest(prepareGeofence(data));
PendingIntent pendingIntent = prepareIntent(data.getId());
PendingResult<Status> result = GeofencingApi.addGeofences(
googleApiClient, geofencingRequest, pendingIntent);
Status status = result.await();
if (status.isSuccess())
Log.d("Location", "Geofence " + data.getId() + " has been registered");
}
}

//preparing Geofence Pending Intent which will be triggered
private PendingIntent prepareIntent(int alarmId) {
Intent intent = new Intent(context, LocationRingingService.class);
intent.putExtra(LocationRingingService.KEY_ALARM_ID, alarmId);
return PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}

private GeofencingRequest prepareGeofencingRequest(Geofence geofence) {
GeofencingRequest.Builder builder = new GeofencingRequest.Builder()
.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER)
.addGeofence(geofence);
return builder.build();
}

private Geofence prepareGeofence(RegisterAlarmRequestModel data) {
Geofence geofence = new Geofence.Builder()
.setRequestId(String.valueOf(data.getId()))
.setCircularRegion(data.getLatitude(), data.getLongitude(), data.getRadius())
.setLoiteringDelay(100)
.setExpirationDuration(Geofence.NEVER_EXPIRE)
.setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER)
.build();
return geofence;
}

为了接收 Intent ,我正在使用 IntentService:

@Override
protected void onHandleIntent(Intent intent) {
Log.d("Location", "accepted intent: " + intent.toString());
//database request
}

这就是我在 list 中注册我的服务的方式:

<service
android:name=".plugin.delivery.ringing.location.service.LocationRingingService"
android:enabled="true"
android:exported="true" />

更新:我需要尽可能准确地捕捉用户刚刚进入地理围栏的时刻。我有一个想法:注册半径大于需要的地理围栏(例如,如果需要 100 米半径,则注册半径为 200-300 米的地理围栏)。当用户进入半径较大的 Geophence 时 - 启动带有位置更新的服务以提高地理围栏精度。当用户刚刚输入时 - 禁用位置服务。

最佳答案

问题在于,当您的手机处于深度 sleep 状态时,它无法准确更新位置。更新位置最准确的方法是 GPS,这也是最耗电的。其他更新位置的方法(例如使用蜂窝网络)会消耗更少的电量,但也不太准确。默认情况下,地理围栏希望在发送 Intent 之前真正确定您在地理围栏中。在深度 sleep 中很难获得这种准确度,因为手机无法获取准确的位置数据。

当您解锁手机并使用位置感知应用程序时地理围栏立即触发的原因是该应用程序更新了 LastLocation ,您的地理围栏会看到然后发送 Intent 。当您的手机处于深度 sleep 状态时,位置不会更新。

对于地理围栏,您还可以调整一些设置来提高响应速度。我看到您已经在使用 setLoiteringDelay,尝试使用不同的值,也许尝试非常小的值,看看会发生什么。您还可以为 setNotificationResponsiveness 设置一个值,其工作方式类似。这样做应该会让你的围栏 react 更快,但它可能会消耗更多的电池生命周期。另请阅读 API 引用 setLoiteringDelaysetNotificationResponsiveness .另请阅读 geofence troubleshooting如果您还没有,请查看部分。

您还可以增加地理围栏的大小,尝试将其加倍然后进行测试。由于您在深度 sleep 时的定位精度较低,这将使您的手机更容易确定它在地理围栏内,一旦确定它在地理围栏内,它就会发送 Intent 。

希望对您有所帮助!

关于android - 当设备处于深度 sleep (打瞌睡)模式时,Geofence 未决 Intent 触发太迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39697675/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com