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?

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/

  • Obtener una lista de todos los lanzadores en Android
  • Cómo evitar reiniciar la actividad cuando cambia la orientación en Android
  • ¿Cómo desactivar la rotación en modo horizontal?
  • Tamaño de fondo de la imagen de la actividad de Android
  • Android WallpaperManager cosecha la imagen
  • Detectar sólo captura de pantalla con FileObserver Android
  • Cómo tomar una instantánea de la aplicación de pantalla no sólo en Android con código
  • Alternativa a addPreferencesFromResource ya que está obsoleta
  • Método RingtonePreference getEntry
  • ¿La mejor manera de tener una pantalla de bienvenida en una aplicación de Android?
  • Android obtiene la altura y el ancho de la pantalla del dispositivo para todas las resoluciones
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.