- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我需要在用户靠近给定地点时通知他。我为此使用地理围栏 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 引用 setLoiteringDelay和 setNotificationResponsiveness .另请阅读 geofence troubleshooting如果您还没有,请查看部分。
您还可以增加地理围栏的大小,尝试将其加倍然后进行测试。由于您在深度 sleep 时的定位精度较低,这将使您的手机更容易确定它在地理围栏内,一旦确定它在地理围栏内,它就会发送 Intent 。
希望对您有所帮助!
关于android - 当设备处于深度 sleep (打瞌睡)模式时,Geofence 未决 Intent 触发太迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39697675/
目前我正在阅读有关 Android 7.0 的官方谷歌文档新闻 我无法理解一些事情。他们编写了 Doze,通过在用户屏蔽屏幕时关闭网络和 CPU 来延长电池生命周期。但这是如何运作的? 1.我的设备中
一切似乎都指向这两个命令: adb shell dumpsys battery unplug adb shell dumpsys deviceidle step 我关注了the instruction
我正在制作一个将在设备锁定时运行的应用程序,通过 Activity#setShowWhenLocked(true)。我不想阻止设备进入低功耗状态。我知道系统使用 Always-On Display 执
我需要在用户靠近给定地点时通知他。我为此使用地理围栏 API。当我使用模拟位置在 Android 模拟器上测试应用程序时,一切正常。与模拟位置的真实设备相同。但是当我走路并且我的手机处于深度 slee
我是一名优秀的程序员,十分优秀!