Датчик приближения не работает с выключенным экраном? - PullRequest
3 голосов
/ 31 января 2012

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 ]

2 голосов
/ 02 февраля 2012

Я нашел ответ на свой вопрос и сумел выяснить основной поток датчика приближения.

Во-первых, есть два способа работы с датчиком приближения: 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).

Примечание:

  1. Когда экран выключен, onPause
  2. Если вы используете первый метод, вам также следует подумать о резервном копировании на случай, если невозможно установить PROXIMITY_SCREEN_OFF_WAKE_LOCK.Поэтому я рекомендую попробовать и создать экземпляр блокировки в onStart и в onResume, чтобы проверить его на нуль.Если не ноль, приобретите блокировку, в противном случае зарегистрируйте слушателя для датчика.
  3. В onSensorChanged я устанавливаю screenBrightness на BRIGHTNESS_OVERRIDE_OFF, при покрытии сенсора и при повторной привязке я устанавливаю screenBrightness на BRIGHTNESS_OVERRIDE_FULL и / или BRIGHTNESS_OVER, / или BRIGHTNESS_OVERэто не включало экран.Поэтому обходным путем было сделать черную раскладку, которая по умолчанию установлена ​​невидимой, чтобы она была видимой и занимала весь экран.

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 31 января 2012

Я полагаю, что ваша программа - это действие, которое запускается "на экране"?

Я не очень разбираюсь в этом предмете, но на основании некоторого текста, который я прочитал на Android, я думаю, что Android делает паузу /закрывает приложения, когда экран гаснет.

Либо вы должны предотвратить эту паузу, либо запустить приложение в фоновом режиме.Но я не знаю, могут ли службы читать sensora таким же образом.

Я не уверен, что этот «ответ» действительно поможет вам, но вы можете получить представление о том, что искать.

...