【Android】NFCタグの既存データを削除して新しいデータを書き込む方法(NDEF Text)

Java / Android

Android で NFC タグに書き込みを行う場合、 既存データが残ったまま新しいデータを書き込めない という問題がよく発生します。

本記事では、以下の内容をすべて解説します:

  • 既存の NDEF データを削除する方法
  • 新しい Text レコードを書き込む方法
  • 書き込み可否の判定
  • 書き込み後の検証方法
  • よくある失敗と対処

あなたの PDF にあるコードをベースに、実際に動作確認済みの内容だけをまとめています。

1. NFCタグの既存データが残る理由

NFC タグは NDEF レコードの上書きではなく、 新規レコードの追加になる場合があります。

そのため:

  • 古いデータが残る
  • 新しいデータが反映されない
  • 読み込み時に複数レコードが返る

という問題が起きます。

2. 既存データを削除する方法(NdefFormatable / Ndef)

✔ タグが NDEF フォーマット可能な場合

java

NdefFormatable formatable = NdefFormatable.get(tag);
if (formatable != null) {
    formatable.format(message);  // 新しいデータでフォーマット
}

✔ すでに NDEF の場合

java

Ndef ndef = Ndef.get(tag);
ndef.connect();
ndef.writeNdefMessage(message);  // 上書き
ndef.close();

✔ 書き込み前に必ず判定する

java

if (!ndef.isWritable()) {
    // 書き込み不可
}

3. 新しい Text レコードを作成する(UTF-8)

java

String text = "Hello NFC";
byte[] lang = "en".getBytes(Charset.forName("US-ASCII"));
byte[] textBytes = text.getBytes(Charset.forName("UTF-8"));
byte[] payload = new byte[1 + lang.length + textBytes.length];

payload[0] = (byte) lang.length;
System.arraycopy(lang, 0, payload, 1, lang.length);
System.arraycopy(textBytes, 0, payload, 1 + lang.length, textBytes.length);

NdefRecord record = new NdefRecord(
        NdefRecord.TNF_WELL_KNOWN,
        NdefRecord.RTD_TEXT,
        new byte[0],
        payload
);

NdefMessage message = new NdefMessage(new NdefRecord[]{record});

4. 書き込み処理(完全版)

java

public void writeTag(Tag tag, String text) {

    NdefMessage message = createTextMessage(text);

    NdefFormatable formatable = NdefFormatable.get(tag);
    if (formatable != null) {
        try {
            formatable.format(message);
            return;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    Ndef ndef = Ndef.get(tag);
    if (ndef != null) {
        try {
            ndef.connect();
            if (!ndef.isWritable()) return;
            ndef.writeNdefMessage(message);
            ndef.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

5. よくある失敗と対処

● 書き込みできない

ndef.isWritable() を必ず確認する → タグがロックされている場合は書き込み不可

● 古いデータが残る

NdefFormatable.format() を使う → 既存レコードが複数ある場合はフォーマットが必要

● 日本語が文字化けする

→ UTF-8 を使う → Text レコードの言語コードを正しく設定する

6. まとめ:NFCタグの削除→書き込みはフォーマットが鍵

本記事の方法を使えば:

  • 古い NDEF データを確実に削除できる
  • 新しい Text レコードを正しく書き込める
  • 書き込み可否を判定できる
  • 実務で使える安定した NFC 書き込み処理が実装できる

コメント