Android NFC App 不推送 Ndef 消息

标签 android nfc intentfilter ndef

我正在创建一个 Android 应用程序,该应用程序使用 NFC 在设备之间注册触摸。我正在使用两台 Nexus 7 进行测试。

理想的用例是让应用程序在一台设备上处于 Activity 状态,而不是在另一台设备上处于 Activity 状态。主动设备推送带有记录的 NdefMessage,其中包含一些供被动设备应用程序处理的数据。被动设备将包含一些数据的记录传递回主动应用。

我在我的 list 中设置了以下 Intent 过滤器:

  <activity android:name=".MainActivity" android:label="@string/title_activity_main">
        <intent-filter>
          <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
          <data android:mimeType="application/com.killerapprejji.MainActivity"/>
          <data android:mimeType="application/com.*"/>
          <data android:mimeType="application/com.killerapprejji.*"/>
          <data android:mimeType="application/*"/>
          <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>
  </activity>

在我的 MainActivity 中,我在 onCreate 中有以下设置 NFC 适配器:

mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
PendingIntent pendingIntent = PendingIntent.getActivity(
            this, 0, new Intent(this,
                getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
mNfcPendingIntent = pendingIntent;
    // Intent filters for exchanging over p2p.
if(mNfcAdapter != null){
    IntentFilter ndefDetected = new
                       IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
    IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
    try {
        ndef.addDataType("application/*");    
    }
    catch (MalformedMimeTypeException e) {
        throw new RuntimeException("fail", e);
    }
    this.intentFiltersArray = new IntentFilter[] {ndef, };
    Log.d(this.toString(), "mNfcPendingIntent: ");
    mNdefExchangeFilters = new IntentFilter[] { ndefDetected,defendDetected };

}

我有以下 onNewIntent :

protected void onNewIntent(Intent intent) {
    // NDEF exchange mode
    Log.d("onNewIntent", intent.getAction());
    if (NfcAdapter.ACTION_NDEF_DISCOVERED == (intent.getAction())) {
        NdefMessage[] msgs = getNdefMessages(intent);
        for(int i = 0; i < msgs.length; i++){
            Log.d("onNewIntent", "found new NdefMessage");
        }
     }

    finish();
}

现在,我运行这个调用:

public void setIdleMessage(){
    InteractionHistory intHist = InteractionHistory.getInstance();
    NdefMessage attackNdefMessage = null;
    NdefRecord[] ndefRecords = new NdefRecord[10];
    ndefRecords[0] = NdefRecord.createMime("application/com.killerapprejji.NfcHandle", new String("attack,attacker:"
            + intHist.getDisplayName() 
            + ",attackerid:" + "1").getBytes());
    attackNdefMessage = new NdefMessage(ndefRecords[0]);
    // need to come up with a way to end if the above try/catch fails
    mNfcAdapter.setNdefPushMessage(attackNdefMessage, this);
}

期望它设置 NdefPushMessage。每当我触摸将两个设备置于 NFC 范围内时,我仍然只能获得可选的“Touch to beam”界面。

关于我如何获取这些 Intent ,或者我的 NdefMessage 是否按我的预期发送,有什么想法吗?

最佳答案

“Touch to Beam”消息是 Google 定义的消息,用于推送您希望在 setNdefPushMessage 上分享的 NDEF 消息,因此在您按下该屏幕之前,不会向其他设备发送任何内容。

事实上,您在 Android 中使用的 API 称为 Android BEAM

另一方面,如果一个设备正在推送 NDEF 消息,在您停止推送之前它无法接收消息,因此您必须实现 NDefPushCallback 以捕获成功发送您的 NDEF 消息,停止推送第一个设备,然后它将能够从另一个设备接收新的 Intent (收到 NDEF 消息)


我建议您首先使用 URI mime 类型或纯文本(简单的东西)制作一个测试应用程序,以确保您的“共享逻辑”是正确的。当您确认后,您可以回滚到您自己的 MIME 类型

关于Android NFC App 不推送 Ndef 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13695653/

相关文章:

android - JavaFXPorts构建的apk自动删除

Android:NFC 标签技术 -> 是否应该检查它们,如果是,如何检查?

nfc - NFC SIM 卡有内置天线吗?如何在 SIM 卡上安装小程序?

android - 为什么 onActivityResult() 没有被执行?

Android-Broadcast Receiver 和 Intent Filter

如果 Android Html.fromHtml() 以 <p> 标签开头,它会丢失 HTML

java - Android 停止线程 onDestroy

安卓跌倒检测

android - Android 上的 Nfc Forum Type 4 标签

android - 为服务指定 SEND(共享) Intent 过滤器