QA@IT

NFC機能を使ったAndroidアプリが、タグの種類によって起動したりしなかったりします

6144 PV

AndroidがNFCタグにタッチしたときに起動するようにしたいのですが、NDEF対応したFeliCa Liteタグを読み取ると必ずブラウザが起動してしまいます。
Suicaを読み取らせた場合はどのアプリを起動するかを選択するダイアログが表示されます。

AndroidManifest.xmlには、以下のような内容のインテントフィルタを記述してあります。

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

どうすればFeliCa Liteに反応させることができるでしょうか。

回答

ポイントが足りないので編集できないため、補足ですが新規の回答になります。

maripo_goda さんの末尾にある XML だと、

<tech-list> の中にある全ての <tech> に対応していなければマッチしないと思います。

<tech-list> の中は AND, <tech-list> 同士は OR な感じですね。

編集 履歴 (0)
  • おっと間違えておりました。ありがとうございます。
    ちゃんと動いているアプリのXMLをコピペしてきたので多分大丈夫です。
    -

NFCタグを検出したときには「合致するすべてのアプリ」が起動の候補となるわけではありません。

複数のアプリのインテントフィルタに合致した場合、それらの中アプリの中でも「より詳細なフィルタ」を持ったものが優先的に起動されます。より詳細なフィルタを持ったアプリがあれば、それよりも一般的なフィルタを持ったアプリは、起動の候補にすら上がってきません。

たとえば……

  • 「特定の規格に準じたNFCタグを検出したら起動するアプリ」は「何らかのNFCタグを検出したら起動するアプリ」よりも優先的に起動
  • 「NDEFレコードに特定のURLの書きこまれたタグに反応するアプリ」は「NDEFレコードを見つけたら反応するアプリ」よりも優先的に起動

といった具合です。「とても詳細なフィルタを持ったアプリ」にインテントを「横取り」される可能性をゼロにすることはできませんが、たとえば、"android.nfc.action.TECH_DISCOVERED" に具体的な規格を指定すれば、質問内容にあるような状況はだいたい回避できます。

実装例

AndroidManifest.xmlのactivityタグ直下、intent-filterタグの並びに以下の内容を追加

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

res/xml ディレクトリの中にnfc_tech_list.xml というファイルを作成し、以下のように記述

<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>

なお、規格一覧は
http://developer.android.com/reference/android/nfc/tech/package-summary.html
にあります。

編集 履歴 (1)
ウォッチ

この質問への回答やコメントをメールでお知らせします。