Android: apagar la pantalla cuando está cerca de la cara
Mi aplicación permite al usuario acceder a su correo de voz corporativo. Normalmente, durante una llamada telefónica cuando el usuario tiene el dispositivo hasta el oído, la pantalla se apaga para que no accidentalmente empujar los botones con su cara. Me gustaría hacer que mi aplicación haga lo mismo cuando el usuario está escuchando su correo de voz.
¿Alguien sabe cómo hacer esto?
- Cómo crear una pantalla deslizante (como en Tweetdeck) en Android?
- Camino a capturas de pantalla en Android
- ¿Cómo diferenciar el diseño para 480 * 800 y 480 * 854 resoluciones de pantalla en android?
- Tamaños de imagen de Android
- ¿Cómo obtener la densidad de una pantalla?
- Emulador de Android muestra la pantalla de inicio invertida reflejada y bloqueada (¿por qué?)
- ¿Cómo mostrar la actividad cuando la pantalla está bloqueada?
- Pantalla de bloqueo personalizada para Android
- Cómo evitar la captura de pantalla en Android
- ¿Cómo obtener el tamaño de pantalla del dispositivo?
- ¿Cómo puedo responder a una aplicación web de pantalla de inicio de cromo?
- Android: ¿Cómo obtener información si la pantalla pasa al modo de atenuación?
- Android, mdpi densidad pero diferentes pantallas
Lo que está viendo es el uso de un sensor de proximidad. Para los dispositivos que tienen uno, se accede a través de SensorManager
.
Si se le permite ver el código fuente abierto sin causar problemas, consulte el origen de la aplicación Android Phone . Específicamente src / com / android / phone / PhoneApp.java y src / com / android / phone / InCallScreen.java .
Desde 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); } }
Además, si miras el código de la clase PowerManager, PROXIMITY_SCREEN_OFF_WAKE_LOCK está documentado (pero oculto) y debería hacer lo que quieras (no estoy seguro de para qué nivel de API funciona esto), pero no en la tabla por alguna razón .
/** * 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;
Si no tiene miedo de usar una potencial característica indocumentada, debe hacer exactamente lo que necesita.
A partir del nivel 21 de la API (Lollipop) usted puede conseguir la estela de la proximidad traban esto apenas como eso:
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; } }
Entonces depende de usted para adquirir y liberar la cerradura.
PS: PowerManager#getSupportedWakeLockFlags
estaba oculto, pero ahora existe nomore. Han inventado isWakeLockLevelSupported
en isWakeLockLevelSupported
lugar.
Probablemente ya no lo necesitas, pero para los que están interesados en el código puedes echar un vistazo a mi proyecto SpeakerProximity en http://code.google.com/p/speakerproximity/
- No se pudo resolver resource @ style / Widget.Holo.Light.ActionMode.Inverse
- Enrutamiento de eventos con GreenBob EventBus