Android向けNFCアプリ作成の基本
最近手元に遊べる端末も増えてきたことだし、@tomorrowkey氏のAndroid NFCアプリハンズオン資料を片手に頑張ってみた。ほぼ初めてのAndroid開発である。
ここではNFC機能搭載端末がFeliCa IDmを読み取ったらアプリを起動し、読み取ったIDmを表示するようなものを作ってみる。
Androidの開発環境を整える
できないわけじゃないんだけど、いつも敷居が高く感じられてしまうAndroid開発環境の構築。構築したらしたでいつの間にかできていることが多いので聞かれたときに詰まる。丁度最近デスクトップマシンのOS(Windows7 64bit)をクリーンインストールしたので、その手順を簡単に整理しておきたい。
- JDKのインストール
OracleのサイトからJDKを落としてきてインストールする。Java FXのインストールは不要。執筆現在、64bit環境であっても32bit版のを入れておくのが吉(さもなくばAndroid SDKの導入でつまる)。 - Eclipseを入手
ダウンロードページから。日本語がお好みならPleiades。 - Android SDKを入手
ダウンロードページから。インストーラ版が楽。 - ADTを入れる
ADTはAndroid SDKのEclipse用プラグイン。Eclipseの中から入れる。
手順は「ヘルプ」>「新規ソフトウェアのインストール」で「作業対象」にhttps://dl-ssl.google.com/android/eclipse/を入れてあとはそれっぽく。 - 実機の準備
実機上の「設定」>「開発者向けオプション」などから「USBデバッグ」にチェックを入れる。実機転送に必要なUSBドライバは「<機種名> driver」などで検索して持ってくる。Galaxy Nexusの場合は「Android SDK Manager」でダウンロードできる「Google USB Driver」でいいっぽい。
これでとりあえずの開発環境の構築ができるはず。
FeliCa IDmを表示するアプリを作ってみる
さて、ここからが本題である。これは以下の手順で行うと良い。
- Androidプロジェクトを作成する
- AndroidManifest.xmlにNFCのPermission記述を追加する
- AndroidManifest.xmlにIntent-Filterの記述を追加する
- android.nfc.tech.*用の新たなxmlファイルを作成する
- Activityファイルを作成する
1. Androidプロジェクトを作成する
Eclipseの「ファイル>新規>その他」から「Android プロジェクト」を探す。
Project Nameは任意に、ビルド・ターゲットはNFC機能が使える「2.3.3」以上に。アクティビティ名は「MainActivity」とかにしとく。
2. AndroidManifest.xmlにNFCのPermission記述を追加する
まずはプロジェクト以下にある「AndroidManifest.xml」を見てみる。
このファイルにはアプリの大まかな画面の種類や使用するデバイスの機能などを記述するらしい。ここに「NFC機能を使いますよ」的な記述をしてやらないといけない。
こんな感じだそうな。
3. AndroidManifest.xmlにIntent-Filterの記述を追加する
IntentはAndroid OSから通知される事象のこと(というのが私の認識)である。アプリにIntent-Filterを追加することによりこのIntentに応じた処理をすることができるようになる。
アプリにIntent-Filterを追加するには先ほどと同じ「AndroidManifest.xml」に次のように記述してやると良い。
※ここから追加
※ここまで追加
ここではIntent-Filter記述のほかに次の項で作るxmlファイルのための記述も入れた。だんだんと面倒になってきたためだ(ぉぃ)。
4. android.nfc.tech.*用の新たなxmlファイルを作成する
プロジェクト以下の「res」フォルダの下位に「xml」というフォルダを生成してやる。その上で「xml」フォルダに以下の「nfc_tech_filter.xml」を追加してやる。
android.nfc.tech.NfcF
5. Activityファイルを作成する
「MainActivity.java」を以下のように記述する。
package jp.atndk.nfc.handson;
import android.app.Activity;
import android.content.Intent;
import android.nfc.NfcAdapter;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
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);
nfcIdTextView.setText(text);
}
}
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;
}
}
これを実機に転送した上で実機の待ち受け画面を表示し、適当なFeliCaに実機をかざしてやるとFeliCa IDmを表示させることができるだろう。
やってみよう
ここから拡張する案としては、以下のものが考えられる。
- MIFAREやTypeBのID読み込みに拡張してみる
- せっかくなのでどのテクノロジーか判断してみる
ここまでできれば、NFC TagInfoがどのように実装されているか想像できるようになるのではないか。