2012-04-08 38 views
6

我意識到沒有任何關於使用isight光線傳感器的公開文檔,但ShadowBook (shown here)等程序能夠訪問亮度數據,我只是想知道是否有人能夠實現類似的結果,並知道如何訪問這個傳感器?謝謝!iSight環境傳感器

回答

7

您可以從IOKit庫訪問IOService的光傳感器。光傳感器的名稱是「AppleLMUController」。這是一個很好的例子:light sensor。 簡單地說,得到這樣的服務:io_service_t service = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("AppleLMUController")); 然後,使用連接到服務:IOConnectMethodScalarIScalarO(port, 0, 0, 2, &left, &right);leftright是,現在抱傳感器的光線水平的整數:

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

利用獲取的光照水平。 請注意,許多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英寸專業版中,兩個值都相同,因爲光線傳感器位於iSight相機中。

+0

我將如何返回這些值的日誌? NSLog(@「right%f」,values);'?我將如何格式化左/右? – 2012-04-10 04:13:08

+0

還有一個簡單的問題,當我的應用程序啓動時,它似乎被調用一次,但我怎樣才能不斷地調用它?試圖使用一個計時器來調用該方法,但它不更新值 – 2012-04-10 04:24:21

+1

要記錄,NSLog(@「Left:%i,Right:%i」,(int)values [0],(int)values [1] );'就足夠了。我認爲使用'values'作爲數組可以解決您的問題,而數字不會更新。如果沒有,我可以給你發一個我做的快速例子。 – wquist 2012-04-10 20:03:56