8

我正在尝试使用 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);
4

2 回答 2

3

你可以试试这个:

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);
于 2014-01-08T16:20:29.583 回答
0

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

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

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

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

原因 1 的一个原因可能是 WP8 设备本身发送了一个 NDEF 消息,导致 Android 设备上的意图处理。如果是这种情况,解决这个问题的方法可能是注册前台调度系统。这将阻止常规的意图处理,并将所有传入的 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.");
        }
    }
}
于 2014-01-14T22:25:26.000 回答