Androidプログラマへの道 〜 Moonlight 明日香 〜 - Text Recordを作成する
NFCのデータ交換フォーマット(NDEF : NFC Data Exchange Format)は, NFC準拠のデバイスとNFCカード/タグとの間で通信を行う際の共通データフォーマットとして定義されている.
その中の1つに, RTD(Record Type Definition) Textフォーマットというのがある.
オフセット(bytes)長さ(bytes)説明
01ステータスバイト
1<n>ISO/IANA言語コード
n+1<m>テキスト文字列. UTF-8 or UTF-16エンコード
ビット番号(0:LSB)説明
70:UTF-8, 1:UTF-16
6RFU(0)
5..0言語コードの長さ

RTD Textフォーマットの作成

  • Nfc04.java
Ndefメッセージを書き込むをベースとしているので, まずはそちらを参照のこと.
RTD Textフォーマットは,
    • UTF8 or UTF16の文字セットを判定する.
    • 言語コードをバイト列に変換する.
    • テキストをバイト列に変換する.
    • Payload[0]のbit7にUTF8/UTF16の情報を, bit0-bit5に言語コードバイト数をセットする.
    • Payload[1]〜[n]まで, 言語コードをセットする.
    • Payload[n+1]から, テキストをセットする.
    • TNFにTNF_WELL_KNOWN, Record TypeにRTD_TEXTを指定し, NdefRecordのインスタンスを生成する.
  private void writeTag(Intent intent, String text) throws IOException, FormatException {
    String action = intent.getAction();
    if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {
      // Ndefメッセージ生成
      NdefRecord record = createTextRecord(true, "en", text);
      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();
    }
  }

  // RTD TextフォーマットのNdefレコード作成
  private NdefRecord createTextRecord(boolean isUtf8, String lang, String text) {
    Charset utfType = isUtf8 ? Charset.forName("UTF-8"):Charset.forName("UTF-16");
    byte[] langCode = lang.getBytes(utfType);
    byte[] textData = text.getBytes(utfType);
    byte[] status = new byte[] {(byte)( (isUtf8 ? 0:(1<<7)) + langCode.length & 0x3f)};
    // Payloadのデータ組み立て
    byte[] payload = new byte[status.length + langCode.length + textData.length];
    System.arraycopy(status, 0, payload, 0, status.length);
    System.arraycopy(langCode, 0, payload, status.length, langCode.length);
    System.arraycopy(textData, 0, payload, status.length + langCode.length, textData.length);
    return new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, new byte[]{}, payload);
  }
  • 動作例
MiniTrack NXP NTAG203

                        (NFC TagInfoで確認)