Android NFCアプリハンズオン

9,598 views
9,306 views

Published on

0 Comments
15 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
9,598
On SlideShare
0
From Embeds
0
Number of Embeds
65
Actions
Shares
0
Downloads
81
Comments
0
Likes
15
Embeds 0
No embeds

No notes for slide

Android NFCアプリハンズオン

  1. 1. Android  NFCアプリ   ハンズオン BRILLIANTSERVICE 山下 智樹 / tomorrowkey
  2. 2. 自己紹介 •  山下 智樹 / Tomoki YAMASHITA•  @tomorrowkey•  株式会社ブリリアントサービス
  3. 3. 想定する対象者 •  Eclipseを使ってAndroidアプリを作ったことがある•  Intentの発行ができる•  Intent-Filterを使ってIntentの受信ができる
  4. 4. もくじ •  NFCとは o  一般的なNFCの説明•  AndroidのNFCの仕組み o  AndroidのNFCの実装•  ハンズオン o  NFC-IDを取得・表示するアプリの作成
  5. 5. NFCとは なんぞや
  6. 6. NFCとは •  Near Field Communication•  13.56MHz帯を使った近距離無線通信 o  FeliCaやMIFAREなど•  搬送波を使ってカードに給電する o  http://www.youtube.com/watch?v=xoQcdOux5rg•  NFC Forumで仕様策定 o  http://www.nfc-forum.org/home/•  ISO/IEC 18092(NFC-IP1),ISO/IEC 21481(NFC-IP2)…•  NFC Lab WIki o  https://sites.google.com/site/nfclabo/
  7. 7. チップの種類 一般名称 国際規格 使用例 主なチップメーカMIFARE ISO/IEC  14443  Type  A taspo NXP(旧フィリップス)-­‐‑ ISO/IEC  14443  Type  B 運転免許証、住民基本台帳カード MotorolaFeliCa -­‐‑ 国内交通系ICカード、国内電子マネーカード Sony-­‐‑ ISO/IEC  15693 物流、小売 NFC  IP-­‐‑1  ISO/IEC  18092 NFC  IP-­‐‑2  ISO/IEC  21481 NFC仕様による分類 ⃝ ⃝ NFC-­‐‑A × ⃝ NFC-­‐‑B ⃝ ⃝ NFC-­‐‑F × ⃝ NFC-­‐‑V 周辺の規格について hGps://sites.google.com/site/nfclabo/nfc-­‐‑standard
  8. 8. NFCの3つのモード •  Card Emulation Mode o  まるでカードのように振る舞う•  R/W(Reader/Writer) Mode o  カードを読みこむ o  カードに書き込む o  NDEF(NFC Data Exchange Format) o  RTD(Record Type Definition)•  P2P(Peer-to-Peer) Mode o  端末同士でデータのやり取りをする o  DEP(Data Exchange Protocol) •  NFC-DEP o  LLCP(Logical Link Control Protocol) •  SNEP(Simple NDEF Exchange Protocol) o  Android BEAM •  ISO-DEP o  FALP(FeliCa Adhoc Link Protocol)
  9. 9. AndroidのNFCの仕組み どうなってるの
  10. 10. 待ち受け時のモード ←NFC  OFFの時↑こんな設備で測りました待ち受け時はRW  Modeですブリリアントサービス 省電力ガイド hGp://bs-­‐‑power-­‐‑save-­‐‑project.blogspot.jp/ NFC  ONの時→
  11. 11. アプリケーションまでの道のり •  NFC Service o  NFCチップがいないか常にpollingをつづける o  NFCチップを発見した場合Intentを作成 o  Intentを発行•  NFC Application o  NFC対応であるIntent-Filterを予め定義しておく o  発行されたIntentを受信 o  Intent(Extra)内に入っているデータを使って楽しむ
  12. 12. Intent内のデータ(1) •  NfcAdapter.EXTRA_ID o  “android.nfc.extra.ID” o  byte配列が入っている o  カードを識別するための製造ID o  製造時に付与される o  FeliCa → IDm MIFARE → UID o  同じ通信範囲内にカードがあった場合に識別する用途に使われる o  できるだけ一意に発行されるが、一意である保証はない
  13. 13. Intent内のデータ(2) •  NfcAdapter.EXTRA_NDEF_MESSAGES o  “android.nfc.extra.NDEF_MESSAGES” o  android.nfc.NdefMessage(Parcelable)が入っている o  カード内にNDEFデータが入っている場合のみ設定される
  14. 14. Intent内のデータ(3) •  NfcAdapter.EXTRA_TAG o  “android.nfc.extra.TAG” o  android.nfc.TAG(Parcelable)が入っている o  カードのメタ情報が入っている •  メモリサイズ •  カードの種類 o  カードに直接コマンドを送るために使われる •  Tag → NfcF → transceive(byte[])
  15. 15. ハンズオン
  16. 16. こんなアプリを作ります •  待ち受け状態でカードを検出•  アプリ起動•  IDを表示する
  17. 17. 実装方法は3通り •  待ち受け時にNFCタグを見つけた時に反応する方法 ←今回はコレ•  アプリ起動時にだけNFCタグに反応する方法•  両方
  18. 18. 新しいプロジェクトを作る •  Project Name : NFC-Handson•  Build Target : Android 2.3.3•  Package Name : com.example.android.nfchandson•  Create Activity : MainActivity•  Minimum SDK : 10
  19. 19. AndroidManifest.xml •  PERMISSIONの追加 <uses-permission android:name="android.permission.NFC" />
  20. 20. AndroidManifest.xml •  Intent-Filterの追加 <intent-filter> <action android:name="android.nfc.action.TECH_DISCOVERED" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <meta-data android:name="android.nfc.action.TECH_DISCOVERED" android:resource="@xml/nfc_tech_filter" /> Tips android.nfc.action.TAG_DISCOVERED →  なんでもタグが見つかった場合 android.nfc.action.NDEF_DISCOVERED →  NDEFデータが見つかった場合 TAG  <  TECH  <  NDEF  の強さ hGp://developer.android.com/guide/topics/nfc/nfc.html
  21. 21. nfc_tech_filter.xml •  /res/xml/nfc_tech_filter.xmlを作成する <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <tech-list> <tech>android.nfc.tech.NfcF</tech> </tech-list> </resources>Tips MIFAREの場合 →  android.nfc.tech.NfcA  など ISO/IEC  15693の場合 →  android.nfc.tech.NfcV  など NDEFの場合 →  android.nfc.tech.NDEF  など 詳しくは… 複数指定もアリ hGp://developer.android.com/guide/topics/nfc/nfc.html
  22. 22. とりあえず反応するアプリ完成 •  実行してみよう
  23. 23. NFC-­‐‑IDの取得 •  MainActivity#onCreate(:Bundle)でIDを取得するIntent intent = getIntent(); String action = intent.getAction(); if (action.equals(NfcAdapter.ACTION_TECH_DISCOVERED)) { byte[] rawId = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID); }
  24. 24. 見やすい形式に変換する •  byte配列から文字列に変換するメソッドの作成•  MainActivityに作成private String bytesToText(byte[] bytes) { StringBuilder buffer = new StringBuilder(); for (byte b : bytes) { String hex = String.format("%02X", b); buffer.append(hex).append(" "); } String text = buffer.toString().trim(); return text; }
  25. 25. byte配列からの変換 •  先程作ったメソッドを使いますIntent intent = getIntent(); String action = intent.getAction(); if (action.equals(NfcAdapter.ACTION_TECH_DISCOVERED)) { byte[] rawId = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID); String text = bytesToText(rawId); }
  26. 26. レイアウトの修正 •  /res/layout/main.xmlを修正します<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/nfc_id_textview" <!-- ←New!! --> android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> </LinearLayout>
  27. 27. NFC-­‐‑IDの表示 •  TextViewに表示しますIntent intent = getIntent(); String action = intent.getAction(); if (action.equals(NfcAdapter.ACTION_TECH_DISCOVERED)) { byte[] rawId = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID); String text = bytesToText(rawId); TextView nfcIdTextView = (TextView)findViewById(R.id.nfc_id_textview); // ← New!! nfcIdTextView.setText(id); // ← New!! }
  28. 28. 完成! •  実行してみよう
  29. 29. 課題 •  FeliCa以外のカードに反応するようにしてみよう o  ヒント:android.nfc.tech.Xxx•  どんなカードを読み取ったか表示してみよう o  ヒント:android.nfc.Tag#getTechList()•  アプリ起動中のみ反応するようにしてみよう o  ヒント:NfcAdapter#enableForegroundDispatch()•  同じActivityがいくつも起動してしまう事を回避するには o  ヒント:launchMode
  30. 30. 情報 •  Android NFC Tutorial o  http://developer.android.com/guide/topics/nfc/nfc.html•  NFC Lab o  ML http://groups.google.com/group/nfc-lab o  Wiki https://sites.google.com/site/nfclabo/•  NFC Forum o  http://www.nfc-forum.org/home/•  @hiro99ma o  http://hiro99ma.blogspot.jp/ o  http://twitter.com/hiro99ma
  31. 31. おわり

×