17
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

NFCカードをタッチしたときアクティビティを起動する

Last updated at Posted at 2016-03-22

#はじめに
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

17
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?