2012年4月26日木曜日

NFCのテクノロジーフィルタにはまる。

防水ドロイド
NFCのタグをアプリが認識するためにテクノロジーのフィルターを宣言しますが、最初にはまってしまったのが、フィルターの宣言方法。

例えば NfcA と NfcF に反応させたい場合。
間違ってしまうパターンがこんな感じ。
 
×
    <tech-list>
        <tech>android.nfc.tech.NfcA</tech>
        <tech>android.nfc.tech.NfcF</tech>
    </tech-list>

これだと、全く反応しないアプリの出来上がり。
正解はこんな感じ。分けるのがポイント。
○
    <tech-list>
        <tech>android.nfc.tech.NfcA</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.NfcF</tech>
    <tech-list>


一度のタグ認識時に、パースされるテクノロジーリストとマッチさせるところがミソ。
NDEFフォーマットされたMifareUltralight の場合は、 NfcA テクノロジーも使っているし、Ndefフォーマットだし、MifareUltralight だしで3つのテクノロジーリストがパースされるので、どれか一つでもフィルタリングしていれば、マッチする。丁寧に書くのなら以下の感じ。

<tech-list>
        <tech>android.nfc.tech.NfcA</tech>
        <tech>android.nfc.tech.Ndef</tech>
        <tech>android.nfc.tech.MifareUltralight</tech>
</tech-list> 
理解するまで、はまってしまった。 これは、enableForegroundDispatch() メソッドで渡す引数時にもいえる。
mAdapter.enableForegroundDispatch(this, mPendingIntent, mFilters, mTechLists);
mTechLists に渡すテクノロジーリストは
×
mTechLists = new String[][] { new String[] { NfcF.class.getName() , NfcA.class.getName()  };
だと駄目で、
○
mTechLists = new String[][] { new String[] { NfcF.class.getName() },
                              new String[] { NfcA.class.getName() } };
ってな感じに書かないと駄目。

気をつけよう。。

0 件のコメント:

コメントを投稿