私も、AndroidのNFC reader modeサンプルを作った。
hirokuma/AndroidReaderSample
まねしたつもりはないのだが、前回参考にしたサイトと同じような内容になってしまった。
androhi/NFCReaderModeSample: NdefAdapter.ReaderCallbackのサンプル
まあ、API呼んで、コールバックされるだけなので、IDを取得するだけであれば、そんなに差が出ないだろう。
Nexus5で動かしているのだが、普通のタグ(HCEじゃないやつ)は読めるのだが、Android BeamしているNexus7をかざすとNFC機能自体がおかしくなるのか、普通のタグも読めなくなってしまう。
時間が経てばよくなるわけでも無く、一度Reader modeをdisable-->enableさせないと動かないようだった。
うーん・・・・・・・。
ただ、AndroidのCardReaderサンプルは、そういうことが起きていないような気がする。
私のアプリだと、AndroidのCardEmulationサンプルにかざすとNFCタグが読めなくなるのだが、CardReaderサンプルでは何かしているのだ。
面倒だが、サンプルが何をしているか調べるか。
まずは、CardEmulationから。
AndroidManifest.xmlの<service>で、HOST_APDU_SErVICEやxmlでAIDリストの指定をしている。
Activityでは、AccountUpdateというクラスが文字入力の監視と、変更時にHCEが返す値の更新なんかをやっているのだろう。
CardServiceがHCE動作をしている。
processCommandApdu()が入り口になっていて、SELECT FILEで自分のAIDが指定されていれば処理して、そうでなければ処理しない、というだけのようだ。
では、CardReaderを見ていく。
AndroidManifest.xmlで<intent-filter>が設定されている。
「Filtering for NFC Intents」によると、NFCタグをかざされたときに自アプリを起動される対象として選んでほしいときにつけるようだ。
優先度を読み解く図があったように思うが、今回は関係ないのでよかろう。
ActivityでReader modeを有効にしているのは、ここ。
対象はNFC-Aで、NDEFチェックをしないようにしている。
処理本体は、LoyaltyCardReader。
うーん?
私のReader modeサンプルがAndroid Beamを受けると動かなくなるというほどの違いはなさそうだが。。。
あ、CardReaderサンプルでenableReaderMode()に与えるフラグにNfcAdapter.FLAG_READER_NFC_Fを追加したら同じ動作になった!
これって、何らかのバグじゃなかろうか。。。
HCEしている方には、こういうログが出た。
E/BrcmNfcNfa: llcp_link_activate (): Failed to parse general bytes
そのあとで「--------- beginning of system」と出ている。
Reader側はかざしたときのログは出ないが「beginning of system」のログは出ている。
確か、このログはserviceが起動しているときに出るような気がするので、もしかしたらNfcServiceなどが再起動しているのかもしれない。
FLAG_READER_NFC_Fを追加しても、ちゃんとNFC-Fのタグは読めるのだ。
単に、LLCPを受けるとうまくいかない、というだけである。
そういえば、AndroidのLLCPはNFC-Fでやっていたような気がするので、そこら辺が影響しているのかも。
うちにはNexus5と7しか端末がないが、どちらもBroadcomのチップだったように思う。
だから、Android側なのかドライバ側なのかは切り分けができんな。
とりあえずの回避策は、HCEのタグを読みたくてenableReaderMode()を使うのであれば、相手がNFC-Fになることは(Android6までは)ないので、FLAG_READER_NFC_Fは付けないようにする、だろう。
Android7ではHCE-Fがあるらしいから、さすがに直っているのかもしれんが、じゃあReader modeになる方もAndroid 7じゃないといけないのか?という疑問が出てくる。
が、うちにはAndroid7が使える端末がないので、確認できんな。
ひとまず、githubに置いておくサンプルからは、NFC-Fを外しておこう。
https://github.com/hirokuma/AndroidReaderSample
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。