我使用Codeplex语言中的"NDEF Library for Proximity APIs / NFC“编写了一个小的测试应用程序。
我正在向一个标记中写入两条记录:第一条记录是带有自定义方案的NdefUriRecord,第二条记录是NdefTextRecord。
当点击NFC标签时,我的测试应用程序启动为exprected (基于第一条记录中定义的方案)。
然而,为了让我的应用程序读取标记上的第二条记录(在自动启动之后),我必须将标记移开并重新点击,否则应用程序将不会读取标记的第二条记录。
这是正常行为吗?我如何克服这个问题?
如果任何人有另一种方法将2个记录放在一个标签上,一个自定义URI记录启动应用程序,第二个文本记录有一些JSON数据(文本),请让我知道。
谢谢,
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 );
}
}
}发布于 2014-02-26 02:17:19
我通过CodePlex.com从这个库的开发人员那里得到了一个答案。我把他的回答复制到这里:
“您好,这是Windows Phone操作系统的正常行为。如果您注册为通过自定义URI协议启动,则操作系统仅向应用程序发送URI字符串。读取包含多条记录的整个标记的唯一可能是在应用程序运行时读取标记。由于这是操作系统的限制,因此很遗憾,此库对此无能为力,并且当前也无法克服此限制。Br,Andreas Jakl”
如果其他人知道实现和解决我提出的问题的另一种方法,请这样做。
谢谢
https://stackoverflow.com/questions/22002544
复制相似问题