android: turn off screen when close to face

匿名 (未验证) 提交于 2019-12-03 03:02:02

问题:

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 accidentally push buttons with their face. I would like to make my app do the same thing when the user is listening to their voice mail.

anyone know how to do this?

回答1:

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



回答2:

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.



回答3:

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.



回答4:

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/



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!