【问题标题】:Sending URL from Android to Windows Phone via NFC gives Play Store link通过 NFC 从 Android 向 Windows Phone 发送 URL 会提供 Play Store 链接
【发布时间】:2014-01-22 12:35:22
【问题描述】:

我正在尝试使用 NFC 将 URL 从 Android 应用程序发送到 WP8 手机。

发送到 Android 设备时,URL 会正确发送。但是,当发送到 WP8 时,IE 会加载一个指向 Play 商店的链接,而不是我要发送的链接(例如“http://www.stackoverflow.com”)。

Play 商店链接是:“https://play.google.com/store/apps/details?id=com.example.conductrnfc&feature=beam”。其中“com.example.conductrnfc”是项目中的包名。

我用来生成 NFC 消息的代码如下所示。我在这里做错了什么会破坏与 WP8 的兼容性吗?

NfcAdapter nfc = NfcAdapter.getDefaultAdapter(this);
nfc.setNdefPushMessageCallback(new NfcAdapter.CreateNdefMessageCallback() {
    @Override
    public NdefMessage createNdefMessage(NfcEvent event)
    {
        NdefRecord uriRecord = NdefRecord.createUri(urlString);
        return new NdefMessage(new NdefRecord[] { uriRecord });
    }
}, 
this);

【问题讨论】:

  • 您是否还在邮件中附加了 AAR?考虑到您的代码,它看起来不像,但据我所知,这是将应用程序从 NFC 消息引导至 Play 商店的一件事。
  • 我没有附加 AAR,URL 是消息中唯一的记录。
  • 您能否显示您发送到 WP8 的链接以及 WP8 中出现的确切内容?
  • @M.C. - 实际代码是NdefRecord uriRecord = NdefRecord.createUri(webView.getUrl());,webView 已指向活动的 onCreate 中的网站(不是 Play 商店)。 WP8看到的是问题中提到的URL
  • @RobertLevy,所以您发送到 WP8 的任何 URL 都会将 URL 发送到您在应用商店中的应用?

标签: android windows-phone-8 nfc nfc-p2p android-beam


【解决方案1】:

尽管我仍然错过了来自 OP 的更多调试结果,但我想我会试一试:

由于命令中的讨论显示在与 WP8 手机交互时不会调用 createNdefMessage 回调,因此会出现这种情况以及如何防止这种情况会很有趣。不幸的是,我没有关于活动的实际生命周期的详细信息,所以我只能猜测可能出了什么问题。

  1. 注册的createNdefMessage 回调可能不会被调用的一个原因是注册回调的活动不再在前台。所以Android设备和WP8设备可能存在差异导致当前Activity暂停。

  2. 另一个原因是 WP8 设备在 Android NFC 堆栈有时间调用 createNdefMessage 回调方法之前中断了通信。但是,这应该是可以检测到的,因为 Beam UI 通常会在用户能够点击之前消失。

原因 1 的一个原因可能是 WP8 设备本身发送了一个 NDEF 消息,导致在 Android 设备上进行 Intent 处理。如果是这种情况,解决这个问题的方法可能是注册前台调度系统。这将阻止常规的意图处理,并将所有传入的 NDEF 消息直接发送到当前活动:

@Override
public void onResume() {
    super.onResume();
    NfcAdapter adapter = NfcAdapter.getDefaultAdapter(this);
    PendingIntent pi = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
    adapter.enableForegroundDispatch(this, pi, null, null);
}

@Override
public void onNewIntent(Intent intent) {
    if (intent != null) {
        String action = intent.getAction();
        if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action) ||
            NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action) ||
            NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)) {
            Log.d("NdefTest", "This problem was actually caused by an incoming NDEF message.");
        }
    }
}

【讨论】:

  • 抱歉,我们没有机会深入研究并获取其他细节来真正解决这个问题。感谢您的耐心和来回的故障排除工作,因此赏金全归您所有。
  • 是的,我们也是 :) 如果时间允许,肯定会回到这里并在这里发布结果
【解决方案2】:

你可以试试这个:

NfcAdapter nfc = NfcAdapter.getDefaultAdapter(this);
nfc.setNdefPushMessageCallback(new NfcAdapter.CreateNdefMessageCallback() {
    @Override
    public NdefMessage createNdefMessage(NfcEvent event)
    {
        byte[] payload = urlString.getBytes();
        NdefRecord uriRecord = new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_URI, new byte[0], payload); 
        return new NdefMessage(new NdefRecord[] { uriRecord });
    }
}, 
this);

【讨论】:

  • 请务必将NdefRecord.TNF_ABSOLUTE_URI 替换为NdefRecord.TNF_WELL_KNOWN
  • @MichaelRoland,没错!谢谢,我只为 TNF_WELL_KNOWN 将 RTD_URI 添加到第二个参数,但我错过了。好收获!
  • 刚试过这个,不幸的是它似乎仍然给我们同样的问题。 WP8 会打开一个指向 Play 商店的链接,而不是字符串中的链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多