我正在使用Ffltter NFC_MANAGER在NFC标签上写东西. 它在iOS上运行得很好 但在Android中,当我试图在空的NFC标签上写入时,它会出现问题. 在具有现有数据的标签上写入数据可以很好地工作.我该怎么修呢?
这是我的iOS代码
Future<bool> _ndefWrite(NdefMessage ndefMessage) async {
Completer<bool> completer = Completer<bool>();
await NfcManager.instance.startSession(
pollingOptions: {NfcPollingOption.iso14443, NfcPollingOption.iso15693},
alertMessage: "NFC 태그를 스캔해주세요.",
onDiscovered: (NfcTag tag) async {
var ndef = Ndef.from(tag);
if (ndef == null || !ndef.isWritable) {
_errorMessage = "쓰기가 불가능한 NFC 태그입니다.";
NfcManager.instance.stopSession(errorMessage: _errorMessage);
completer.complete(false); // Use completer to complete with false
} else {
try {
await ndef.write(ndefMessage);
_alertMessage = "NFC 태그에 성공적으로 기록하였습니다.";
NfcManager.instance.stopSession(alertMessage: _alertMessage);
completer.complete(true); // Complete with true upon success
} catch (error) {
_errorMessage = error.toString();
NfcManager.instance.stopSession(errorMessage: _errorMessage);
completer.complete(false); // Complete with false on error
}
}
},
onError: (NfcError error) async {
_errorMessage = error.message;
NfcManager.instance.stopSession(errorMessage: _errorMessage);
completer.complete(false); // Complete with false on error
}
);
return completer.future.timeout(const Duration(seconds: 10), onTimeout: () {
NfcManager.instance.stopSession(errorMessage: "NFC 스캔 시간 초과.");
if (!completer.isCompleted) {
completer.complete(false); // Complete with false only if not already completed
}
return false;
});
}
这是我的Android代码 我认为问题在于当检测到代码中的空Tag时,它会变为null "Ndef.from(tag)" 但在iOS中,它工作得很好.
Future<bool> _ndefWriteAndroid(NdefMessage ndefMessage) async {
Completer<bool> completer = Completer<bool>();
NFCDialog nfcDialog = NFCDialog(context: context, completer: completer);
nfcDialog.show();
await NfcManager.instance.startSession(
onDiscovered: (NfcTag tag) async {
Navigator.of(context, rootNavigator: true).pop();
var ndef = Ndef.from(tag);
if (ndef == null || !ndef.isWritable) {
_errorMessage = "쓰기가 불가능한 NFC 태그입니다.";
NfcManager.instance.stopSession(errorMessage: _errorMessage);
completer.complete(false); // Use completer to complete with false
} else {
try {
await ndef.write(ndefMessage);
_alertMessage = "NFC 태그에 성공적으로 기록하였습니다.";
NfcManager.instance.stopSession(alertMessage: _alertMessage);
completer.complete(true); // Complete with true upon success
} catch (error) {
_errorMessage = error.toString();
NfcManager.instance.stopSession(errorMessage: _errorMessage);
completer.complete(false); // Complete with false on error
}
}
},
);
return completer.future.timeout(const Duration(seconds: 10), onTimeout: () {
Navigator.of(context, rootNavigator: true).pop();
NfcManager.instance.stopSession(errorMessage: "NFC 스캔 시간 초과.");
if (!completer.isCompleted) {
completer.complete(false); // Complete with false only if not already completed
}
return false;
});
}
这是我在androidManifest.xml中的意图过滤器
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<intent-filter>
<action android:name="android.nfc.action.TECH_DISCOVERED" />
</intent-filter>