使用 PN532 阅读器发送文本文件到 NFC 标签

问题描述 投票:0回答:1

祝你有美好的一天。 我已经构建了一个 NFCTagFlow 代码,用于将文本文件发送到 NFC 标签。 这是使用RF881阅读器的简化版本 我担心的是可能有一个不必要的过程将文件发送到标签

这是正确的吗?

public class NFCTagFlow {
    private Context context;

    public NFCTagFlow(Context context) {
        this.context = context;
    }

    public NdefMessage sendFileToTag(Tag detectedTag) {
        try {
            String filePath = "/storage/self/primary/Upload_in_NFC.txt";
            StringBuilder fileDataStringBuilder = new StringBuilder();

            // Read the file data into a buffer and get the string representation
            readFileToBuffer(filePath, fileDataStringBuilder);
            String fileContent = fileDataStringBuilder.toString();

            // Encode the file data into an NDEF message
            NdefMessage ndefMessage = encodeNdefData(fileContent);

            // Write the NDEF message to the NFC tag
            boolean success = writeNdefMessageToTag(detectedTag, ndefMessage);

            // If successful, return the NdefMessage, otherwise return null
            return success ? ndefMessage : null;

        } catch (IOException e) {
            e.printStackTrace();
        }
        return null; // Return null if writing failed
    }

    private void readFileToBuffer(String filePath, StringBuilder fileDataStringBuilder) throws IOException {
        File file = new File(filePath);
        if (!file.exists() || !file.isFile()) {
            throw new IOException("Invalid file path or file does not exist");
        }

        try (FileInputStream fis = new FileInputStream(file);
             InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8);
             BufferedReader br = new BufferedReader(isr)) {
            String line;
            while ((line = br.readLine()) != null) {
                fileDataStringBuilder.append(line);
            }
        }
    }

    private NdefMessage encodeNdefData(String data) {
        NdefRecord ndefRecord = createTextNdefRecord(data);
        return new NdefMessage(new NdefRecord[]{ndefRecord});
    }

    private NdefRecord createTextNdefRecord(String text) {
        byte[] language = Locale.getDefault().getLanguage().getBytes(StandardCharsets.US_ASCII);
        byte[] textBytes = text.getBytes(StandardCharsets.UTF_8);
        int languageLength = language.length;
        int textLength = textBytes.length;

        byte[] payload = new byte[1 + languageLength + textLength];
        payload[0] = (byte) (languageLength & 0x1F);

        System.arraycopy(language, 0, payload, 1, languageLength);
        System.arraycopy(textBytes, 0, payload, 1 + languageLength, textLength);

        return new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, new byte[0], payload);
    }

    public boolean writeNdefMessageToTag(Tag detectedTag, NdefMessage ndefMessage) {
        Ndef ndef = Ndef.get(detectedTag);
        if (ndef != null) {
            try {
                ndef.connect();
                ndef.writeNdefMessage(ndefMessage);
                showToast("NDEF message written successfully");
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                showToast("Failed to write NDEF message");
            } finally {
                try {
                    ndef.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } else {
            showToast("NDEF not supported on this tag");
        }
        return false;
    }

    private void showToast(String message) {
        Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
    }
}

我应该进一步简化文本文件转换的代码吗? 如果在将文本文件发送到 nfc 标签的过程中有任何错误或不必要的代码,请帮助我

java android nfc pn532
1个回答
0
投票

所以你可以稍微简化一下代码。

从 API 21 上传中,可以使用静态方法 createTextRecord,它允许您轻松创建 Ndef 文本记录,这将取代您的

createTextNdefRecord
方法。

您的代码也可能违反了一些 NFC 准则。 看起来您在直接显示 toast 消息时在 UI 线程上运行此代码。 writeNdefMessage

这是一个 I/O 操作,将阻塞直到完成。不得从主应用程序线程调用它

您尚未展示如何获取

Tag
对象,但我猜您使用了 Intents/enableForegroundDispatch,但对于这些,您需要自己完成工作以将它们放在非 UI 线程上。它们也无法提供非常可靠的 NFC 写入体验。最好使用 Tag 检测的
enableReaderMode
方法。

© www.soinside.com 2019 - 2024. All rights reserved.