我有点困惑为什么我的Transitions API解决方案通常在第一天或两天有效,然后停止接收任何更新。我更深入地研究了它,发现了一个线索,其中讨论了我们如何需要SIGNIFICAT_MOTION激活传感器才能唤醒传感器,最终唤醒Transitions API整个解决方案。
我所做的是实现了侦听器,它可以帮助我了解SIGNIFICANT_MOTION传感器何时启用以及何时不启用:
try {
boolean request = sensorManager.requestTriggerSensor(triggerEventListener, sensor);
Timber.e("Transitions API is working. If returns false - device is STILL");
} catch (IllegalArgumentException exception) {
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_SIGNIFICANT_MOTION);
Timber.e("SensorManager - " + sensorManager + ", sensor - " + sensor); //TODO: Later delete
}
Run Code Online (Sandbox Code Playgroud)
现在,如您所见,每当此代码抛出异常时,我都会尝试重新初始化传感器,以确保稍后在应用程序中不会抛出异常。日志显示sensor is null。
当传感器在一两天后变为空时(第一天它运行良好并且设备正确返回传感器值),除了重新启动设备之外,没有其他方法可以解决问题。
问题:为什么sensorManager.getDefaultSensor(Sensor.TYPE_SIGNIFICANT_MOTION);第一天返回值(传感器),但 48 小时后返回 null 并停止工作?(我相信这会搞乱我的 Transitions API 解决方案,并且是它无法正常工作的根本原因)。
附加信息。
手机:Google Pixel 3A 操作系统:Android …
android activity-recognition significant-motion-sensor activitytransitionapi
我正在使用Transitions API,前 24-48 小时一切正常 - 我从 API 收到身体活动变化,但 24-48 小时后什么也没有。
在 Transitions API Receiver 下,我使用Foreground Service48 小时后仍处于活动状态的接收器。我可以通过查看日志来验证这一点;此外,Location (Fused Location Client)24-48 小时后仍然会有更新,而 Transition API 似乎已经死了。
有人经历过这个吗?我确实认为使用 Worker 重置(取消注册然后再次注册)转换 API 可能是替代方案(每 1-2 小时一次)。不确定这是否有帮助。我有一种感觉,当应用程序进入打瞌睡模式/某种睡眠状态时,就会发生这种情况。
另外,我的前台服务使用exported=false,也许将其设置为true会有帮助?(我希望有人给出答案并解释为什么你应该使用其中之一)
操作系统:安卓12
我希望使用新的Activity过渡API,在按照此处的教程进行操作后,我无法获得所需的结果。
这是我用于设置要检测的活动过渡的代码:
public void setActivityTransitions() {
transitionList = new ArrayList<>();
ArrayList<Integer> activities = new ArrayList<>(Arrays.asList(
DetectedActivity.STILL,
DetectedActivity.WALKING,
DetectedActivity.ON_FOOT,
DetectedActivity.RUNNING,
DetectedActivity.ON_BICYCLE,
DetectedActivity.IN_VEHICLE));
for (int activity :
activities) {
transitionList.add(new ActivityTransition.Builder()
.setActivityType(activity)
.setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER).build());
transitionList.add(new ActivityTransition.Builder()
.setActivityType(activity)
.setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT).build());
}
}
Run Code Online (Sandbox Code Playgroud)
然后请求活动转换更新:
ActivityTransitionRequest activityTransitionRequest = new ActivityTransitionRequest(transitionList);
Intent intent = new Intent(context, ActivityDetectorTransitionService.class);
intent.setAction("com.test.activityrecognition.START_ACTIVITY_TRANSITION_DETECTION_ALARM");
PendingIntent pendingIntent = PendingIntent.getService(context, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);
Task<Void> task = ActivityRecognition.getClient(context).requestActivityTransitionUpdates(activityTransitionRequest, pendingIntent);
task.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void result) {
System.out.println("onSuccess");
}
});
task.addOnFailureListener(new OnFailureListener() …Run Code Online (Sandbox Code Playgroud) android android-pendingintent activity-recognition android-broadcastreceiver activitytransitionapi