Android: выключить экран, когда близко к лицу - PullRequest
14 голосов
/ 11 июня 2010

Мое приложение позволяет пользователю получить доступ к корпоративной голосовой почте. Обычно во время телефонного звонка, когда пользователь подносит устройство к уху, экран отключается, поэтому они не будут случайно нажимать кнопки на лице. Я хотел бы, чтобы мое приложение делало то же самое, когда пользователь слушает их голосовую почту.

Кто-нибудь знает, как это сделать?

Ответы [ 4 ]

25 голосов
/ 11 июня 2010

Если вам разрешено просматривать открытый исходный код без каких-либо проблем, проверьте исходный код приложения для телефона Android . В частности src / com / android / phone / PhoneApp.java и src / com / android / phone / InCallScreen.java .

От src / com / android / phone / PhoneApp.java:

 //Around line 519
 // Wake lock used to control proximity sensor behavior.
 if ((pm.getSupportedWakeLockFlags()
          & PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK) != 0x0) {
     mProximityWakeLock = pm.newWakeLock(
         PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK,
         LOG_TAG);
 }

 ....
// Around line 1334
if (((state == Phone.State.OFFHOOK) || mBeginningCall)&& !screenOnImmediately) {
  // Phone is in use!  Arrange for the screen to turn off
  // automatically when the sensor detects a close object.
  if (!mProximityWakeLock.isHeld()) {
      if (DBG) Log.d(LOG_TAG, "updateProximitySensorMode: acquiring...");
      mProximityWakeLock.acquire();
  } else {
      if (VDBG) Log.d(LOG_TAG, "updateProximitySensorMode: lock already held.");
  }
} else {
  // Phone is either idle, or ringing.  We don't want any
  // special proximity sensor behavior in either case.
  if (mProximityWakeLock.isHeld()) {
    if (DBG) Log.d(LOG_TAG, "updateProximitySensorMode: releasing...");
    // Wait until user has moved the phone away from his head if we are
    // releasing due to the phone call ending.
    // Qtherwise, turn screen on immediately
    int flags =
        (screenOnImmediately ? 0 : PowerManager.WAIT_FOR_PROXIMITY_NEGATIVE);
    mProximityWakeLock.release(flags);
  }
}

Кроме того, если вы посмотрите на код для класса PowerManager, PROXIMITY_SCREEN_OFF_WAKE_LOCK задокументирован (но скрыт) и должен делать то, что вы хотите (однако я не уверен, для какого уровня API это работает) - но не в таблице по какой-то причине.

/**
 * Wake lock that turns the screen off when the proximity sensor activates.
 * Since not all devices have proximity sensors, use
 * {@link #getSupportedWakeLockFlags() getSupportedWakeLockFlags()} to determine if
 * this wake lock mode is supported.
 *
 * {@hide}
 */
public static final int PROXIMITY_SCREEN_OFF_WAKE_LOCK = WAKE_BIT_PROXIMITY_SCREEN_OFF;

Если вы не боитесь использовать потенциальную недокументированную функцию, она должна делать именно то, что вам нужно.

5 голосов
/ 26 августа 2015

Начиная с уровня API 21 (Lollipop), вы можете получить блокировку от пробуждения, вот так:

if(powerManager.isWakeLockLevelSupported(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK)) {
        PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, TAG);
        wakeLock.setReferenceCounted(false);
        return wakeLock;
    } else {
        return null;
    }
}

, тогда вы можете приобрести и снять блокировку.PS: PowerManager#getSupportedWakeLockFlags был спрятан, но теперь существует больше.Вместо этого они изобрели isWakeLockLevelSupported.

2 голосов
/ 14 октября 2010

Возможно, вам это больше не нужно, но для тех, кто интересуется кодом, вы можете взглянуть на мой проект SpeakerProximity по адресу http://code.google.com/p/speakerproximity/

2 голосов
/ 11 июня 2010

То, что вы видите, это использование датчика приближения. Для устройств, которые имеют один, вы получаете доступ к нему через SensorManager.

...