Intelligent Technology's Technical Blog

株式会社インテリジェントテクノロジーの技術情報ブログです。

たったこれだけ!AndroidからNFCタグにデータを書き込む!

AndroidNFCタグのある日常

ここは香川県にある、とあるオフィス。

「あ、もうこんな時間かー。」

f:id:IntelligentTechnology:20131231115426j:plain:w320

「そろそろお昼ご飯にでも行くか。・・・そうだ、せっかくだから最新のおしゃれなランチスポットを探してみよう!Nexus7を、このNFCタグの上にかざして、と。」


f:id:IntelligentTechnology:20131231124152j:plain:w320

ポポーン♪

f:id:IntelligentTechnology:20131231115623j:plain:w480

「お、出てきた出てきた。・・・あれあれー?、香川県のおしゃれなランチスポットを検索したのに、ほとんどうどん屋だぞー。おかしいなー。・・・ま、いいか、今日もうどんとちくわ天にするか!」


・・・みなさんこんにちは。うどん県在住の中山です。
食べログで、香川県のランチランキングを見ると、本当にほとんどがうどん屋さんなので、今日もしかたなくうどんを食べています。

今回は、上でご紹介したような、Androidスマートフォンタブレットに搭載されている「NFC」の機能を使って、

という操作を、「できるだけ簡単に」実現してみようと思います。

意外と複雑(?)なNFCの規格

しかし、正直に申し上げますと、私は、NFC機能の実装に関して、けっこうナメていました。
実は、NFCの規格というのはどちらかというと複雑で、本気で実装しようとすると、いろいろと考慮すべき部分が出てくることになるのです。

AndroidNFCに関しては、以下の記事が本当に詳しく、役に立ちます。

AndroidによるNFCスマートポスタータグの作成

と言いますか、今回の私の記事の中の技術的な要素に関しては、上記のサイトを全面的に参考にさせてもらいました。(本当にありがとうございます。)

というわけで、この記事では、

難しい話は、少し後回しにさせてもらって、まずは動くものを手軽に体験してみようじゃないか

というコンセプトで、ひとつ紹介してみようと思います。
この記事で、NFC機能の感触をつかんでもらったところで、もっといろいろとNFCの機能を使ってみたい!という方については、前述の

AndroidによるNFCスマートポスタータグの作成

の記事をご覧になるとよいと思います。

必要なもの

今回は以下を利用しました。

Androidタブレット: Nexus7(2012 OS4.4)

NFCタグ: SMARTRAC NFC Tag(Micro Solution Inc.)

SMARTRAC NFC Tag (NTAG203 WPP60 ( Circus ) 20p)

SMARTRAC NFC Tag (NTAG203 WPP60 ( Circus ) 20p)

 

サンプルプログラム

今回作成したのは、「NFCタグにデータを書き込む」ほうのアプリだけです。
NFCタグを読み取って、ウェブサイトにアクセスする」ほうは、Androidスマートフォンタブレットを、データ書き込み済みのNFCタグにかざすだけで、OSが自動的にウェブサイトの表示までおこなってくれます。

NFCタグにデータを書き込む」サンプルアプリ「MyNFCWriter」は、こちらから取得できます。

以下、順をおって、プログラムの中身を見ていきます。

AndroidManifest.xmlの設定

AndroidManifest.xmlには、以下のように「NFC」機能を利用するための設定を追加します。(ファイル全体は、こちらを参照してください。)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="jp.co.iti.mynfcwriter"
  android:versionCode="1"
  android:versionName="1.0" >

  <uses-sdk
    android:minSdkVersion="14"
    android:targetSdkVersion="19" />

  <!-- NFC機能を利用するためのパーミッション設定を追加します -->
  <uses-permission android:name="android.permission.NFC" />

  <!-- NFC機能を持つ端末だけに、当アプリをインストールできるようにします -->
  <uses-feature 
    android:name="android.hardware.nfc" 
    android:required="true" />

  <application
    android:allowBackup="true"
  ・・・
Activityの実装

メインActivityは以下のように実装しています。
このサンプルアプリを起動して、NFCタグにかざすと、「onNewIntent」が呼び出され、その中で、タグへのデータ書き込み処理が行われます。
(ファイル全体は、こちらを参照してください。)

public class MainActivity extends Activity {
  // NFCタグに書き込むURL文字列
  // ここでは例として、「食べログ」サイトの「香川県 ランチランキング」ページの
  // URLを指定しています
  // このTARGET_URL定数に指定するURL文字列を変えることで、お好きなウェブサイトを
  // 表示することができるようになります
  private static final String TARGET_URL = "http://bit.ly/1cBnsuk";

  // 独自に作成した、NFCタグ書き込み用クラスのインスタンス
  private NfcWriter nfcWriter = null;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // NFCタグ書き込み用クラスのインスタンスを生成します
    this.nfcWriter = new NfcWriter(this);
  }

  @Override
  protected void onResume() {
    super.onResume();

    PendingIntent pendingIntent = this.createPendingIntent();

    // NFCタグ書き込み用クラスの機能を有効化します
    // (NFCタグがかざされると、onNewIntentが呼び出されるようにします)
    this.nfcWriter.enable(this, pendingIntent);
  }

  @Override
  protected void onPause() {
    super.onPause();

    // NFCタグ書き込み用クラスの機能を無効化します
    this.nfcWriter.disable(this);
  }

  @Override
  protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);

    // NFCタグがかざされた際に起動し、指定されたURL文字列をそのタグに書き込みます
    // (書き込みに成功すると、"Completed." というメッセージが表示されます)
    if (this.nfcWriter.write(this, intent, TARGET_URL)) {
      Toast.makeText(this, "Completed.", Toast.LENGTH_SHORT).show();
    } else {
      Toast.makeText(this, this.nfcWriter.getErrorMessage(), Toast.LENGTH_SHORT).show();
    }
  }
  ・・・
NFCタグ書き込み用クラス「NfcWriter」

NFCタグへのデータ書き込み機能を提供するクラスを作成します。
実装内容については、「AndroidによるNFCスマートポスタータグの作成」サイトに記載されている内容を、ほぼそのまま利用させてもらっています。
ファイルの全体は、こちらを参照してください。
 

実践

NFCタグにデータを書き込む

もうこれだけで、NFCタグにURLを書き込むアプリができあがりました。
このサンプルアプリを起動して、そのまま、そのAndroidスマートフォンタブレット)をNFCタグにかざします。

f:id:IntelligentTechnology:20131231135140j:plain:w400

データの書き込みに成功すると、(Nexus7の場合は「ポポーン♪」みたいな音と)"Completed." というメッセージが表示されます。(タグへの書き込みは、何回でもやり直しできるようです。)

NFCタグを読み取る

サンプルアプリを閉じて、再度、Androidスマートフォンタブレット)を、NFCタグにかざします。
タグのデータの読み取りに成功すると、(Nexus7の場合は「ポポーン♪」みたいな音の後、)ブラウザが自動的に起動し、指定されたウェブサイトが表示されます。

「MainActivity」クラスの「TARGET_URL」定数に設定するURLを変えることで、お好きなウェブサイトを起動することができるようになります。

敷居は低いが奥も深い

とりあえずタグを読み取ってウェブサイトを表示するだけであれば、とても簡単に実現することができました。
本当は、いろいろと考慮すべき部分は多々あるようなのですが、今回のように、

「URL書き込み」→「ウェブサイト表示」

といった、定型的なフォーマットであれば、とても簡単に実装することができました。

しかしNFC機能を用いてできることは、もちろんこれだけではありません。

今後も、NFCの可能性をどんどん探っていこうと思っています。
 

追記:

新たに「たったこれだけ!AndroidからNFCタグにデータを書き込む!その2」という記事も掲載しました。
こちらでは、さらにいろいろなNFCタグからのアプリ起動パターンを試しています。合わせてご覧ください。