android: turn off screen when close to face

后端 未结 4 1121
情书的邮戳
情书的邮戳 2020-12-01 02:39

My app allows the user to access their corporate voice mail. Normally, durring a phone call when the user holds the device up to their ear, the screen shuts off so they wont

相关标签:
4条回答
  • 2020-12-01 02:45

    What you are seeing is the use of a proximity sensor. For devices that have one, you access it through SensorManager.

    0 讨论(0)
  • 2020-12-01 02:59

    Probably you don't need it anymore but for the ones that are interested in code you could have a look at my SpeakerProximity project at http://code.google.com/p/speakerproximity/

    0 讨论(0)
  • 2020-12-01 03:05

    If you are allowed to look at open source code without causing yourself problems, check the source of the Android Phone Application. Specifically src/com/android/phone/PhoneApp.java and src/com/android/phone/InCallScreen.java.

    From 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);
      }
    }
    

    Additionally, if you look at the code for the PowerManager class, PROXIMITY_SCREEN_OFF_WAKE_LOCK is documented (but hidden) and should do what you want ( I am not sure which API level this works for, however ) -- but not in the table for some reason.

    /**
     * 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;
    

    If you aren't afraid of using a potential undocumented feature, it should do exactly what you need.

    0 讨论(0)
  • 2020-12-01 03:10

    as of API level 21 (Lollipop) you can get proximity wake lock this just like that:

    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;
        }
    }
    

    then it is up to you to acquire and release the lock.

    PS: PowerManager#getSupportedWakeLockFlags was hidden, but now exists nomore. They have invented isWakeLockLevelSupported instead.

    0 讨论(0)
提交回复
热议问题