Android‎ > ‎

Android 2.3 GingerBread NFCをやってみる

しゃちょうがNexusSを買ってくれて、本日(12月27日)遂に届いたので早速NFCやってみます!!
12月28日追記しました!!
12月28日@yanzmさんに教えてもらったことを追加しました!!

NFCって何?

NFCっていうのは、Near Feild communication の略です。近距離通信でピッ!ってやると情報をやりとり出来る感じです。
日本で普及しているところだと、Felica(SuicaとかIcocaとかPasmoとかEdyとかnanacoに入ってます)はNFCの上に乗っかってる規格だそうです。

まずはサンプルを動かします!

$ANDROID_HOME/samples/android-9/NFCDemo をどっか適当な場所にコピーして、Eclipseに取り込みます。
Androidプロジェクトを新規作成する手順で、"Create project from existing source"とかでソースを流用してプロジェクトを作る感じでOKです。
そうすると、一部のクラスが名前解決できずにエラーになります。

guava-libraries いれる

足りないクラスは、guavaというライブラリに含まれているそうなので、ダウンロードしてきて突っ込みます。(@t_egg さんありがとう大好き><)
このへんから落とせます。僕が落としたのは guava-r07.zip でした。解答して libs ディレクトリをプロジェクトに掘って guava-r07.jar を突っ込んでビルドパスに追加します。(もう一個のjarはgwtって単語が入ってるので直感で違うと思われたので試しませんでした。)

これで、エラーは全て消えたはずです。

実行してみる!

NexusSにインストールして実行してみます!!
Suicaを近づけてみると…
インストールしたサンプルアプリが選択肢に出現しました!
1秒以内かざすだけでもちゃんと検知してくれるみたいですね。かなり素早いです。

でも特に何かデータが取れるわけでもなく…。

コードを(少しだけ)読む

とりあえずサンプルコードを読んで、何が行われているのか頑張ってみてみようと思います。
まずは定石通りAndroidManifest.xmlから。

AndroidManifest.xml

パーミッション

  • android.permission.NFC
  • android.permission.CALL_PHONE
上記二つがついていますね。電話かけるのとかIntent飛ばせば済む話なのになんでついてるんだろう…?なんかあったっけ?

アクティビティ

ランチャーから起動されるActivityはFakeTagsActivityとなっています。名前からして偽のNFC来ましたよIntentを投げる係の人でしょう。
TagViewerのActivityの方は android.nfc.action.TAG_DISCOVERED がついています。
タグ見つけたぜー!Intentを受ける係のActivityっぽいですね。多分これがメインターゲットのActivityです。

その他

<uses-feature android:name="android.hardware.nfc" android:required="true" /> とかあるのでNFCを触るにはこれが必要っぽいですね。
(12月28日追記) これ特に無くても動くそうです。@yanzmさんに教えていただきました! 先生のYanzmingActionにはいつもお世話になっています!┌○
NFCがオマケ機能的にサポートされているアプリの場合、ない方がよいのですね…。uses-featureってそういうものだったんだ…。

TagViewer.java

Felicaやおサイフケータイを近づけてみると、L70の

intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);

でnullが返ってきてしまっているみたいですね…。

intent.getParcelableArrayExtra(NfcAdapter.EXTRA_ID);

も試してみても同じくnullが返ってきてしまいます…。
(12月28日修正) 下記コードで普通にID取れました…。折角搭載されているのに脳味噌をちゃんと使わなかった結果ですごめんなさい。
intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);

まとめ

おサイフケータイを @eaglesakura に借りて試してみたけど、同じ結果で終わってしまいました…。
今現状では、日本人なら誰もが求めるFelicaさんとのお話をするのは無理そうです…。
API眺めてみてもNfcAdapter以外にアクセスの口はなさそうです。
@hide が指定されて僕達からは見えなくなっているあたりにはRead/Writeの口や近傍のNFCとコネクションを確立するための口があるような気がしないでもないのですが…。うーん。

NFCのR/Wをする機材もしゃちょーが注文してくれたので、年明けにそれを使って再チャレンジの予定。
また何かわかったら書けるように頑張ります!記事の内容が間違ってる!とかこういうのあるよ!という情報があったら、ぜひ教えてください :) ついった

BarAndroidにいったら進展あったよ!(12月28日追記)

BarAndroidにいったら、@zaki50さんがNexusSをふにふにした結果色々発掘してくださいました!
その結果をちょっとまとめて書いておきたいと思います。
  • 今まで
    • Felicaチップを近づけられたら検知できる(識別ID的なモノは取れず区別できなかった)
  • 進展した結果
    • FelicaチップのIDが取れるようになったよ!→勤怠管理システムのリーダにすることが出来る程度
    • Felicaチップか否か判別できるようになったよ!
  • その他
    • Pasmo, おサイフケータイ, Felicaチップ搭載Android端末 は検出出来る
    • NexusSは検出できない
      • NexusSにNexusSを近づけても何も検出できない…!!
intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);
上記コードでFelicaのIDmと思われる値が取れました。

このページに添付してあるTagWrapper.javaでちょびっと楽にFelicaのデータが扱えるようになるかも。まぁ雰囲気です。
Parcelable tag = intent.getParcelableExtra("android.nfc.extra.TAG");
TagWrapper tw = new TagWrapper(tag);

こんな感じで使います。

NfcAdapterの中身とか見るともっと色々できそうな予感…!暇を見つけてトライしていきたいところですね。

まめちしき

うわーんブレークポイント設定しているのにブレークポイントで止まらないよー!!っていう人はDDMSパースペクティブをひらいて、Devicesのビューからアタッチしたいプロセスを選択してから虫ボタンとか押すといいです。
ċ
TagWrapper.java
(3k)
若命全洋,
2010/12/27 18:52
Comments