2012-04-08 6 views
6

isight光センサーの使用に関するパブリックな文書はありませんが、ShadowBook (shown here)などのプログラムは輝度データにアクセスできます。同様の結果とこのセンサーにアクセスする方法を知っていますか?ありがとう!iSightアンビエントセンサー

答えて

7

IOServiceを使用して光センサにアクセスするには、IOKitライブラリを使用します。光センサーの名前は "AppleLMUController"です。ここには良い例があります:light sensor。簡単に言えば 、このようなサービスを得る:使用してサービスに接続し、その後io_service_t service = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("AppleLMUController")); を:

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

は、使用して光のレベルを取得します:leftrightは今センサの光レベルを保持する整数ですIOConnectMethodScalarIScalarO(port, 0, 0, 2, &left, &right); 。 メソッドが失敗しない限り、多くのIOServiceメソッドはkern_return_t変数を返します。これはKERN_SUCCESSを保持します。 IOObjectRelease(service);

EDIT: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(@"正しい%f "、値);'?どのように左/右をフォーマットするのですか? –

+0

もう少し簡単な質問ですが、アプリケーションの起動時に一度呼び出されたようですが、どうすれば継続的に呼び出すことができますか?タイマーを使用してメソッドを呼び出そうとしましたが、値を更新しませんでした –

+1

NSLog(@ "Left:%i、Right:%i"、(int)values [0]、(int)values [1] ); 'で十分だろう。私は 'values'を配列として使うと、更新していない数字に問題が解決すると思います。そうでない場合は、私が作った簡単な例をお送りします。 – wquist

関連する問題