首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将两条记录写入NFC标签,一个自定义URI和一个文本数据?

如何将两条记录写入NFC标签,一个自定义URI和一个文本数据?
EN

Stack Overflow用户
提问于 2014-02-25 09:04:26
回答 1查看 1.3K关注 0票数 0

我使用Codeplex语言中的"NDEF Library for Proximity APIs / NFC“编写了一个小的测试应用程序。

我正在向一个标记中写入两条记录:第一条记录是带有自定义方案的NdefUriRecord,第二条记录是NdefTextRecord。

当点击NFC标签时,我的测试应用程序启动为exprected (基于第一条记录中定义的方案)。

然而,为了让我的应用程序读取标记上的第二条记录(在自动启动之后),我必须将标记移开并重新点击,否则应用程序将不会读取标记的第二条记录。

这是正常行为吗?我如何克服这个问题?

如果任何人有另一种方法将2个记录放在一个标签上,一个自定义URI记录启动应用程序,第二个文本记录有一些JSON数据(文本),请让我知道。

谢谢,

代码语言:javascript
复制
using System.Diagnostics;
using System.Windows;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Windows.Networking.Proximity;
using NdefLibrary.Ndef;
using System.Runtime.InteropServices.WindowsRuntime;
using Microsoft.Phone.Tasks;

namespace NfcShare
    {
    public partial class MainPage : PhoneApplicationPage
        {
        private ProximityDevice _device;
        long _subscribedMessageId;

        // Constructor
        public MainPage()
            {
            InitializeComponent();

            // -> Initialize proximity device
            _device = ProximityDevice.GetDefault();

            TxtStatus.Text = "Initialized";
            }

        private void LogStatusMessage( string newStatus )
            {
            // Update the status output UI element in the UI thread
            // (some of the callbacks are in a different thread that wouldn't be allowed
            // to modify the UI thread)
            Dispatcher.BeginInvoke( () =>
                                        {
                                            if ( TxtStatus != null ) TxtStatus.Text = newStatus;
                                        } );
            }


        private void MessageWrittenHandler( ProximityDevice sender, long messageId )
            {
            LogStatusMessage( "Message published!" );
            _device.StopPublishingMessage( messageId );
            }

        // -----------------------------------------------------------------------------------
        // Custom URI Scheme

        // -> Override OnNavigatedTo() and check QueryString
        protected override void OnNavigatedTo( NavigationEventArgs e )
            {
            base.OnNavigatedTo( e );

            if ( NavigationContext.QueryString.ContainsKey( "ms_nfp_launchargs" ) )
                {
                LogStatusMessage( "Launched Args: " + NavigationContext.QueryString[ "ms_nfp_launchargs" ] );
                }
            } 

        // -----------------------------------------------------------------------------------
        // Write tags 
        private void BtnWriteTag_Click( object sender, RoutedEventArgs e )
            {
            NdefUriRecord rec1 = new NdefUriRecord
                                    {
                                        Uri = "nfcshare:Hello+World"
                                    };

            NdefTextRecord rec2 = new NdefTextRecord();
            rec2.Text = "Record 2";

            NdefMessage msg = new NdefMessage();

            msg.Add( rec1 );
            msg.Add( rec2 );

            _device.PublishBinaryMessage(
                "NDEF:WriteTag",
                msg.ToByteArray().AsBuffer(),
                MessageWrittenHandler );

            LogStatusMessage( "Publishing message ..." );
            } 

        // -----------------------------------------------------------------------------------
        // Read tags
        private void BtnSubscribeTag_Click( object sender, RoutedEventArgs e )
            {
            _subscribedMessageId = _device.SubscribeForMessage( "NDEF", MessageReceivedHandler );
            LogStatusMessage( "Subscribed for tag ..." );
            }

        private void MessageReceivedHandler( ProximityDevice sender, ProximityMessage message )
            {
            var rawMsg = message.Data.ToArray();
            var ndefMessage = NdefMessage.FromByteArray( rawMsg );

            // Loop over all records contained in the NDEF message
            foreach ( NdefRecord record in ndefMessage )
                {
                if ( NdefUriRecord.IsRecordType( record ) )
                    {
                    // Convert and extract URI info
                    var uriRecord = new NdefUriRecord( record );
                    LogStatusMessage( "Read tag, URI: " + uriRecord.Uri );
                    }
                else if ( NdefTextRecord.IsRecordType( record ) )
                    {
                    // Convert and extract URI info
                    var textRecord = new NdefTextRecord( record );
                    LogStatusMessage( "Read tag, Text: " + textRecord.Text );
                    }
                }
            // Only read one tag
            _device.StopSubscribingForMessage( _subscribedMessageId );
            }
        }
    }
EN

Stack Overflow用户

发布于 2014-02-26 02:17:19

我通过CodePlex.com从这个库的开发人员那里得到了一个答案。我把他的回答复制到这里:

“您好,这是Windows Phone操作系统的正常行为。如果您注册为通过自定义URI协议启动,则操作系统仅向应用程序发送URI字符串。读取包含多条记录的整个标记的唯一可能是在应用程序运行时读取标记。由于这是操作系统的限制,因此很遗憾,此库对此无能为力,并且当前也无法克服此限制。Br,Andreas Jakl”

如果其他人知道实现和解决我提出的问题的另一种方法,请这样做。

谢谢

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22002544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档