【问题标题】:iSight Ambient SensoriSight 环境传感器
【发布时间】:2012-04-21 02:34:11
【问题描述】:

我意识到没有任何关于使用 isight 光传感器的公开文档,但是诸如 ShadowBook (shown here) 之类的程序能够访问亮度数据,我只是想知道是否有人能够实现类似的结果并知道如何访问此传感器?谢谢!

【问题讨论】:

    标签: objective-c xcode macos cocoa isight


    【解决方案1】:

    您可以通过 IOKit 库中的 IOService 访问光传感器。光传感器的名称是“AppleLMUController”。这是一个很好的例子:light sensor。 简单来说,获取这样的服务:io_service_t service = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("AppleLMUController")); 然后,使用以下命令连接到服务:

    io_connect_t port = 0;
    IOServiceOpen(service, mach_task_self(), 0, &port);
    

    使用以下命令获取光照水平:IOConnectMethodScalarIScalarO(port, 0, 0, 2, &left, &right); 其中leftright 是现在保存传感器光照水平的整数。 请注意,许多 IOService 方法返回一个 kern_return_t 变量,该变量将保存 KERN_SUCCESS,除非该方法失败。还要确保使用IOObjectRelease(service);释放服务对象

    编辑:再想一想,IOConnectMethodScalarIScalarO() 似乎已被弃用。 相反,使用:

    uint32_t outputs = 2;
    uint64_t values[outputs];
    
    IOConnectCallMethod(port, 0, nil, 0, nil, 0, values , &outputs, nil, 0);
    

    左值和右值将分别存储在values[0]values[1] 中。请注意,并非所有 MacBook 都以这种方式工作:在我的 2010 年中期 15'' pro 上,这两个值是相同的,因为光传感器位于 iSight 摄像头中。

    【讨论】:

    • 我将如何返回这些值的日志? NSLog(@"right %f", values);?我将如何格式化左/右?
    • 另一个快速的问题,它似乎在我的应用程序启动时被调用一次,但我怎样才能不断地调用它?尝试使用计时器来调用该方法,但它没有更新值
    • 要记录,NSLog(@"Left:%i, Right:%i", (int)values[0], (int)values[1]); 就足够了。我认为使用values 作为数组将解决您的数字不更新问题。如果没有,我可以给你发一个我做的简单例子。
    • 日志现在可以正常工作了,谢谢,但是如果你已经有了它不会太麻烦,如果你能把它压缩给我,那将有很大的帮助。 grant@wilkinson-family.com 非常感谢!
    • 非常感谢您发布代码!。这段代码也适用于 iOS 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多