接近传感器无法关闭屏幕?

时间:2012-01-31 08:57:45

标签: android screen sensor proximity

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
    }

有什么想法吗?感谢。

2 个答案:

答案 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. 注册传感器的侦听器。在这种情况下,接近传感器动作必须在onSensorChanged方法中处理(可以设置screenBrigthness)。
  2. 注意:

    1. 关闭屏幕时,会调用onPause。
    2. 如果您使用第一种方法,如果无法设置PROXIMITY_SCREEN_OFF_WAKE_LOCK,您应该考虑备份。因此,我建议尝试在onStart和onResume中实例化锁,以检查它是否为null。如果不为null,则获取锁定,否则为传感器注册侦听器。
    3. 在onSensorChanged中,我将screenBrightness设置为BRIGHTNESS_OVERRIDE_OFF,当覆盖传感器时和relesing时,我将screenBrightness设置为BRIGHTNESS_OVERRIDE_FULL和/或BRIGHTNESS_OVERRIDE_NONE,但它没有打开屏幕。因此,解决方法是将默认情况下设置为不可见的黑色布局设置为可见并占据整个屏幕。
    4. 希望这对某人有帮助。

答案 1 :(得分:0)

我猜你的程序是一个“在屏幕上”运行的活动?

我对这个主题知之甚少,但基于我在android上阅读过的一些文字,我认为当屏幕出现故障时,android会暂停/关闭应用程序。

您必须阻止此暂停,或在后台服务中运行您的应用。但我不知道服务是否能以同样的方式读取感知器。

我不确定这个“答案”是否能真正帮到你,但你可能会知道要搜索什么。