#はじめに
Manifestファイルに書くインテントフィルタの書き方でハマったので、簡単に整理しておきます。
NDEFレコードを含まないNFCカードの検出方法について書いています。
#NFCカードをタッチしたときにアクティビティが起動する仕組み
Androidがタグディスパッチシステムという機能を持っていて、NFCカードをタッチしたとき、いくつかのインテントを発行します。
これをManifestファイルに記載したインテントフィルタで検出すると、アクティビティを起動することができます。
タグディスパッチシステムの解説はここを参照。
http://developer.android.com/intl/ja/guide/topics/connectivity/nfc/nfc.html#dispatching
#インテントフィルタの種類
android.nfc.action.ACTION_NDEF_DISCOVERED
NFCにNDEFレコードが含まれている場合
android.nfc.action.ACTION_TECH_DISCOVERED
NDEFレコードが含まれていないけど、XMLファイルに記載したtech-listの条件に一致する場合
android.nfc.action.ACTION_TAG_DISCOVERED
ACTION_NDEF_DISCOVEREDでもACTION_TECH_DISCOVEREDでもないNFCカードの場合
#Manifestファイルの書き方
起動したいアクティビティに以下のようなインテントフィルタを追記します。
tech-listを記載しているXMLファイルは、nfc_tech.xmlというファイル名にしています。
この例ではMIFARE Classic, MIFARE Ultralight, FeliCaの検出をしています。
[AndroidManifest.xml]
<intent-filter>
<action android:name="android.nfc.action.TECH_DISCOVERED" />
</intent-filter>
<meta-data
android:name="android.nfc.action.TECH_DISCOVERED"
android:resource="@xml/nfc_tech" />
[/res/xml/nfc_tech.xml]
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<tech-list>
<tech>android.nfc.tech.NfcA</tech>
<tech>android.nfc.tech.MifareClassic</tech>
</tech-list>
<tech-list>
<tech>android.nfc.tech.NfcA</tech>
<tech>android.nfc.tech.MifareUltralight</tech>
</tech-list>
<tech-list>
<tech>android.nfc.tech.NfcF</tech>
</tech-list>
</resources>
#ハマったポイント
tech-listのファイルを以下のように書いたら、インテントを検出することができませんでした。
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<tech-list>
<tech>android.nfc.tech.NfcA</tech>
<tech>android.nfc.tech.MifareClassic</tech>
<tech>android.nfc.tech.MifareUltralight</tech>
<tech>android.nfc.tech.NfcF</tech>
</tech-list>
</resources>
#わかったこと
tech-listに書いた条件はAND条件。
複数の種類のカードを検出したいときは、tech-listを分けて書く必要がある。
Android Developersをよく読めば書いてあると思います。たぶん。
よく読まないでハマっちゃった人の参考になれば幸いです。
#参考リンク
Near Field Communication
http://developer.android.com/intl/ja/guide/topics/connectivity/nfc/index.html
NFC Basics
http://developer.android.com/intl/ja/guide/topics/connectivity/nfc/nfc.html
Advanced NFC
http://developer.android.com/intl/ja/guide/topics/connectivity/nfc/advanced-nfc.html