我的应用程序允许用户访问他们的公司语音邮件.通常,当用户将设备握在耳边时,在通话时,屏幕会关闭,因此他们不会意外地按下按钮.当用户正在收听语音邮件时,我想让我的应用程序做同样的事情.
有人知道怎么做吗?
Dre*_*Dre 26
如果允许您查看开源代码而不会导致自己出现问题,请检查Android Phone应用程序的来源.特别是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);
}
}
Run Code Online (Sandbox Code Playgroud)
此外,如果您查看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;
Run Code Online (Sandbox Code Playgroud)
如果您不害怕使用潜在的无证功能,它应该完全符合您的需求.
从API级别21(Lollipop)开始,您可以像这样获得接近唤醒锁:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后由您来获取和释放锁。
PS: PowerManager#getSupportedWakeLockFlags隐藏了,但现在不复存在了。他们发明了isWakeLockLevelSupported。
| 归档时间: |
|
| 查看次数: |
24118 次 |
| 最近记录: |