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 書き込み処理が実装できる



コメント