2010-06-10 60 views
11

我的应用允许用户访问他们的企业语音邮件。通常,当用户将设备放在耳边时,通过拨打电话屏幕会关闭,这样他们就不会不小心按下脸部按钮。我想让我的应用在用户收听他们的语音邮件时也做同样的事情。android:在接近脸部时关闭屏幕

任何人都知道如何做到这一点?

回答

3

您所看到的是使用接近传感器。对于有设备的设备,您可以通过SensorManager进行访问。

+0

是的,我正在调查,但我很难搞清楚实际的实施。你有没有看过如何使用它的例子? – mtmurdock 2010-06-11 00:27:54

+0

@mtmurdock:不,对不起,没有见过。我只知道那是传感器。 – CommonsWare 2010-06-11 00:37:35

20

如果您可以查看开源代码而不会导致您的问题,请检查Android Phone Application的来源。具体为src/com/android/phone/PhoneApp.javasrc/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; 

如果您不害怕使用潜在的未记录功能,它应该按照您的需要进行操作。

+0

这是很多通过筛选...我害怕我无法找到很多,除非你可以指点我一些更具体的部分 – mtmurdock 2010-06-10 22:29:40

+0

在那里,全部信息 - 不希望以前的情况下信息从开源代码会导致一个问题。 – Dre 2010-06-10 23:08:14

+0

该代码中有私有API。 – Taranfx 2012-10-06 13:18:58

4

为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

+1

尽管它表示API级别21是必需的,但它似乎是向后兼容的,因为该标志总是在那里,只是隐藏起来。 – kotucz 2016-02-16 15:33:28