シェアードオブジェクトの勉強としてGoogleハングアウトアプリで笑顔を認識するアプリを作りました。
笑顔の認識自体は勉強の範囲外だったので、大したロジックではありません。
口角のY座標や上唇と下唇のY座標から笑顔を算出しているだけなので、うなずいたりしてもカウント
されてしまう程度のものです。
アプリの趣旨としては、笑顔を認識して笑顔になった回数をカウントします。
それを参加者でシェアして皆のトータル笑顔数を算出する、というものです。
gapi.hangout
使ったGoogleハングアウトAPIは以下の通りです。
- gapi.hangout.getEnabledParticipants
- gapi.hangout.getLocalParticipant
- gapi.hangout.onAppVisible.add
- gapi.hangout.onParticipantsAdded.add
- gapi.hangout.av.effects.FaceTrackingData
- gapi.hangout.av.effects.onFaceTrackingDataChanged.add
- gapi.hangout.data.onStateChanged.add
- gapi.hangout.data.getKeys
- gapi.hangout.data.getValue
- gapi.hangout.data.submitDelta
- gapi.hangout.data.setValue
このうちgapi.hangout.data系が今回の目的のシェアオブジェクトです。
gapi.hangout.av.effects系は笑顔の認識に使いました。
gapi.hangout.dataの勉強コード
ではコードを記載しておきます。
ちょっと長いですが、重要なのは色がついてる行です。
下記のようにonApiReadyのコールバックとして呼び出します。
gapi.hangout.onApiReady.add(smily());
43行目:gapi.hangout.data.onStateChanged.add(関数)
これが「シェアードオブジェクトに値がセットされたら次の関数を実行する」というイベントリスナー登録です。
うっかりこの中でgapi.hangout.data.submitDeltaやgapi.hangout.data.setValue、gapi.hangout.data.clearValueを実行すると永遠とイベントリスナーが呼び出されてしまうので注意。
104行目: gapi.hangout.data.submitDelta(udpates, removes)
これを実行することで値がシェアードオブジェクトにセットされます。コレの代わりにgapi.hangout.data.setValue(key, value)を利用してもいいのですが、今回は
・「ユーザー別の笑顔」と「合計の笑顔」の2つをシェアードオブジェクトにセットしたかった
・stateChangeEventは1度だけ呼び出したかった
という理由からsubmitDelta関数を利用しました。
setValueで2つ登録すると、stateChangeEventが2回よばれるので、注意してください。
また、setValue(key, value)を使う時に第二引数であるvalueはString型でないとExceptionが吐かれます。
なので、数値を引数に指定する際は
setValue(key, ""+num)
のようにStringに直して、取得する際は
parseInt(getValue(key))
としてStringを数値に戻して利用する必要があります。
Googleハングアウト笑顔認識アプリ
追記 2013/06/02
いまエラー発生しててどんなに素敵に笑っても認識しません。悪いのはあなたの笑顔ではないですm(__)m
追記 2013/06/03
直りました。APIの場所が変わったみたいで、PATHを変えてあげたら動きました。相変わらず笑顔判定は厳し目ですけども。
変更前=//talkgadget.google.com/hangouts//api/hangout.js
変更後=//plus.google.com/hangouts//api/v1/hangout.js