関西NFCLab勉強会資料

3,836 views

Published on

AndroidでNFCを反応させるまでの話と簡単に規格の話

1 Comment
4 Likes
Statistics
Notes
  • 今更気づいたんですが、ちょっとNDEFのintent-filterまずいですね…。
    NDEF_DISCOVEREDにはDEFAULTカテゴリが必要です。(19ページ目)
    <category android:name='android.intent.category.DEFAULT'/>
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total views
3,836
On SlideShare
0
From Embeds
0
Number of Embeds
18
Actions
Shares
0
Downloads
29
Comments
1
Likes
4
Embeds 0
No embeds

No notes for slide

関西NFCLab勉強会資料

  1. 1. AndroidでNFCを読むための第一歩
  2. 2. 自己紹介● 名前:えすぺりあ (@esperia09)● 所属:Re: Kayo-System● 趣味:音楽作ったりとか、イラスト描いたりとか● Web関係の技術とか好きです
  3. 3. 今日の発表者すばらしい方ばかりなのに… http://atnd.org/event/E0008274
  4. 4. 今日の発表者すばらしい方ばかりなのに… ひとりだけハンドルネーム http://atnd.org/event/E0008274
  5. 5. _人人人人人人人人人_> 空気読めてない < ̄^Y^Y^Y^Y^Y^Y^Y^ ̄
  6. 6. Agenda● 今回お話する技術的な内容の範囲● AndroidでNFCタグを受け取る仕組み● AndroidアプリでNFCに反応させてみる● 開発に便利なアプリの紹介
  7. 7. 今回お話する技術的な範囲
  8. 8. NFCの3つのモード● NFC Card Emulation Mode ● 端末がNFCカードのように振る舞う – ガラケーの電子マネーとか● Peer-to-Peer Mode ● 端末同士で情報をやり取りする – Android Beamとか● Reader/Writer Mode ● 情報を読み書きするモード – 駅にある電子マネーシステム(ICOCA, Suica)とか、Taspoとか
  9. 9. NFCの3つのモード● NFC Card Emulation Mode ● 端末がNFCカードのように振る舞う – ガラケーの電子マネーとか● Peer-to-Peer Mode ● 端末同士で情報をやり取りする – Android Beamとか● Reader/Writer Mode ● 情報を読み書きするモード – 駅にある電子マネーシステム(ICOCA, Suica)とか、Taspoとか
  10. 10. Androidのサポート状況● NDEF(NFC Data Exchange Format; NFCデータ交換 形式)標準をほぼサポート ● NFC-A (ISO 14443-3A) ● NFC-B (ISO 14443-3B) ● NFC-F (JIS 6319-4)● AndroidでNFCを使ったデータのやり取りをする場合は NDEFの形式になっているものが扱いやすい http://www.nfc- forum.org/resources/white_papers/japanese_nf c_in_the_real_world_III.pdf
  11. 11. AndroidでNFCタグを受け取るには● NFCが読み取れる端末(NFC対応端末)でなければならない● NFCが有効になっていなければならない ● 上記2件はいずれもアプリ内で判断することが可能● NFCに対応したアプリが一つ以上存在すること ● アプリがなくても一応読み取った時に音はしますが、 画面上では何も起きません
  12. 12. 日本で入手できるNFC対応端末● Androidスマートフォン ● Xperia S ● Xperia ion ● AQUOS PHONE SERIE ISW16SHF ● Nexus S ● GALAXY S II LTE SC-03D ● GALAXY NEXUS SC-04D ● GALAXY Note SC-05D ● GALAXY S II WiMAX ISW11SC● Androidタブレット ● FT701/RW-T107 http://www.nfcworld.com/nfc-phones-list/ ● Nexus 7 http://ja.wikipedia.org/wiki/近距離無線通信
  13. 13. NFCを有効にする● Android 4.xの場合 ”設定”→”その他”● Android 2.3.xの場合 ”設定”→”無線とネットワーク”
  14. 14. AndroidでNFCタグを 受け取る仕組み
  15. 15. AndroidでNFCタグを受け取る仕組み● タグを読み取るとインテントが発行さ れる● 通常は、タグを読み込むと暗黙的イン テントが発行される(右図)● NFC対応アプリ上で暗黙的インテント のダイアログが出ると邪魔なの で、NFCを読み取った時は優先的にそ のアプリにインテントが渡されるよう にする方法が用意されている
  16. 16. Androidの少し詳細な動き● Androidのロックを解除する ● ここでAndroidはNFCを探すためのポーリングを開始す る● 端末はNFCを発見すると、NFCタグのパース・NFCのペイロー ド(内容)を識別するMIME-TypeやURIの解読を行う● 解読した内容(MIME-TypeやURI、ペイロード)と、タグのタ イプを元にシステムが決めたアクションをIntentに詰める● Intentの作成が完了したら、端末はNFCのタグが受け取れるよ うになっているアプリケーションにインテントを発行
  17. 17. インテントに設定されたアクション● NFCを読み取った時に受け取ったIntentには以下のいずれかの アクションが含まれている ● ACTION_NDEF_DISCOVERED ● ACTION_TECH_DISCOVERED ● ACTION_TAG_DISCOVERED● 読み取った内容にNDEFのペイロードが含まれていれば ACTION_NDEF_DISCOVEREDになる● 後述するタグテクノロジーのリストを指定していない限り、そ れ以外はACTION_TECH_DISCOVEREDになる● リストを指定している時、リストに読み込んだタグのテクノロ ジーが含まれていない場合はACTION_TAG_DISCOVEREDと なる
  18. 18. アクションの決まり方
  19. 19. タグが受け取れるようになっている アプリケーション <activity android:name=".MainActivity" android:label="@string/title_activity_main" > <intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED" /> </intent-filter> ... </activity>● AndroidManifest.xmlにintent-filterを設定して おくことで、NFC読み取り時にIntentを受け 取る事が出来る ● 上記は、NFCにNDEFが見つかった時に反 応する
  20. 20. 早速NFCに反応するアプリを書いてみる
  21. 21. NFCに反応できるようになるまで● 読み取りの準備 ● パーミッションとマーケットの公開設定● NFCタグを優先的に受け取る ● タグの受け取り先を指定 ● IntentFilterを指定 ● 反応するタグの種類を指定
  22. 22. 読み取りの準備 ● AndroidManifest.xmlの編集<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.esperia09.android.testnfc" android:versionCode="1" これがないとアプリで android:versionName="1.0" > NFC使えない <uses-permission android:name="android.permission.NFC" /> <uses-feature android:name="android.hardware.nfc" android:required="true" /> Google Playでこのアプリを検索 <uses-sdk した時NFC未搭載端末では一覧に android:minSdkVersion="10" 出なくなる設定 android:targetSdkVersion="16" /> ...</manifest>
  23. 23. NFCの情報を優先的に受け取る● onResume() NFCのIntentを優先的に受け 取るように設定 (NfcAdapter#enableForeground Dispatch())● onPause() 前述の処理を無効にする (NfcAdapter#disableForegroun dDispatch())
  24. 24. コード@Overridepublic void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mNfcAdapter = NfcAdapter.getDefaultAdapter(getApplicationContext());} NFCが有効かどうか調べたり@Override NFCとデータをやりとりしたりするヤツprotected void onResume() { super.onResume(); ... NFCをかざすことによって mNfcAdapter.enableForegroundDispatch( 生成されるIntentを優先的に this, pendingIntent, filters, techLists); 受け取る}@Overrideprotected void onPause() { super.onPause(); アクティビティが終わろうと mNfcAdapter.disableForegroundDispatch(this); した時に無効化}
  25. 25. コード@Overridepublic void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mNfcAdapter = NfcAdapter.getDefaultAdapter(getApplicationContext());}@Overrideprotected void onResume() { なんか引数多いので super.onResume(); 一つずつ見ていく ... mNfcAdapter.enableForegroundDispatch( this, pendingIntent, filters, techLists);}@Overrideprotected void onPause() { super.onPause(); mNfcAdapter.disableForegroundDispatch(this);}
  26. 26. タグディスパッチの対象とするActivityを指定 mNfcAdapter.enableForegroundDispatch( this, pendingIntent, filters, techLists);● 普通thisで大丈夫● 無効にする(#disableForegroundDispatch)際の引数 にも同じActivityを渡す
  27. 27. タグの受け取り先を指定 mNfcAdapter.enableForegroundDispatch( this, pendingIntent, filters, techLists); Intent intent = new Intent(this, getClass()) .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);● NFCを読み取った時に、どのActivityでIntentを受け取るかを指 定する ● 今回は現在のアクティビティで受け取るので、自分自 身のアクティビティクラス(getClass())を指定 ● PendingIntent … タイミングを指定して発行でき るIntentのこと
  28. 28. IntentFilter を指定 mNfcAdapter.enableForegroundDispatch( this, pendingIntent, filters, techLists); IntentFilter ndefFilter = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED); try { ndefFilter.addDataType("*/*"); } catch (MalformedMimeTypeException e) { throw new RuntimeException("fail", e); } IntentFilter techFilter = new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED); IntentFilter[] filters = new IntentFilter[] { ndefFilter, techFilter };● NDEFフォーマットになっているタグと、後述する techListsに含まれているタグが反応するように指定 ● また、filtersにnullを指定するとすべてに反応するよう になる
  29. 29. 反応するNFC の種類を指定 mNfcAdapter.enableForegroundDispatch( this, pendingIntent, filters, techLists); String[][] techLists = new String[][] { new String[] { NfcF.class.getName() }, new String[] { Ndef.class.getName() } };● FeliCa(NfcF)のカードに反応するようにした ● techListsにnullを設定すると、すべてのNFCに反 応するようになる
  30. 30. タグの受け取り @Override protected void onNewIntent(Intent intent) { Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); if (tag != null) { Toast.makeText(getApplicationContext(), tag.toString(), Toast.LENGTH_SHORT).show(); // 読み取ったデータをごにょごにょする! } }● 取り出したTagの中に、読み取った結果が入っている ● ここからデータをバイト列で取り出し、パー スすることになります
  31. 31. 一応ここまでのソースを Gistに上げましたhttps://gist.github.com/3384118
  32. 32. 開発に便利なアプリの紹介
  33. 33. NFC TagInfo by NXP● NFCをかざすと、タグの情報を 詳細に表示してくれるアプリ ● NXPセミコンダクターズ(旧 フィリップスセミコンダク ターズ)が開発
  34. 34. NFC TagWriter by NXP● 書き込み可能なNFCタグの場合、 情報の書き込みができるアプリ ● こちらもNXPセミコンダクター ズが開発
  35. 35. ご清聴ありがとうございました
  36. 36. 参考資料(おすすめ)Sony Japan | FeliCa | NFCについて | NFCの定義http://www.sony.co.jp/Products/felica/NFC/FeliCa/NFCの概説とAndroidの対応状況http://www.slideshare.net/somafire/felicanfcandroid-6538882i.1 NFC の基本 - ソフトウェア技術ドキュメントを勝手に翻訳http://www.techdoctranslator.com/android/guide/nfc/nfci.2 高度な NFC - ソフトウェア技術ドキュメントを勝手に翻訳http://www.techdoctranslator.com/android/guide/nfc/advanced-nfc
  37. 37. 参考資料NFCポータルサイト|NFCとは|【NFCとは】NFCの基礎知識と特徴についてhttp://www.nfc-world.com/about/01.htmlIC CARD WORLD 2011 - Sony Android tablet & NFC/FeliCahttp://www.slideshare.net/somafire/ic-card-workd-2011-sony-android-tablet-nfcfelicaY.A.M の 雑記帳: NDEF メモhttp://y-anz-m.blogspot.jp/2011/01/ndef.htmlABC2011Winter デ部 NFC (vvakameさんのプレゼン)http://www.slideshare.net/vvakame/abc2011winter-nfcAndroid NFCとNexusSで MifareClassic を読み書きする(後編) (ゆめ技:ゆめみスタッフブログ)http://yumewaza.yumemi.co.jp/2011/03/android_nfc_nexuss_mifare_classic_3.htmlArduino+RC-S620/SでPollingに任意のIDmで応答させる - アトリエのどかhttp://www.atelier-nodoka.net/2012/05/arduino-rcs620s-tginittarget/List of NFC phoneshttp://www.nfcworld.com/nfc-phones-list/japanese_nfc_in_the_real_world_III.pdf (application/pdf オブジェクト)http://www.nfc-forum.org/resources/white_papers/japanese_nfc_in_the_real_world_III.pdfNFCDemo - NFC デモ - ソフトウェア技術ドキュメントを勝手に翻訳https://sites.google.com/a/techdoctranslator.com/jp/resources/samples/samples-index/nfcdemo-index

×