/// <summary> /// Handle Android OnNewIntent /// </summary> /// <param name="intent">Android <see cref="Intent"/></param> internal void HandleNewIntent(Intent intent) { if (intent == null) { return; } if (intent.Action == NfcAdapter.ActionTagDiscovered || intent.Action == NfcAdapter.ActionNdefDiscovered) { _currentTag = intent.GetParcelableExtra(NfcAdapter.ExtraTag) as Tag; if (_currentTag != null) { var nTag = GetTagInfo(_currentTag); if (_isWriting) { // Write mode OnTagDiscovered?.Invoke(nTag, _isFormatting); } else { // Read mode OnMessageReceived?.Invoke(nTag); } } } }
/// <summary> /// Event raised when NFC tags are detected /// </summary> /// <param name="session">iOS <see cref="NFCTagReaderSession"/></param> /// <param name="tags">Array of iOS <see cref="INFCTag"/></param> public override void DidDetectTags(NFCTagReaderSession session, INFCTag[] tags) { _customInvalidation = false; _tag = tags.First(); var connectionError = string.Empty; session.ConnectTo(_tag, (error) => { if (error != null) { connectionError = error.LocalizedDescription; Invalidate(session, connectionError); return; } var ndefTag = GetNdefTag(_tag); if (ndefTag == null) { Invalidate(session, UIMessages.NFCErrorNotCompliantTag); return; } ndefTag.QueryNdefStatus((status, capacity, error) => { if (error != null) { Invalidate(session, error.LocalizedDescription); return; } if (status == NFCNdefStatus.NotSupported) { Invalidate(session, UIMessages.NFCErrorNotSupportedTag); return; } var identifier = GetTagIdentifier(ndefTag); var nTag = new TagInfo(identifier) { IsWritable = status == NFCNdefStatus.ReadWrite }; if (_isWriting) { // Write mode OnTagDiscovered?.Invoke(nTag, _isFormatting); } else { // Read mode ndefTag.ReadNdef((message, error) => { if (error != null) { Invalidate(session, UIMessages.NFCErrorRead); return; } if (message == null) { Invalidate(session, UIMessages.NFCErrorEmptyTag); return; } session.AlertMessage = UIMessages.NFCSuccessRead; nTag.Records = GetRecords(message.Records); OnMessageReceived?.Invoke(nTag); Invalidate(session); }); } }); }); }
/// <summary> /// Event raised when NFC tags are detected /// </summary> /// <param name="session">iOS <see cref="NFCTagReaderSession"/></param> /// <param name="tags">Array of iOS <see cref="INFCTag"/></param> public override void DidDetectTags(NFCTagReaderSession session, INFCTag[] tags) { _customInvalidation = false; _tag = tags.First(); var connectionError = string.Empty; session.ConnectTo(_tag, (error) => { if (error != null) { connectionError = error.LocalizedDescription; Invalidate(session, connectionError); return; } var ndefTag = GetNdefTag(_tag); if (ndefTag == null) { Invalidate(session, Configuration.Messages.NFCErrorNotCompliantTag); return; } ndefTag.QueryNdefStatus((status, capacity, error) => { if (error != null) { Invalidate(session, error.LocalizedDescription); return; } var isNdefSupported = status != NFCNdefStatus.NotSupported; var identifier = GetTagIdentifier(ndefTag); var nTag = new TagInfo(identifier, isNdefSupported) { IsWritable = status == NFCNdefStatus.ReadWrite, Capacity = Convert.ToInt32(capacity) }; if (!isNdefSupported) { session.AlertMessage = Configuration.Messages.NFCErrorNotSupportedTag; OnMessageReceived?.Invoke(nTag); Invalidate(session); return; } if (_isWriting) { // Write mode OnTagDiscovered?.Invoke(nTag, _isFormatting); } else { // Read mode ndefTag.ReadNdef((message, error) => { // iOS Error: NFCReaderError.NdefReaderSessionErrorZeroLengthMessage (NDEF tag does not contain any NDEF message) // NFCReaderError.NdefReaderSessionErrorZeroLengthMessage constant should be equals to 403 instead of 304 // see https://developer.apple.com/documentation/corenfc/nfcreadererror/code/ndefreadersessionerrorzerolengthmessage if (error != null && error.Code != 403) { Invalidate(session, Configuration.Messages.NFCErrorRead); return; } session.AlertMessage = Configuration.Messages.NFCSuccessRead; nTag.Records = GetRecords(message?.Records); OnMessageReceived?.Invoke(nTag); Invalidate(session); }); } }); }); }