android:在接近脸部时关闭屏幕
我的应用允许用户访问他们的企业语音邮件。通常,当用户将设备放在耳边时,通过拨打电话屏幕会关闭,这样他们就不会不小心按下脸部按钮。我想让我的应用在用户收听他们的语音邮件时也做同样的事情。android:在接近脸部时关闭屏幕
任何人都知道如何做到这一点?
如果您可以查看开源代码而不会导致您的问题,请检查Android Phone Application的来源。具体为src/com/android/phone/PhoneApp.java和src/com/android/phone/InCallScreen.java。
从SRC/COM /安卓/电话/ 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);
}
}
此外,如果你看一下在电源管理器类的代码,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;
如果您不害怕使用潜在的未记录功能,它应该按照您的需要进行操作。
为API级别21(棒棒堂),你可以得到接近唤醒锁这就像这样:
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;
}
}
那么它是由你来获得和释放锁。
PS:PowerManager#getSupportedWakeLockFlags
已被隐藏,但现在存在nomore。相反,他们发明了isWakeLockLevelSupported
。
尽管它表示API级别21是必需的,但它似乎是向后兼容的,因为该标志总是在那里,只是隐藏起来。 – kotucz 2016-02-16 15:33:28
是的,我正在调查,但我很难搞清楚实际的实施。你有没有看过如何使用它的例子? – mtmurdock 2010-06-11 00:27:54
@mtmurdock:不,对不起,没有见过。我只知道那是传感器。 – CommonsWare 2010-06-11 00:37:35