NexusSによるNFC調査: getTechList 編

こんにちは、ちきん(mokemokechicken)です。
さて、私のNexusSでもやっとAPI10が利用可能になったので、現在色々調査中なのですが、
今回は、 getTechList() という「AndroidがNFC系カードをどのような種別として認識するか」という結果について簡単にメモしておきます。

getTechList()の結果

android.nfc.Tag#getTechList()は、
Android端末がNFC系カードを発見したIntentに含まれるTagインスタンスのメソッドで、

Tag tag = (Tag)intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
String[] techList = tag.getTechList();

などで取得できる値です。
この techList に入る値は、 android.nfc.tech の TagTechnology を ImplementしたClassの(fully-qualifiedな)名前になります。

色々なカードを試していると、カードによってだいぶ値が違っていて興味深いです。
早速結果ですが、以下のようになりました。

  • Softbank 830SHs: NfcF
  • AU K002: NfcF
  • 会社の社員証: NfcF
  • FeliCaLite: 未所持なので未検証
  • 保育園の入館証: MifareClassic, NfcA, NdefFormatable
  • KさんのTASPO: MifareClassic, NfcA, NdefFormatable
  • 練馬区の住基カード(写真入り、2009年作成): 反応せず
  • 運転免許証: IsoDep, NfcB

NfcA(ISO 14443-3A) の MifareClassic は、2つとも NdefFormatable となっているのは興味深いです。
NfcB(ISO 14443-3B) や NfcF(JIS 6319-4, FeliCa) は、 NdefFormatable にはなりませんでした。
ただし、おそらく上記のNfcFカードは FeliCaStandard なので FeliCaLite では違う結果になるかもしれません。
噂によると、住基カードは NfcB という話なのですが、どうも反応しません。必ずしもそうではないということなのかもしれません。
運転免許証は、 NfcB と IsoDep(ISO 14443-4) という結果になりました。

ここで気になるのは、 MifareClassicのカード(保育園の入館証) を NdefFormatable と認識をしているという点です。
これらのカードには、 NDEFデータとして書込みが可能かもしれず、 今までは発見Intentが TECH_DISCOVERED なのですが、
NdefFormatable で Formatすると NDEF_DISCOVERED でIntentされるかもしれない、という辺りがもう少し調べておきたいところです。
この調査結果はまた後日・・・

補足: Intent Filter周りの設定

最後に、今回の調査で使ったときの設定を書いておきます。
Android2.3.3から、 NFC発見は4つの方法で通知されます。
これらの意味については既に他のサイトでも色々説明されていますが、簡単にまとめた中にも書いてあるので、こちらもご参考下さい。


AndroidManifest.xml の activity ブロックの中

※NDEF_DISCOVEREDについては調査不十分ですが、text/plainに反応するならこんな記述になるかと思います。


<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED"></action>
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
<intent-filter>
<action android:name="android.nfc.action.TECH_DISCOVERED"></action>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<meta-data android:name="android.nfc.action.TECH_DISCOVERED"
android:resource="@xml/nfc_filter"/>
<intent-filter>
<action android:name="android.nfc.action.TAG_DISCOVERED"></action>
<category android:name="android.intent.category.DEFAULT"></category>
</intent-filter>


res/xml/nfc_filter.xml

1つのtech-listにたくさん指定すると、同時にサポートしてないと反応しない。tech-listに1つずつ全部書くととにかく反応する。

<?xml version="1.0" encoding="utf-8"?><resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- どれか一つでもサポートしていたら反応する。
検証用設定。本当は使うもののみにすべき。 -->
<tech-list><tech>android.nfc.tech.IsoDep</tech></tech-list>
<tech-list><tech>android.nfc.tech.NfcA</tech></tech-list>
<tech-list><tech>android.nfc.tech.NfcB</tech></tech-list>
<tech-list><tech>android.nfc.tech.NfcF</tech></tech-list>
<tech-list><tech>android.nfc.tech.NfcV</tech></tech-list>
<tech-list><tech>android.nfc.tech.Ndef</tech></tech-list>
<tech-list><tech>android.nfc.tech.NdefFormatable</tech></tech-list>
<tech-list><tech>android.nfc.tech.MifareClassic</tech></tech-list>
<tech-list><tech>android.nfc.tech.MifareUltralight</tech></tech-list>
</resources>

Comments are closed.