Мое приложение позволяет пользователю получать доступ к их корпоративной голосовой почте. Обычно, во время телефонного вызова, когда пользователь держит устройство до их уха, экран отключает так их привычка случайно кнопки с их поверхностью. Я хотел бы заставить свое приложение сделать то же самое, когда пользователь слушает их голосовую почту.
кто-либо знает, как сделать это?
То, что вы видите, - это использование датчика приближения. Для устройств, имеющих такой датчик, доступ к нему осуществляется через SensorManager
.
Если вам разрешено смотреть на открытый исходный код, не создавая себе проблем, проверьте исходный код Android Phone Application. А именно src/com/android/phone/PhoneApp.java и src/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;
Если вы не боитесь использовать потенциальную недокументированную возможность, это должно делать именно то, что вам нужно.