2012年7月25日水曜日

作るもの

  • ホームアプリでNFCに反応するアプリを作る
  • タグの種類によって制限する

解説

AndroidManifest.xml

1. NFCのIntentFilterを定義する
タグの種類によって制限をかけたいので、TECH_DISCOVEREDというアクションを設定します。


2. 制限するタグの定義ファイルを設定する
タグを制限するにはxmlファイルを定義する必要があります。


/res/xml/nfc_tech_filter.xml

1. 制限するタグを定義する
NfcFのみ反応したい場合、以下のように定義します。

NfcFかつNdefが定義されている場合のみ反応したい場合、以下のように定義します。

NfcFとNfcA両方に反応したい場合、以下のように定義します。


HomeActivity.java

1. Intentを受信したらNFC-IDを表示する
NFCのIntentが呼ばれた時にNFC-IDを取得し、Toastに表示します。
Intentを受信するイベントはアプリが起動する場合と、バックスタックにいる場合があるので
onCreate(:Bundle):void とonNewIntent(:Intent):void の2ヶ所から呼び出しています。


実行イメージ

ソースコード

https://github.com/bs-nfc/NFCHandlerOnHome

カスタマー開発部 山下智樹

アプリを起動していなくてもNFCに反応するアプリを作る

作るもの

  • ホームアプリでNFCに反応するアプリを作る
  • タグの種類によって制限する

解説

AndroidManifest.xml

1. NFCのIntentFilterを定義する
タグの種類によって制限をかけたいので、TECH_DISCOVEREDというアクションを設定します。


2. 制限するタグの定義ファイルを設定する
タグを制限するにはxmlファイルを定義する必要があります。


/res/xml/nfc_tech_filter.xml

1. 制限するタグを定義する
NfcFのみ反応したい場合、以下のように定義します。

NfcFかつNdefが定義されている場合のみ反応したい場合、以下のように定義します。

NfcFとNfcA両方に反応したい場合、以下のように定義します。


HomeActivity.java

1. Intentを受信したらNFC-IDを表示する
NFCのIntentが呼ばれた時にNFC-IDを取得し、Toastに表示します。
Intentを受信するイベントはアプリが起動する場合と、バックスタックにいる場合があるので
onCreate(:Bundle):void とonNewIntent(:Intent):void の2ヶ所から呼び出しています。


実行イメージ

ソースコード

https://github.com/bs-nfc/NFCHandlerOnHome

カスタマー開発部 山下智樹

2012年7月20日金曜日

指定するタグの種類について

AndroidでNFC対応アプリを作成する場合、どのタグに反応するかを指定することができます。(ACTION_TAG_DISCOVEREDの場合必要ありません)
指定できるタグの種類は以下があります。

  • IsoDep
  • MifareClassic
  • MifareUltralight
  • Ndef
  • NdefFormattable
  • NfcA
  • NfcB
  • NfcF
  • NfcV

これらのクラスはandroid.nfc.techパッケージに定義されています。
それぞれを説明します。

  • IsoDep
    • ISO-DEP(ISO/IEC 14443-4 DataExchangeProtocol)にアクセスできる
    • NfcAもしくはNfcBである
  • MifareClassic
    • NXP MifareClassic
    • NfcAである
  • MifareUltralight
    • NXP MifareUltralight
    • NfcAである
  • Ndef
    • Ndefにフォーマットされているタグ
  • NdefFormattable
    • Ndefにフォーマットできるタグ
  • NfcA
    • ISO/IEC 14443 TypeA
    • Mifare系がこれに該当する
  • NfcB
    • ISO/IEC 14443 TypeB
    • 日本の公共団体発行のカード等が該当する
  • NfcF
    • FeliCa系がこれに該当する
  • NfcV
    • いわゆる近傍型と呼ばれるタグの種類
    • ISO/IEC 15693
    • ICODE
    • NFCチップによっては対応していない場合があります

具体的にどれなんだろう

どのようなタグが該当するか、私の手持ちのタグをかざしてみます。

Suica

  • NfcF


Taspo

  • NdefFormattable
  • MifareClassic
  • NfcA


運転免許証

  • IsoDep
  • NfcB


Edy

  • NfcF


Clipper Card

  • NdefFormattable
  • IsoDep
  • NfcA


Brother ラベルプリンター RL-700S

  • NfcV
  • Ndef


ネットカフェの会員証

  • NdefFormattable
  • MifareClassic
  • NfcA


名刺

  • NfcF
  • Ndef

(中にNDEFフォーマットにvCardを書き込んだFeliCa Liteを仕込んでいます)


OCTOPUS

  • NfcF


NFC QUEST Card

  • Ndef
  • NfcF

カスタマー開発部 山下智樹

Androidで指定するタグの種類について

指定するタグの種類について

AndroidでNFC対応アプリを作成する場合、どのタグに反応するかを指定することができます。(ACTION_TAG_DISCOVEREDの場合必要ありません)
指定できるタグの種類は以下があります。

  • IsoDep
  • MifareClassic
  • MifareUltralight
  • Ndef
  • NdefFormattable
  • NfcA
  • NfcB
  • NfcF
  • NfcV

これらのクラスはandroid.nfc.techパッケージに定義されています。
それぞれを説明します。

  • IsoDep
    • ISO-DEP(ISO/IEC 14443-4 DataExchangeProtocol)にアクセスできる
    • NfcAもしくはNfcBである
  • MifareClassic
    • NXP MifareClassic
    • NfcAである
  • MifareUltralight
    • NXP MifareUltralight
    • NfcAである
  • Ndef
    • Ndefにフォーマットされているタグ
  • NdefFormattable
    • Ndefにフォーマットできるタグ
  • NfcA
    • ISO/IEC 14443 TypeA
    • Mifare系がこれに該当する
  • NfcB
    • ISO/IEC 14443 TypeB
    • 日本の公共団体発行のカード等が該当する
  • NfcF
    • FeliCa系がこれに該当する
  • NfcV
    • いわゆる近傍型と呼ばれるタグの種類
    • ISO/IEC 15693
    • ICODE
    • NFCチップによっては対応していない場合があります

具体的にどれなんだろう

どのようなタグが該当するか、私の手持ちのタグをかざしてみます。

Suica

  • NfcF


Taspo

  • NdefFormattable
  • MifareClassic
  • NfcA


運転免許証

  • IsoDep
  • NfcB


Edy

  • NfcF


Clipper Card

  • NdefFormattable
  • IsoDep
  • NfcA


Brother ラベルプリンター RL-700S

  • NfcV
  • Ndef


ネットカフェの会員証

  • NdefFormattable
  • MifareClassic
  • NfcA


名刺

  • NfcF
  • Ndef

(中にNDEFフォーマットにvCardを書き込んだFeliCa Liteを仕込んでいます)


OCTOPUS

  • NfcF


NFC QUEST Card

  • Ndef
  • NfcF

カスタマー開発部 山下智樹

2012年7月19日木曜日

NFCに関するActionの種類


AndroidでNFCに関するActionは以下の3つがあります。

  • ACTION_NDEF_DISCOVERED
  • ACTION_TECH_DISCOVERED
  • ACTION_TAG_DISCOVERED

NFCタグが検出されるといずれかのActionのIntentが発行されます。
どういう場合に発行されるか説明します。

  • ACTION_NDEF_DISCOVERED
    • タグがNDEFでフォーマットされていた場合に、このActionで発行されます。
    • タグの種類によってフィルタリングすることができます。
    • IntentのExtra内にNDEFの情報が含まれます。
    • 最も優先順位が高いです。
  • ACTION_TECH_DISCOVERED
    • 上記のActionで反応するアプリがなかった場合に、このActionで発行されます。
    • タグがNDEFでフォーマットされていなかった場合、一番優先度が高いです。
    • タグの種類によってフィルタリングすることができます。
  • ACTION_TAG_DISCOVERED
    • 上記2種類のActionで対応するアプリがなかった場合に、このActionで発行されます。
    • このActionで指定していればどんなNFC Tagタイプでも反応することができますが、上記2つのActionでアプリが起動した場合、反応することができません。
    • 一番優先度が低いです。

Actionの優先度とは



タグの種類によってスタート地点が異なります。
タグがNDEFにフォーマットされている場合、ACTION_NDEF_DISCOVEREDの判定が行われます。
端末にインストールされているアプリでACTION_NDEF_DISCOVEREDを処理できるアプリが存在した場合
そちらにIntentが渡されます。
ACTION_NDEF_DISCOVEREDを処理できるアプリが存在しなかった場合、もしくはタグがNDEFでフォーマットされていない場合は
ACTION_TECH_DISCOVEREDの判定が行われます。
ACTION_TECH_DISCOVEREDはタグの種類によってフィルタリングすることが可能なIntentです。
(たとえばTypeAにのみ反応するアプリや、TypeFのみに反応するアプリなど)
端末にインストールされているアプリでACTION_TECH_DISCOVEREDを処理できるアプリが存在した場合
そちらにIntentが渡されます。
上記2つのActionを処理できるアプリが存在しなかった場合、ACTION_TAG_DISCOVEREDが発行されます。

Actionを優先順位順に並べると
ACTION_NDEF_DISCOVERED、ACTION_TECH_DISCOVERED、ACTION_TAG_DISCOVEREDとなり
優先順位の高い方から処理可能か判定されます。
途中で処理可能と判定された場合、優先順位の低いActionの判定は行われません。

アプリを作る際に注意しなければならないのは、どのようなタグに反応するアプリなのか決定し
できるだけ優先順位の高いActionで起動できるようにすること
安易にACTION_TAG_DISCOVEREDを指定すると、優先順位の高いアプリにIntentを奪われて起動されない事があります。

カスタマー開発部 山下智樹

NFCに関連するActionについて

NFCに関するActionの種類


AndroidでNFCに関するActionは以下の3つがあります。

  • ACTION_NDEF_DISCOVERED
  • ACTION_TECH_DISCOVERED
  • ACTION_TAG_DISCOVERED

NFCタグが検出されるといずれかのActionのIntentが発行されます。
どういう場合に発行されるか説明します。

  • ACTION_NDEF_DISCOVERED
    • タグがNDEFでフォーマットされていた場合に、このActionで発行されます。
    • タグの種類によってフィルタリングすることができます。
    • IntentのExtra内にNDEFの情報が含まれます。
    • 最も優先順位が高いです。
  • ACTION_TECH_DISCOVERED
    • 上記のActionで反応するアプリがなかった場合に、このActionで発行されます。
    • タグがNDEFでフォーマットされていなかった場合、一番優先度が高いです。
    • タグの種類によってフィルタリングすることができます。
  • ACTION_TAG_DISCOVERED
    • 上記2種類のActionで対応するアプリがなかった場合に、このActionで発行されます。
    • このActionで指定していればどんなNFC Tagタイプでも反応することができますが、上記2つのActionでアプリが起動した場合、反応することができません。
    • 一番優先度が低いです。

Actionの優先度とは



タグの種類によってスタート地点が異なります。
タグがNDEFにフォーマットされている場合、ACTION_NDEF_DISCOVEREDの判定が行われます。
端末にインストールされているアプリでACTION_NDEF_DISCOVEREDを処理できるアプリが存在した場合
そちらにIntentが渡されます。
ACTION_NDEF_DISCOVEREDを処理できるアプリが存在しなかった場合、もしくはタグがNDEFでフォーマットされていない場合は
ACTION_TECH_DISCOVEREDの判定が行われます。
ACTION_TECH_DISCOVEREDはタグの種類によってフィルタリングすることが可能なIntentです。
(たとえばTypeAにのみ反応するアプリや、TypeFのみに反応するアプリなど)
端末にインストールされているアプリでACTION_TECH_DISCOVEREDを処理できるアプリが存在した場合
そちらにIntentが渡されます。
上記2つのActionを処理できるアプリが存在しなかった場合、ACTION_TAG_DISCOVEREDが発行されます。

Actionを優先順位順に並べると
ACTION_NDEF_DISCOVERED、ACTION_TECH_DISCOVERED、ACTION_TAG_DISCOVEREDとなり
優先順位の高い方から処理可能か判定されます。
途中で処理可能と判定された場合、優先順位の低いActionの判定は行われません。

アプリを作る際に注意しなければならないのは、どのようなタグに反応するアプリなのか決定し
できるだけ優先順位の高いActionで起動できるようにすること
安易にACTION_TAG_DISCOVEREDを指定すると、優先順位の高いアプリにIntentを奪われて起動されない事があります。

カスタマー開発部 山下智樹

作るもの

  • NFCタグに反応するアプリを作る
  • 反応したらそのNFC-IDをToastで表示する
  • 反応するのはアプリ起動中のみ

AndroidManifest


1. SDK の変更をする

NFCが使えるAPI Levelは9以降になります。
しかし9はNFCを使うには貧弱なAPIしかないので10以降を指定します。


2. uses-feature を追加する

NFCをもっていない端末にはダウンロードされないように
機能の指定を行います。


3. permission を追加する

NFCを使うためには以下のパーミッションが必要になります。


4. launchMode を変更する

NFCに反応してIntentが発行されるとデフォルトのLaunch Mode(standard)では新しくActivityを作ろうとします。
何度も同じActivityを作られては困るので、launchModeを指定します。


Activity

NFCタグに反応するための準備とNFCタグを受け取る部分を実装します。


1. NFC機能のない端末では起動できないようにする

use-featureで制限していますので、ここで終了するパターンはありません。


2. NFCが無効になっていた時に終了する

NFCが無効になっていた場合、アプリを終了します。
終了するよりも、設定画面に遷移した方が親切です。


3. NFCタグを発見した時に反応するように登録する

設定する項目は2つあります。
3-1. 反応するActionを指定する(詳しくはこちら)
3-2. 反応するタグの種類を指定する(詳しくはこちら)


4. 登録を解除する

アプリがフォアグラウンドにいない時にはNFCに反応しなくていいので
onPauseにて登録を解除します。


5. Intentを受け取る

NFCタグに反応したIntentはonNewIntentを通して受け取ります。
IntentのExtraに格納されたデータを使い、タグとやり取りをします。
以下のコードではNFC-IDを受け取り文字列に整形した後に
Toastで表示しています。


実行イメージ


ソースコード

https://github.com/bs-nfc/NFCHandlerOnApp

カスタマー開発部 山下智樹

AndroidでNFCタグに反応するシンプルなアプリを作る

作るもの

  • NFCタグに反応するアプリを作る
  • 反応したらそのNFC-IDをToastで表示する
  • 反応するのはアプリ起動中のみ

AndroidManifest


1. SDK の変更をする

NFCが使えるAPI Levelは9以降になります。
しかし9はNFCを使うには貧弱なAPIしかないので10以降を指定します。


2. uses-feature を追加する

NFCをもっていない端末にはダウンロードされないように
機能の指定を行います。


3. permission を追加する

NFCを使うためには以下のパーミッションが必要になります。


4. launchMode を変更する

NFCに反応してIntentが発行されるとデフォルトのLaunch Mode(standard)では新しくActivityを作ろうとします。
何度も同じActivityを作られては困るので、launchModeを指定します。


Activity

NFCタグに反応するための準備とNFCタグを受け取る部分を実装します。


1. NFC機能のない端末では起動できないようにする

use-featureで制限していますので、ここで終了するパターンはありません。


2. NFCが無効になっていた時に終了する

NFCが無効になっていた場合、アプリを終了します。
終了するよりも、設定画面に遷移した方が親切です。


3. NFCタグを発見した時に反応するように登録する

設定する項目は2つあります。
3-1. 反応するActionを指定する(詳しくはこちら)
3-2. 反応するタグの種類を指定する(詳しくはこちら)


4. 登録を解除する

アプリがフォアグラウンドにいない時にはNFCに反応しなくていいので
onPauseにて登録を解除します。


5. Intentを受け取る

NFCタグに反応したIntentはonNewIntentを通して受け取ります。
IntentのExtraに格納されたデータを使い、タグとやり取りをします。
以下のコードではNFC-IDを受け取り文字列に整形した後に
Toastで表示しています。


実行イメージ


ソースコード

https://github.com/bs-nfc/NFCHandlerOnApp

カスタマー開発部 山下智樹

Related Posts Plugin for WordPress, Blogger...