我的应用允许用户访问其公司语音邮件。通常,在电话通话期间,当用户将设备靠近耳朵时,屏幕会关闭,以免意外触碰面部按键。我希望在用户收听语音邮件时,我的应用也能做到同样的事情。
有人知道如何实现吗?
从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);
}
}
/**
* 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;
}
}
那么现在轮到你获取和释放锁了。
附注: PowerManager#getSupportedWakeLockFlags
已经被隐藏,不再存在。他们发明了 isWakeLockLevelSupported
来代替。
powerManager
是什么? - behelit也许你已经不需要了,但对于那些对代码感兴趣的人来说,你可以看一下我的SpeakerProximity项目,网址是http://code.google.com/p/speakerproximity/
SensorManager
进行访问。
getSupportedWakeLockFlags
已经不存在了,您需要使用isWakeLockLevelSupported
方法。参考链接:http://grepcode.com/file_/repository.grepcode.com/java/ext/com.google.android/android/4.2.1_r1.2/android/os/PowerManager.java/?v=diff&id2=4.1.2_r1 - Muzikant