当用户将手机靠近他/她的耳朵时,在我的活动中禁用UI?

时间:2011-11-03 22:43:03

标签: android

当用户将手机靠近他/她的耳朵时,如何禁用我的活动用户界面?

我知道当有一个传感器来测试Proximity时,有一个API可以回调:

http://developer.android.com/reference/android/hardware/Sensor.html

http://developer.android.com/reference/android/hardware/SensorManager.html

但是如何禁用用户界面(例如用户的脸部不会错误地触摸用户界面),然后在手机远离用户脸部时重新启用?

谢谢。

2 个答案:

答案 0 :(得分:0)

我可以想到几个方面:

你可以打电话

view.setClickable(false);

在所有UI元素上。我不确定,但你可能只能在你的顶层父布局上调用它,这可能会有效。

您可以使用

将布局设置为不可见
yourParentLayout.setVisibility(View.INVISIBLE);

会隐藏所有可能无法点击的UI元素。

其中一个可能是我认为最好的选择。您可以使用非公共API关闭并打开可以找到它们的屏幕,如果您在此处搜索以打开/关闭的方式打开屏幕。

我还建议如果您想要并且有时间查找并查看处理电话呼叫的应用程序的源代码,它会有您正在寻找的行为,因此您可能会使用类似的方法(尽管我没有看过这个来源,因此他们可能会使用非公共API关闭并打开屏幕。)

在手机移开后恢复您的视图时,您只需在onSensorChanged()方法中添加一个检查,检查接近传感器是否不再感应到近距离物体。如果不是,则撤消上面使用的任何方法,使您的视图无法点击。

答案 1 :(得分:0)

您可以查看AOSP的PhoneAppInCallScreen源代码,了解如何做您想做的事情。以下是要点:

  • 在支持它的设备上,AOSP代码使用隐藏的PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK根据需要关闭触摸屏(请参阅PhoneApp.updateProximitySensorMode()方法)。
  • 在其他设备上,方法是使用“触摸锁定”覆盖(简单地显示/隐藏覆盖整个屏幕的视图,这将消耗触摸事件)。请参阅initTouchLock()来源中的enableTouchLock()onTouch()InCallScreen方法(主要涉及mTouchLockOverlay的代码)。

我建议使用叠加方法,因为它适用于所有设备。

根据您的UI层次结构,与切换普通用户界面的触摸和可见性状态相比,使用叠加层也可能更好,因为它更容易实现,您可以非常轻松地添加一些视觉反馈(可能是调光/动画?)显示叠加层。