【问题标题】:android: turn off screen when close to faceandroid:靠近脸时关闭屏幕
【发布时间】:2017-05-19 04:06:22
【问题描述】:

我的应用允许用户访问他们的公司语音邮件。通常,在打电话时,当用户将设备放在耳边时,屏幕会关闭,这样他们就不会不小心用脸按下按钮。我想让我的应用在用户收听他们的语音邮件时做同样的事情。

有人知道怎么做吗?

【问题讨论】:

    标签: android screen


    【解决方案1】:

    如果允许您查看开源代码而不会给自己造成问题,请检查Android Phone Application 的来源。特别是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);
      }
    }
    

    此外,如果您查看 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;
    

    如果您不害怕使用潜在的未记录功能,它应该完全满足您的需要。

    【讨论】:

    • 要筛选的东西太多了……恐怕我在那里找不到很多东西,除非你能指出一些更具体的部分
    • 这里,添加了完整的信息——以前不想这样,以防开源代码中的信息会导致问题。
    • 请注意,在 Android 4.2.1 中,getSupportedWakeLockFlags 方法不再存在,您需要使用 isWakeLockLevelSupportedgrepcode.com/file_/repository.grepcode.com/java/ext/…
    • PROXIMITY_SCREEN_OFF_WAKE_LOCK 从 API 级别 21 (Lollipop) 开始公开。
    【解决方案2】:

    从 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

    【讨论】:

    【解决方案3】:

    您可能不再需要它,但对于那些对代码感兴趣的人,您可以查看我的 SpeakerProximity 项目http://code.google.com/p/speakerproximity/

    【讨论】:

      【解决方案4】:

      您看到的是接近传感器的使用。对于拥有一台的设备,您可以通过SensorManager 访问它。

      【讨论】:

      • 是的,我正在研究,但我无法弄清楚实际的实现。你看过任何使用它的例子吗?
      • @mtmurdock:不,抱歉,还没有看到。我只知道那是有问题的传感器。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多