Upload
masafumi-terazono
View
911
Download
4
Embed Size (px)
DESCRIPTION
Citation preview
Re:Kayo-System Co.,Ltd.
Twitter @yokmamaNow Loading. Please Wait ...
AndroidでNFC その1第2回NFCLab勉強会 関西支部夜子まま
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
自己紹介
本名 :寺園聖文(てらぞの まさふみ)
別名 :夜子まま
肩書 :株式会社Re:Kayo-System 代表取締役社長
クラスタ:日本Androidの会、関西Unity、NFCLab
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
こんにちは、姉のけいです。
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
ねぇ、けいー、突然で悪いんだけど、NFCタグリーダーを作ってみたいんだー、だから作り方教えてくれる?
たっ!たしかに突然ね!ま、、いいわよ教えてあげるわ
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
講義内容
NFCタグ
タグディスパッチ
フォアグラウンドディスパッチ
次回予告
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
ねぇー、ところで、ゆいは、NFCについてどのぐらい知ってるの?
えーと、この前もらったカードがNFCカードっていうのらしくて、それがAndroidから読めるってい
うぐらい?
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
じゃーまずはNFCタグとは何か?ってところから説明するわね
たのむ!
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
NFCタグ
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
NFCタグはNFCで規定された形式のデータを読み書きでき
るタグのことです。
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
NFCタグにはいろんな種類のタグあります
へぇー、色々あるんやね!
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
これらのタグにはそれぞれ規格があるのだけど、NFCはそれらのタグを統一するために作られた新しい規格なの。
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
ISO/IEC 21481(NFC IP-2)
ISO/IEC 18092(NFC IP-1)
ISO/IEC 14443(Type B)
ISO/IEC 15693(Type V)
ISO/IEC 14443(Type A)
JIS X6319(Type F)
NFCの規格はISO/IEC 18092とISO/IEC 21481の2つ、このふたつに色んなタグが含まれる形で
規定されてるの
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
規格 採用例
MIFARE(ISO/IEC 14443 TYPE-A)
taspoカードのほか、欧州では交通系カード等で広く普及
ISO/IEC 14443 TYPE-B 住民基本台帳カード、免許証など
FeliCa Suica、Edy、WAON、nanaco、おサイフケータイなど、国内では交通カードや電子マネーとして広く普及
ISO/IEC 15693 物流、小売などのICタグ、ICラベル
http://www.nfc-world.com/about/03.html※表はTOPPAN FORUMSより
NFCの規格に含まれた、各タグはこの表に書かれているような所で
使われています。
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
クラス 説明
TagTechnology すべてのタグテクノロジークラスで実装する必要があるインターフェイス
NfcA NFC-A ( ISO 14443-3A ) プロパティと I/O オペレーションへのアクセスを提供する
NfcB NFC-B ( ISO 14443-3B ) プロパティと I/O オペレーションへのアクセスを提供する
NfcF NFC-F ( JIS 6319-4 ) プロパティと I/O オペレーションへのアクセスを提供する
NfcV NFC-V ( ISO 15693 ) プロパティと I/O オペレーションへのアクセスを提供する
IsoDep ISO-DEP ( ISO 14443-4 ) プロパティと I/O オペレーションへのアクセスを提供する
NdefNDEF としてフォーマットされた NFC タグの NDEF データとオペレーションへのアクセスを提供する
NdefFormatableNDEF にフォーマットできる可能性があるタグに対するフォーマットのオペレーションを提供する
そして、これが実際にAndroidから読み取ることができるタグの種類
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
なので、NFCタグリーダーを作るならまずはこのタグの取得のところからはじめないといけないわ
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
ちょっとまって、、まさかNFCってひとつだけじゃなくていろんな種類のタグに合わせてプログラムしないといけないの?
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
えーと、そこは大丈夫!心配しないで、基本的な部分は同じように処理できるし、あくまでタグの種類に合わせて処理が出来るようにする
ための分類なのよ
いいね!
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
TagTechnology
NfcA NfcF NfcB NfcV IsoDep
Ndef MifareClassic MifareUltralight NdefFormatable
NfcBarcode
NFCタグへの操作はTagTechnologyが基本に
なってるの
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
ただ・・・タグへのアクセスは分かりやすいんだけど、実際にタグを取得するところがややこしいんだよねぇ
そんな驚かさんといてー
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
NFCタグ Android Intent
Tag
TagTechnology
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);if (Arrays.asList(tag.getTechList()).contains(NfcA.class.getName())){ NfcA nfca = NfcA.get(tag);}
TagTechnologyの取得例
取得したタグにはそれがサポートしているタグの種類が入っている
ので、それからどのTagTechnologyが取得できるか調
べることができるの
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
なるほど!じゃ、早速タグを取得するプログラムを作ってみる!
がんばって!
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
けいーー、早速タグを取得、、ておもったけど、どうやったらIntentを受け取れるの?
ごめん!大事なこといい忘れた
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
タグディスパッチ
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
Androidでタグの入ったIntentを受け取るにはタグディスパッチシステムという仕組みを使ってどんなタグを受信するのか設定する必要があります。
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
それでは、Intentフィルターを使った受信設定の方法を説明しますね。
Intentフィルターには次の3つのフィルターがあります。
ACTION_TAG_DISCOVERED
ACTION_TECH_DISCOVERED
ACTION_NDEF_DISCOVERED
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
ACTION_TAG_DISCOVERED
ACTION_TECH_DISCOVERED
ACTION_NDEF_DISCOVERED
NFCタグ全般に対するIntentフィルター
NFCのデータが書かれているタグへのIntentフィルター
NFCのタグの種類にに対するIntentフィルター
使用用途の応じてこれらのActionを
AndroidManifest.xmlに書いてあげればいいの
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
それじゃ、とりあえずTAGを読みたい!て時は、ACTION_TAG_DISCOVEREDを使
えばよさそうだね!さっそくやってみる!
そ、そうかな・・まぁやってみて!
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
けいーー!早速作ってみたけど、全然!だめ!
タグに反応しないんですけどぉー
フフフ、早速、罠に嵌ったようね。
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
実は、NFCの読み取りはより正確にフィルターを宣言されたアプリを優先する仕様になっているの。
だから、反応しないのは他のアプリがより詳細に書かれているので横取りされてることになるのよ
もぉー、そういうこと先に言ってよー
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
ACTION_TAG_DISCOVERED
ACTION_TECH_DISCOVERED
ACTION_NDEF_DISCOVERED優先順位
このように基本的には上から順にチェックしていって反
応するんです
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
フォーマット済みタグ
未フォーマットタグ
NDEF_DISCOVERD
TECH_DISCOVERD
TAG_DISCOVERD
NDEF_DISCOVERDがActivityにハンドルされている?
IntentをActivityに渡す
TECH_DISCOVERDがActivityにハンドルされている?
TAG_DISCOVERDがActivityにハンドルされている?
このフロー図はActivityにIntentを渡すまでのフロー図よ
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
なるほどー、じゃACTION_TAG_DISCOVEREDだと、標準ではいっているタグリーダーが起動するのはそうい
う理由だったんだねー。てことは・・このActionは何のためにあるの?
さぁーー、それが謎というかなんというか、実質使い物になるようにするにはカードの種類をいれるか、タグのデータの種類をいれるかしないと反応しないですし。それがAndroidらしいということなのかな。
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
TECH_DISCOVERDと NDEF_DISCOVERDはより詳細にタグを指定するためにオプショ
ンがあるのでそれを説明するわね
おっけー!
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
<intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="text/plain" /></intent-filter>
データのMIMEタイプをtext/plainにした例
まずは、NDEF_DISCOVERDのオプションについて。このフィルターはNFCのデータの中身についてのフィルターをつけるため、dataタ
グを使います
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <tech-list> <tech>android.nfc.tech.NfcB</tech> <tech>android.nfc.tech.Ndef</tech> </tech-list></resources>
つぎに、TECH_DISCOVERDのオプションについて。このフィルターはNFCタグの種類でフィルタリングするため、別ファイルでタグの種
類を列挙します。
<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_filter" />
xml/nfc_tech_filter.xml
AndroidManifest.xml
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
タグの種類を列挙する定義ファイルは、ORとANDの書き方があるので注意してくださいね
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <tech-list> <tech>android.nfc.tech.NfcB</tech> <tech>android.nfc.tech.Ndef</tech> </tech-list></resources>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <tech-list> <tech>android.nfc.tech.NfcB</tech> </tech-list> <tech-list> <tech>android.nfc.tech.NfcA</tech> </tech-list></resources>
ORの例 NfcBまたはNfcAのタグ
ANDの例 NfcBでかつNdefのタグ
ここにはAndroidの実際のクラス名を書く
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
よーし!今度こそ作れる?
できるわよ、やってみて!
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
ねぇ、けいとりあえずタグリーダぽいのできたんだけど読み取る時に、毎回選択画面がでてきてすっごい使い勝手悪いんだけど、これもしかして対応アプリたくさんいれるとどんどん増えるの?
それは、フォアグラウンドディスパッチを使ってないからね
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
問題の画面
https://github.com/yokmama/ykmjuku-samples/tree/master/NFCSample01
毎回これがでるんじゃだめよねぇ
サンプル・コード
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
フォアグラウンドディスパッチ
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
フォアグラウンドディスパッチは、Activityがフォアグラウンドにある場合において、他のアプリよりも優先順位が高い設定を行うことができる仕組みで、これ
により選択画面なしでタグを受信できます。
まさに、それ!
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
フォアグラウンドディスパッチの使い方は簡単で有効にするときはNfcAdapterのenableForegroundDispachを呼び出し
て、無効にするときは、disableForegroundDispatchを呼び出すだ
けでいいの
public void enableForegroundDispatch (Activity activity, PendingIntent intent, IntentFilter[] filters, String[][]techLists)
public void disableForegroundDispatch (Activity activity)
NfcAdapter
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
public void onResume() { super.onResume(); mAdapter.enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techListsArray);}
public void onPause() { super.onPause(); mAdapter.disableForegroundDispatch(this);}
だけど、これを使う場合はActivityがフォアグラウンドでないといけないという制約があるので、onResumeで有効にしてonPauseで無効にするのが一般的です。
使用例)
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
引数のフィルターはタグディスパッチと考え方は同じなので、書き方が違うと考えてみるといいです。
IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);try { ndef.addDataType("text/plain");}catch (MalformedMimeTypeException e) { throw new RuntimeException("失敗", e);}IntentFilter[] intentFiltersArray = new IntentFilter[] { ndef };
techListsArray = new String[][] { new String[] { NfcA.class.getName(), Ndef.class.getName() }, new String[] { NfcF.class.getName() }};
ACION_TECH_DISCOVEREDの定義
ACION_NDEF_DISCOVEREDの定義
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
あと、フォアグラウンドディスパッチはずっと画面が表示されている状
態での受信なのでIntentはonResumeで受け取るのではなくonNewIntentでうけとるといいわよ
public void onNewIntent(Intent intent) { Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);}
使用例
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
これで、NFCの受信からタグの取得までの説明は終わったわ。
あとは作るだけ!頑張って!
うん!やってみる!
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
https://github.com/yokmama/ykmjuku-samples/tree/master/NFCSample01
https://github.com/yokmama/ykmjuku-samples/tree/master/NFCSample02
タグディスパッチのサンプル
フォアグラウンドディスパッチのサンプル
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
次回予告
12年11月23日金曜日
Re:Kayo-System Co.,Ltd.
次回は、NDEFの解説と、ハンズオン形式でNFC勤怠管理システムの作り方を解説し
たいと思っています。
時期:2013年1月中旬頃場所:多分ECC情報:NFCLabメーリングリスト
http://lab-nfc.com/このサイトで登録できます
12年11月23日金曜日