コード例 #1
0
ファイル: NFC.android.cs プロジェクト: sborghini/Plugin.NFC
        /// <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);
                    }
                }
            }
        }
コード例 #2
0
ファイル: NFC.iOS.cs プロジェクト: densen2014/Plugin.NFC
        /// <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);
                        });
                    }
                });
            });
        }
コード例 #3
0
ファイル: NFC.iOS.cs プロジェクト: ryanhz/Plugin.NFC
        /// <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);
                        });
                    }
                });
            });
        }