3

我有 Windows Phone 8 设备,很少有 NDEF 格式的 NFC 标签,我想知道,是否可以使用这些标签在我的 WP8 上实现应用程序启动?我已经彻底阅读了这篇关于启动 Windows Phone 8 内置应用程序的 URI 方案的文章,但我没有找到任何与实际启动 3rd 方应用程序相关的链接。我可以启动各种设置屏幕,或浏览器、电子邮件、短信...

更有趣的是,WP Store 上至少有两个 NFC 标签可以“为启动应用程序编写标签”,我已经尝试过了,但是启动不起作用。

所以问题是:是否可以存储 NFC 标签信息以在 WP8 上启动任何 3rd 方应用程序?如果是,这种 URI 方案的格式是什么以及如何使用 WP8 将其写入标签?

4

2 回答 2

7

是的,您可以使用 NFC 标签启动任何 Windows Phone 8 应用程序。LaunchApp您需要在将记录作为第一条记录的标签上放置一条 NDEF 消息。将 NDEF 记录的负载中的平台 ID 设置为“WindowsPhone”,并将应用 ID 设置为 Windows Phone 商店 URL 末尾“{”和“}”之间的十六进制字符串。例如,对于http://www。 windowsphone.com/en-us/store/app/stackoverflow-feeds/226fcc72-69ff-4a85-b945-cbb7f5ea00af到“{226fcc72-69ff-4a85-b945-cbb7f5ea00af}”。

这个库可以帮助创建这样的 NDEF 记录。此处提供了来自 MS 的有限文档。

于 2012-11-23T21:16:10.350 回答
6

要通过 NFC 标签启动您的应用程序,您需要通过在文件中添加扩展名来注册 URI 关联WMAppManifest.xml,如下所示:

<Extensions>
  <Protocol Name="mynfcapp" NavUriFragment="encodedLaunchUri=%s" TaskID="_default" />
</Extensions>

然后您将需要创建一个可以处理 URI 关联的 URI 映射器,如下所示:

public class AssociationUriMapper : UriMapperBase
{
    public override Uri MapUri(Uri uri)
    {
        string url = HttpUtility.UrlDecode(uri.ToString());

        if (url.Contains("mynfcapp:MainPage"))
        {
            int paramIndex = url.IndexOf("source=") + 7;
            string paramValue = url.Substring(paramIndex);

            return new Uri("/MainPage.xaml?source=" + paramValue, UriKind.Relative);
        }

        return uri;
    }
}

下面是编写将启动应用程序的 NFC 标签的代码:

public partial class MainPage : PhoneApplicationPage
{
    private readonly ProximityDevice _proximityDevice;
    private long subId = 0;
    private long pubId = 0;

    public MainPage()
    {
        InitializeComponent();
        _proximityDevice = ProximityDevice.GetDefault();
    }

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        if (_proximityDevice != null)
            subId = _proximityDevice.SubscribeForMessage("WriteableTag", OnWriteableTagArrived);

        base.OnNavigatedTo(e);
    }
    private void OnWriteableTagArrived(ProximityDevice sender, ProximityMessage message)
    {
        var dataWriter = new DataWriter();
        dataWriter.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf16LE;
        string appLauncher = string.Format(@"mynfcapp:MainPage?source=mynfctest");
        dataWriter.WriteString(appLauncher);
        pubId = sender.PublishBinaryMessage("WindowsUri:WriteTag", dataWriter.DetachBuffer());
    }
}
于 2012-11-23T20:35:01.890 回答