最近我的HTC Desire S 挂断电话有时屏幕无法唤醒。查了一下是proximity sensor的问题。当远离sensor是没有中断,就是只有near的中断,没有far的中断。
这个是硬件问题,我又不想换sensor,所以就查了一下代码。
见下面这段,注释写的很明白,会等到用户把手机从头部拿开后才release wakelock。但sensor并不会发出far 的中断,所以会一直等下去,屏就不亮了。
改也很简单,直接改为0。
但这种改法需要有源码,好在CM的ROM也不错,就先用着了。 以后或许可以尝试下反编译或者用反射看看行不行。
PhoneApp
updateProximitySensorMode
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 = 0;//hnmsky
//(screenOnImmediately ? 0 : PowerManager.WAIT_FOR_PROXIMITY_NEGATIVE);
mProximityWakeLock.release(flags);
后面这些是调用流程,做个备份。
PowerManagerSevice
releaseWakeLockLocked
if (isScreenLock(wl.flags)) {
if ((wl.flags & LOCK_MASK) == PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK) {
mProximityWakeLockCount--;
if (mProximityWakeLockCount == 0) {
if (mProximitySensorActive &&
((flags & PowerManager.WAIT_FOR_PROXIMITY_NEGATIVE) != 0)) {
// wait for proximity sensor to go negative before disabling sensor
if (mDebugProximitySensor) {
Slog.d(TAG, "waiting for proximity sensor to go negative");
}
} else {
disableProximityLockLocked();
}
}
}
SensorManager
unregisterListener
sensors_enable_sensor
android_hardware_SensorManager.cpp
sensors_enable_sensor
SensorDevice
activate