QA@IT
«回答へ戻る

訂正

90
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <tech-list>
         <tech>android.nfc.tech.IsoDep</tech>
-        <tech>android.nfc.tech.MifareClassic</tech>
-        <tech>android.nfc.tech.MifareUltralight</tech>
-        <tech>android.nfc.tech.Ndef</tech>
-        <tech>android.nfc.tech.NdefFormatable</tech>
-        <tech>android.nfc.tech.NfcA</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>
 ~~~

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
にあります。

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

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

たとえば……

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

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

実装例
---------------

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

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

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

~~~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
にあります。

回答を投稿

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>android.nfc.tech.MifareClassic</tech>
        <tech>android.nfc.tech.MifareUltralight</tech>
        <tech>android.nfc.tech.Ndef</tech>
        <tech>android.nfc.tech.NdefFormatable</tech>
        <tech>android.nfc.tech.NfcA</tech>
        <tech>android.nfc.tech.NfcB</tech>
        <tech>android.nfc.tech.NfcF</tech>
        <tech>android.nfc.tech.NfcV</tech>
    </tech-list>
</resources>

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

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

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

たとえば……

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

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

実装例
---------------

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

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

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

~~~xml
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <tech-list>
        <tech>android.nfc.tech.IsoDep</tech>
        <tech>android.nfc.tech.MifareClassic</tech>
        <tech>android.nfc.tech.MifareUltralight</tech>
        <tech>android.nfc.tech.Ndef</tech>
        <tech>android.nfc.tech.NdefFormatable</tech>
        <tech>android.nfc.tech.NfcA</tech>
        <tech>android.nfc.tech.NfcB</tech>
        <tech>android.nfc.tech.NfcF</tech>
        <tech>android.nfc.tech.NfcV</tech>
    </tech-list>
</resources>
~~~
なお、規格一覧は
http://developer.android.com/reference/android/nfc/tech/package-summary.html
にあります。