iPhone接近传感器

20

iPhone的SDK是否可以利用iPhone的距离传感器?如果可以,为什么没有人利用它们呢?我想到了一些不错的用途。

例如,在赛车游戏中,您可以将手指放在接近传感器上,而不是使用拇指占用屏幕空间。当然,如果这是您唯一的选择,那么iPod touch用户将无法使用该应用程序。

接近传感器只能告诉您是否有物体在其前面,而不能告诉您物体与传感器的距离有多远。


在触摸屏设备上,如何在没有接近传感器的情况下实现鼠标悬停? - volatilevoid
13个回答

33

这个有公共API可以使用。-[UIApplication setProximitySensingEnabled:(BOOL)]将启用此功能。顺便说一下,它似乎并没有使用光传感器,因为在黑暗的房间中,接近传感会出现问题。

然而,该API调用基本上会在你把手机靠近脸时使屏幕变空白。遗憾的是,对于交互来说没有用处。


3
玩一局藏猫猫游戏怎么样? :) - Robert Gould
2
UIApplication方法已被弃用。在3.0中,您可以使用以下方法启用它: [[UIDevice currentDevice] setProximityMonitoringEnabled:YES];此外,还可以检查属性proximityState,因此如果您轮询该值,则可以将其作为原始输入方法。 - Jason Moore
在这个问题被提出的时候,没有公共API;我已经更新了我的答案(被接受的答案)以反映这一变化。 - benzado
1
实际上,不需要轮询proximityState的值。只需观察通知:UIDeviceProximityStateDidChangeNotification - Jason Moore

17

假设你指的是当你将手机贴近耳朵时关闭屏幕的传感器,我相信那只是位于耳麦扬声器内部的红外线传感器。如果你启动电话应用程序(不必进行通话),并将某些东西放在耳麦上形成阴影,那么你就可以使显示器关闭。

当你提出这个问题时,它无法通过公共API访问。现在,你可以通过UIDevice的proximityState属性访问传感器的状态。但是,对于游戏来说并没有太大用处,因为它只是一个开关,而不是近距离/远距离的测量。此外,它只在iPhone上可用,而不是iPod touch。


1
iPod touch实际上确实有光线传感器。在我的设备上,我可以看到它位于屏幕上方左上角,在阳光直射下非常明显。屏幕亮度可以根据环境光线条件自动调整。 - Chris Lundie
呃...我没有说iPod没有环境光传感器。我们正在讨论的是距离传感器,据我所知它是通过检测光来实现的。 - benzado
哦,所以在iPhone中有两个不同的传感器? - Chris Lundie
如果这是一个光传感器,那么在暗房间接电话时显示屏会熄灭吗? - Dipak Patel
3
从技术上讲,这是不准确的。手机内置了光传感器来自动调节屏幕亮度,并且有第二个红外LED/传感器对来检测你脸部的距离。 (将一张白纸片举在手机扬声器末端一两英寸处会触发近距离传感器,但在黑暗的房间里显示仍然可以工作。) - Brendan Berg

8
显然,如果状态栏处于横向方向,则接近传感器永远不会开启。 例如,如果您调用:
[UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationLandscapeLeft;

您将不再收到“proximity:ON”通知。
这绝对发生在OS 3.0上,我无法在2.X设备上进行测试,因为我没有带有接近传感器的设备。
这似乎是一个错误。

5
只是更新一下,这是可能的。
device = [UIDevice currentDevice];

// Turn on proximity monitoring
[device setProximityMonitoringEnabled:YES];

// To determine if proximity monitoring is available, attempt to enable it.
// If the value of the proximityMonitoringEnabled property remains NO, proximity
// monitoring is not available.

// Detect whether device supports proximity monitoring
proxySupported = [device isProximityMonitoringEnabled];

// Register for proximity notifications
[notificationCenter addObserver:self selector:@selector(proximityChanged:) name:UIDeviceProximityStateDidChangeNotification object:device];

如benzado所指出的,您可以使用以下方法:
// Returns a BOOL, YES if device is proximate
[device proximityState];

5

接近传感器通过测量红外反射工作。如果你将iPhone靠近网络摄像头,你可以看到一个小的、闪烁的红外LED。


5
有许多人对接近传感器和环境光传感器之间存在混淆。iPhone两者都有。Touch没有接近传感器,因此不适合用户输入。这是个坏主意,因为未来设备中Apple没有义务将其放置在同一位置;您不需要知道或关心它的位置。
接近传感器通过脉冲红外LED并测量反射量来工作。您可以使用iSight相机查看此功能(大多数数字相机都对红外线敏感)。只需启动Photo Booth,在手机上发起通话(或播放语音邮件)并将其对准iSight相机即可。注意听筒旁边的闪光灯;用手指盖住它,屏幕将变黑。
目前,环境光传感器的API显然是私有的。

我不同意接近传感器是基于红外线的说法。我可以用实物,比如笔记本,覆盖手机顶部,但传感器不会触发。然而,如果我用下巴触碰手机顶部,传感器就会被触发。我用通话拨号应用程序测试了这一点。 - Brenden
我建议的实验可以使红外发射器清晰可见,这应该能消除任何疑虑。只有在启用接近传感时才会激活它,例如在通话或播放语音邮件时。我不知道为什么你的记事本无法触发它,但我使用贺卡、记事本和纸巾进行了测试,它成功地工作了。 - David Gish

2

2
在iPhone 3.0中,官方支持接近传感器。请查看文档中的UIDevice proximityMonitoringEnabled

2

这方面暂无公开的API。


2
显然,如果状态栏处于横向方向,则接近传感器永远不会启动。例如,如果您调用: [UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationLandscapeLeft; 您将不再收到接近传感器:ON通知。 这绝对会在OS 3.0上发生,由于我没有带有接近传感器的2.X设备,因此无法进行测试。 这似乎是一个错误。
我也遇到了这个问题。我花了很长时间才找出接近传感器不工作的真正原因。当方向为UIInterfaceOrientationLandscapeLeft或UIInterfaceOrientationLandscapeRight时,接近传感器不起作用;而在纵向模式下,它可以正常工作。我的iPhone是iPhone 4S(iOS SDK 5.0)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接