
第2回 まずは使ってみよう!HCEのお試しアプリを作ってみた
アメリカではマクドナルドでAndroid Payが使えるようになったと噂されてる今日この頃、皆さんいかがお過ごしでしょうか?どんどんNFC HCEが身近なものになってきてますね。
さて、第1回ではNFC HCEが何かをお伝えしましたが、今回は実際にNFC HCEを使ってみたいと思います。
準備するもの
(1)NFC R/Wに対応したAndroid端末(Android 4.4以降)
(2)NFC HCEに対応したAndroid端末
(3)Android StudioをインストールしたPC
あれ、もう難しくなってきました??いやいや、これも結構簡単なんですよ。
(1)NFC R/Wに対応したAndroid端末(Android 4.4以降)
これは、
- 設定アプリ内「端末情報」の「Androidバージョン」の記載が4.4以降。
- 「無線とネットワーク」の設定周辺に、NFCの設定項目がある。
の条件に当てはまれば、問題ないでしょう。おそらくここ1年以内に買ったAndroid端末の殆どは、この条件に当てはまると思います。
(2)NFC HCEに対応したAndroid端末
これを確認するためには、2つの方法があります。
一つ目の方法は、Androidの知識に自信のある方向け。対象端末のAndroid featureに”android.hardware.nfc.hce”が入っているかを調べましょう。
二つ目の方法はアプリに頼る方法。ここにNFC HCEに対応しているかを判断出来るアプリがあります。
このアプリを対象端末にインストールして、[About]の中の[NFC features]内にある[HCE support]項がYesになっているかどうかで確認が出来ます。
私が確認出来たのは、Nexus 5、Nexus 6、Nexus 7(2013)くらいですね。
(3)Android StudioをインストールしたPC
これはWeb上にたくさん情報があると思うので、ここでは大きくは触れません。
ここからダウンロードして、インストールしてください。
アプリを作ってみる
さて、ここからは実際にアプリを作ってみます。
とはいっても、実はAndroid Studioの中にサンプルソースコードが存在してるので、今回はそのサンプルソースコードを使って、実際にNFC HCEを体験してみましょう。
Card Emulation側
まずはAndroid Studioを起動して、以下の通り設定してみてください。
これでCard Emulationプロジェクトが開きます。
Android端末とPCをUSBケーブルで接続したら、画面中央の上のほうにある三角マークをクリックして、アプリを起動しましょう。
デバイスを選択する画面が別で開きますので、ここでは接続しているAndroid端末を選択してください。なお、Card Emulation側で使用するAndroid端末はNFC HCEに対応しているものを使用します。
Card Reader側
Card Readerのソースコードもサンプルアプリとして取得できます。
やり方は、Card Emulationの時とほぼ同じです。
(サンプルソースコードを選択する画面で”Card Reader”を選択する。その他はCard Emulationの時と同じ手順でOK)
アプリを起動してみる
では、実際に動かしてみましょう。
私たちトンガロイドメンバーは
- NFC R/Wに対応したAndroid端末(Android 4.4以降) として Nexus7(2012) ※lollipopへアップデート済み
- NFC HCEに対応したAndroid端末としてNexus6
の2つのAndroid端末を使用しました。
まず、Card Emulation側を起動してみましょう。
アプリを起動すると下記のような画面が現れます。
次に、Card Reader側を起動してみましょう。
Card Reader側はCardの読み込みを待っているので「Waiting・・・」と表示されています。
ここで、Card Emulation側とCard Reader側のNFC部分を近づけて通信させてみると・・・
Card ReaderでCard Emulation側の番号が読み取れました!
実際に動かしてみたときの動画はこちら。
ソースコードのポイント
さて、今回使用したソースコードの内容に関しても少し説明しておきます。
Card Emulation側のポイント
Android4.4からは簡単にHCEのサービスを実装できるようにHostApduServiceというクラスが準備されています。サンプルソースコード上でもCardService.javaはこのクラスを継承して作成されています。
HostApduService
1 2 3 4 5 6 7 8 9 10 |
public class CardService extends HostApduService { @Override public byte[] processCommandApdu(byte[] apdu, Bundle extras) { ... } @Override public void onDeactivated(int reason) { ... } } |
このクラスではprocessCommandApdu()とonDeactivated()の2つの抽象メソッドが定義されているためこれらの関数を実装することが必要です。
processCommandApdu()はCard Reader側と通信が確立してReader側から要求を受けたときにコールされます。また、onDeactivated()は通信が途切れた時にコールされるメソッドです。
Card Reader側のポイント
Reader側では、NfcAdapter#enableReaderMode()の実施が必要になります。
このメソッドは、NFCコントローラをリーダモードに制限するもので、このモードの間は、Android Beamやエミュレーションモードは、無効化されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ・・・ enableReaderMode(); ・・・ } private void enableReaderMode() { Log.i(TAG, "Enabling reader mode"); Activity activity = getActivity(); NfcAdapter nfc = NfcAdapter.getDefaultAdapter(activity); if (nfc != null) { nfc.enableReaderMode(activity, mLoyaltyCardReader, READER_FLAGS, null); } } |
NfcAdapter#enableReaderMode()を実施せずに、CardEmuration側の端末と近づけて読み取りを行うと、
Android Beamや、詳しくは述べませんが、LLCPという別の接続が働いてしまい、HCEの読み取りが出来ないのです。
このメソッドは、Android4.4以降に新たに追加されたものなので、Reader側にも、Android4.4以降の端末が必要になるわけですね。
このあたりのより詳しい内容に関してはAndroid Developerのサイトで解説されています。
次回は、このサンプルアプリをベースに、変更を加えて遊んでみたいと思います!お楽しみに!