android:靠近脸部时关闭屏幕

mtm*_*ock 16 android screen

我的应用程序允许用户访问他们的公司语音邮件.通常,当用户将设备握在耳边时,在通话时,屏幕会关闭,因此他们不会意外地按下按钮.当用户正在收听语音邮件时,我想让我的应用程序做同样的事情.

有人知道怎么做吗?

Dre*_*Dre 26

如果允许您查看开源代码而不会导致自己出现问题,请检查Android Phone应用程序的来源.特别是src/com/android/phone/PhoneApp.javasrc/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);
  }
}
Run Code Online (Sandbox Code Playgroud)

此外,如果您查看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;
Run Code Online (Sandbox Code Playgroud)

如果您不害怕使用潜在的无证功能,它应该完全符合您的需求.

  • 请注意,对于Android 4.2.1,方法`getSupportedWakeLockFlags`不再存在,您需要使用`isWakeLockLevelSupported`.http://grepcode.com/file_/repository.grepcode.com/java/ext/com.google.android/android/4.2.1_r1.2/android/os/PowerManager.java/?v=diff&id2=4.1.2_r1 (3认同)
  • `PROXIMITY_SCREEN_OFF_WAKE_LOCK`自API级别21(Lollipop)开始公开. (2认同)

gun*_*ess 5

从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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后由您来获取和释放锁。

PS: PowerManager#getSupportedWakeLockFlags隐藏了,但现在不复存在了。他们发明了isWakeLockLevelSupported

  • 即使说需要API级别21,它也似乎是向后兼容的,因为该标志始终存在,只是被隐藏了。 (2认同)

Com*_*are 2

您所看到的是接近传感器的使用。对于具有该功能的设备,您可以通过 访问它SensorManager