AndroidでNFCを使ってみる

仕事でNFC開発しなきゃいけなくなったので備忘録がてら記述していく。
僕が扱うのがTypeBのカードなので今回はともかく今後はTypeB関連の操作方法が増えてくると思います。
とりあえず今回はNFC対応のスマートフォンを使ってSuica(Felica)免許証(TypeB)などのカードのIDを読み込むところまでやってみる。
といってもID読むまでならネット上に資料が落ちているから拾ってくるだけだった。


下の参考1のページをもとに新しいプロジェクトを作成してresフォルダの中にxmlフォルダを新規作成(eclipseだったらresフォルダ右クリックして新規作成→フォルダ)
xmlの中にnfc_tech_filter.xml(任意の名前でおk)を作成(新規作成→XML)
いちいちeclipse操作面倒だったらワークスペースたどってresフォルダの下に自分でフォルダ、ファイル作ってプロジェクトをリフレッシュしたほうが早いかも

XMLファイルの中身はとりあえず下記のようにした。

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <tech-list>
        <tech>android.nfc.tech.NfcF</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.NfcB</tech>
    </tech-list>
</resources>

一番目のtech-listはFelica用、2番めはTypeB用
個々のリストが細かいほど、カード読み取りアプリが複数入っていた時優先起動されるらしい。
例えばTypeA系のカードだと参考2によるとnfcAだけじゃなくMifareClassic等幾つかのターゲットがあるのでnfcAだけ指定するより、対象とするカードすべてのターゲットを記述したほうが良い(らしい)
検証はしていないので実際どのように動作するかは不明

ちなみに、最初これの書き方を勘違いしていて、ひとつのtech-listに認証させたい種類全部入れればいいものと思って下記のように書いたら認証しなかった。

<tech-list>
    <tech>android.nfc.tech.NfcB</tech>
    <tech>android.nfc.tech.NfcF</tech>
<tech-list>

これじゃtypeBとFelica両方をターゲットにしたカードじゃないと動かない。(そのようなカードはない)

次にAndroidManifestの変更
これも同じく参考通り

<intent-filter>
    <action android:name="android.nfc.action.TECH_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

<meta-data
    android:name="android.nfc.action.TECH_DISCOVERED"
    android:resource="@xml/nfc_tech_filter" />

多分意味としては、NFC対応携帯でアプリが対象としているカードがかざされたことが検出されたらアプリを起動する。
検出するカードはmeta-dataタグのresourceに記述されている。
ってことでいいと思う。

Activityの方もモロパクリだからもう書かなくていいかな
参考を見てください。

最初tech-listの書き方がわかんなかったからつまずいたけど、そのあとは特にやることはないのでID読むまではすぐにできた。
ただ、このあとカード間と通信して認証処理とかやりたいけどどうやって操作するんだろうか。
カード側のコマンドは把握しているので(仕事で使うからちゃんと仕様書あるよ)扱い方が日本語資料見当たらん。
英語資料探すしかないかな…
どなたか知っている人入れば情報提供お願いします。

あ、最後にNFC軽く試そうという人のために知ってるだろうけど身近にある各タイプのカード
TypeA:タスポ
TypeB:免許証
Felica:Suica等交通系カード、edy等電子マネー、おサイフケータイ

その他いくつかタイプあるけど割愛

参考:

  1. Android向けNFCアプリ作成の基本
  2. Androidアプリ「NFC TagInfo」でタグを読む
  3. AndroidでNFCのIDmを読み取るサンプル

コメント

タイトルとURLをコピーしました