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
}
有什么想法吗?感谢。
答案 0 :(得分:2)
我找到了问题的答案,并设法找出了接近传感器的主要流程。
首先,有两种方法可以处理接近传感器: 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) {
}
注意:
希望这对某人有帮助。
答案 1 :(得分:0)
我猜你的程序是一个“在屏幕上”运行的活动?
我对这个主题知之甚少,但基于我在android上阅读过的一些文字,我认为当屏幕出现故障时,android会暂停/关闭应用程序。
您必须阻止此暂停,或在后台服务中运行您的应用。但我不知道服务是否能以同样的方式读取感知器。
我不确定这个“答案”是否能真正帮到你,但你可能会知道要搜索什么。