Androidプログラマへの道 〜 Moonlight 明日香 〜 - Ndefメッセージを書き込む
NFCカード/タグにNdefメッセージを書き込むには, NFCカード/タグがNdefに対応している必要があるので, インテント"android.nfc.action.NDEF_DISCOVERED"が発行されることを利用する.
注) Ndefに未対応のNFCカード/タグでは, インテント"android.nfc.action.NDEF_DISCOVERED"は発行されない.

Ndefメッセージの書き込み

  • Nfc04.java
    • 入力文字列を"text/plain"でNdefレコードデータを作成する.
    • NdefレコードからNdefメッセージを作成する.
    • Intent#getByteArrayExtraメソッドに, NfcAdapter.EXTRA_TAG指定して, Tagのインスタンスを取得する.
    • Ndef#getメソッドで, Ndefのインスタンスを取得する.
    • Ndef#connectメソッドで, NFCカード/タグに接続する.
    • Ndef#writeNdefMessageメソッドで, Ndefメッセージを書き込む.
    • Ndef#closeメソッドで, 接続を終了する.
package com.moonlight_aska.anroid.nfc04;

import java.io.IOException;

import android.nfc.FormatException;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.nfc.tech.Ndef;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.text.SpannableStringBuilder;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class Nfc04 extends Activity {
  private Intent intent = null;
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_nfc04);
    Button btn = (Button)findViewById(R.id.btn_id);
    intent = getIntent();
    btn.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        // TODO Auto-generated method stub
        EditText edit = (EditText)findViewById(R.id.edit_id);
        if (edit.length() > 0) {
          SpannableStringBuilder sp = (SpannableStringBuilder)edit.getText();
          // ICタグへの書き込み
          try {
            writeTag(intent, sp.toString());
          } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          } catch (FormatException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
      }
    });
  }

  private void writeTag(Intent intent, String text) throws IOException, FormatException {
    String action = intent.getAction();
    if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {
      // Ndefメッセージの生成
      NdefRecord record = new NdefRecord(NdefRecord.TNF_WELL_KNOWN,
        "text/plain".getBytes(), new byte[]{}, text.getBytes());
      NdefMessage msg = new NdefMessage(new NdefRecord[] {record});
      // Ndefメッセージの書き込み
      Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
      Ndef ndef = Ndef.get(tag);
      ndef.connect();
      ndef.writeNdefMessage(msg);
      Log.v("NFC", "write " + text);
      ndef.close();
    }
  }
}
  • res/AndroidManifest.xml
Ndefメッセージを取得するを参照.
  • 動作例
MiniTrack NXP NTAG203

                        (NFC TagInfoで確認)