0

FormatException の 1 つである場合、元の質問を変換の 1 つと間違えました。EditText 入力に基づいて NFC タグを書き込もうとしています。以下の関連コード:

EditText msgInput = (EditText) findViewById(R.id.editText1);

...

try {
    String msg = msgInput.getText().toString();
    byte[] bytes = msg.getBytes();
    messagePayload = bytes;
}

...

NdefMessage message;
try {
message = new NdefMessage(messagePayload);
} catch (FormatException e) {
// ups, illegal ndef message payload
Log.e(TAG, "Format exception from illegal ndef message payload");

return;
}

そして、常にその FormatException をスローしています。理由はわかりません。「xyz」や「stuff」などを書こうとしているところです。それぞれの間の Log ステートメントから正しいバイトを取得していることを確認します。

4

1 に答える 1

2

文字列のバイトだけを与えることは、有効な NdefMessage ペイロードではありません。そのため、例外が発生します。NFC フォーラム標準に従ってフォーマットされた 1 つのテキスト レコードで正しい NdefMessage を構築するには、次のコードを使用します。

            String msg = msgInput.getText().toString();
    byte[] languageCode;
    byte[] msgBytes;
    try {
        languageCode = "en".getBytes("US-ASCII");
        msgBytes = msg.getBytes("UTF-8");
    } catch (UnsupportedEncodingException e) {
        return;
    }

    byte[] messagePayload = new byte[1 + languageCode.length
            + msgBytes.length];
    messagePayload[0] = (byte) 0x02; // status byte: UTF-8 encoding and
                                        // length of language code is 2
    System.arraycopy(languageCode, 0, messagePayload, 1,
            languageCode.length);
    System.arraycopy(msgBytes, 0, messagePayload, 1 + languageCode.length,
            msgBytes.length);

    NdefMessage message;
    NdefRecord[] records = new NdefRecord[1];
    NdefRecord textRecord = new NdefRecord(NdefRecord.TNF_WELL_KNOWN,
            NdefRecord.RTD_TEXT, new byte[]{}, messagePayload);
    records[0] = textRecord;
    message = new NdefMessage(records);

NDEF プロトコルの詳細については、次のドキュメントを参照してください: https://engineering.purdue.edu/477grp14/Specs/NFC/NDEFTECH.pdf

テキスト RTD の詳細については、http: //www.maintag.fr/fichiers/pdf-fr/nfcforum-ts-rtd-text-1-0.pdfを参照してください。

于 2012-07-24T22:35:00.440 に答える