祝你有美好的一天。 我已经构建了一个 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 标签的过程中有任何错误或不必要的代码,请帮助我
所以你可以稍微简化一下代码。
从 API 21 上传中,可以使用静态方法 createTextRecord,它允许您轻松创建 Ndef 文本记录,这将取代您的
createTextNdefRecord
方法。
您的代码也可能违反了一些 NFC 准则。 看起来您在直接显示 toast 消息时在 UI 线程上运行此代码。 writeNdefMessage 说
这是一个 I/O 操作,将阻塞直到完成。不得从主应用程序线程调用它
您尚未展示如何获取
Tag
对象,但我猜您使用了 Intents/enableForegroundDispatch,但对于这些,您需要自己完成工作以将它们放在非 UI 线程上。它们也无法提供非常可靠的 NFC 写入体验。最好使用 Tag
检测的 enableReaderMode方法。