2012/03/11

NFCカードを見つけてACTION_TAG_DISCOVEREDを投げるまで

さて、android-x86にポーリングするしくみを作ろう。
自分のメモ代わりに書いているので、断片的になってしまうが許しておくれ。


ポーリング周期は、こちらを見る限りでは400ms周期。
http://bs-power-save-project.blogspot.com/2011/11/nfconoff.html

ソースを400とかでgrepしたが、出てこず・・・。
discoverに関する設定を見ると、Durationという変数があった。
コメントを読む限りでは、PN544が48ms単位で自動的に回してくれるような気がする。
深く追うのはやめて、適当にAndroid側で周期的なポーリングを行うことにしよう。

Androidは詳しくないのだが、AsyncTaskとかHandlerとか、そんなのを使うみたいだ。
UIは絡まないので、Handlerでいいんじゃないかな?
判断基準がまだわかってない。


そもそも、ポーリングだけすればいいと言うものではない。
ポーリングして、カードがなければすぐに寝ないと。
そしてカードがあったら、通知しないと。

どうやって通知するんだろう?

Interface誌2012/4月号を読むと、

ということでいいのかな?
NDEFが一番条件が厳しく、その次がTECH、なんでもありがTAGというところか。
if(NDEF) - else if(TECH) - elseというイメージでいよう。


最終的なインテントを投げるのは、NfcDispatcher.javaみたいだ。
dispatchTagInternal()が投げている。
たどっていくと、NfcServiceHandlerが元になるようだ。

mNfcDispatcher.dispatchTag()がNfcDispatcherの入り口。
NfcServiceHandlerがメッセージを受け取り、

  • MSG_MOCK_NDEF:NdefMessageを作ってdispatchTag()を呼ぶ
  • MSG_NDEF_TAG:NDEFがあるならそれを、なければnullでdispatchTag()を呼ぶ

とするみたい。
そして、MSG_MOCK_NDEFだのMSG_NDEF_TAGだのは、DeviceHostListenerをimplementsしているNfcServiceがonRemoteEndpointDiscovered()みたいな関数で持っている。
自分で用意するNativeNfcManagerのコンストラクタでNfcServiceはもらうことができるので、検出したらonRemoteEndpointDiscovered()とかを呼んでやればいい。

 

だと思う。


このあたりをごそごそといじると・・・

定期的にポーリングするようになった。
カードをかざすと、NfcServiceが落ちるようなので、とりあえず何か動いていそうなことはわかった。

いいんだか悪いんだか・・・。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。