Hy,
我有一个与接近传感器相关的问题。当我将手指放在上面时,我想关闭屏幕,当我拿开手指时,我想打开屏幕。
我成功地完成了关闭部分,但是当我将手指从传感器上移开时,它似乎没有执行 onSensorChanged 方法。这是它的代码:
public void onSensorChanged(SensorEvent event) {
float distance = event.values[0];
boolean active = (distance >= 0.0 && distance < PROXIMITY_THRESHOLD && distance < event.sensor.getMaximumRange());
boolean isValidCallState = false;
if (callsInfo != null) {
for (SipCallSession callInfo : callsInfo) {
int state = callInfo.getCallState();
isValidCallState |= ((state == SipCallSession.CallState.CONFIRMED)
|| (state == SipCallSession.CallState.CONNECTING)
|| (state == SipCallSession.CallState.CALLING) || (state == SipCallSession.CallState.EARLY && !callInfo
.isIncoming()));
}
}
if (isValidCallState && active) {
Log.e("", "turn off");
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.buttonBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_OFF;
lp.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_OFF;
getWindow().setAttributes(lp);
lockOverlay.show();
} else {
Log.e("", "turn on");
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.buttonBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE;
lp.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE;
getWindow().setAttributes(lp);
}
Log.e("", "turn ???"); // --> does not print this when releasing the sensor
}
有任何想法吗?谢谢。
我找到了问题的答案,并设法弄清楚了接近传感器的主要流程。
首先,有两种处理接近传感器的方法:
1. 对 PROXIMITY_SCREEN_OFF_WAKE_LOCK 进行锁定。从我读到的内容来看,这是android使用的一个隐藏常量,其值为32(至少目前是这样——在未来的版本中可能会或可能不会改变)。如果锁定成功,接近传感器将像您在通话中一样工作。
try {
Method method = powerManager.getClass().getDeclaredMethod(
"getSupportedWakeLockFlags");
int supportedFlags = (Integer) method.invoke(powerManager);
Field f = PowerManager.class.getDeclaredField("PROXIMITY_SCREEN_OFF_WAKE_LOCK");
int proximityScreenOffWakeLock = (Integer) f.get(null);
if ((supportedFlags & proximityScreenOffWakeLock) != 0x0) {
proximityWakeLock = powerManager.newWakeLock(proximityScreenOffWakeLock,
"com.voalte.CallProximity");
proximityWakeLock.setReferenceCounted(false);
}
} catch (Exception e) {
}
- 为传感器注册一个侦听器。在这种情况下,接近传感器操作必须在 onSensorChanged 方法中处理(可以设置屏幕亮度)。
Note:
- 当屏幕关闭时,onPause 被调用。
- 如果您使用第一种方法,您应该考虑也有一个备份,以防无法设置 PROXIMITY_SCREEN_OFF_WAKE_LOCK。因此,我建议尝试在 onStart 和 onResume 中实例化锁,以检查其是否为空。如果不为空,则获取锁,否则为传感器注册侦听器。
- 在 onSensorChanged 中,我将屏幕亮度设置为 BRIGHTNESS_OVERRIDE_OFF,当覆盖传感器和释放时,我将屏幕亮度设置为 BRIGHTNESS_OVERRIDE_FULL 和/或 BRIGHTNESS_OVERRIDE_NONE,但它没有打开屏幕。因此,解决方法是使默认设置为不可见的黑色布局变得可见并占据整个屏幕。
希望这对某人有帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)