Android NFC应用程序没有推送Ndef消息

时间:2012-12-04 03:31:54

标签: android nfc intentfilter ndef

我正在开发一款Android应用程序,它使用NFC来注册设备之间的触摸。我正在使用两个Nexus 7进行测试。

理想的用例是让App在一台设备上处于活动状态,而在另一台设备上处于非活动状态。活动设备向NdefMessage推送包含一些数据的记录,供被动设备应用程序处理。被动设备将包含一些数据的记录传递回活动应用程序。

我在清单中设置了以下意图过滤器:

  <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范围内时,我仍然只能选择“触摸到光束”界面。

关于如何获取这些意图的任何想法,或者我的NdefMessage是否按照我的预期发送?

1 个答案:

答案 0 :(得分:1)

&#34;触摸光束&#34;消息,是Google定义的用于推送您希望在setNdefPushMessage上共享的NDEF消息的消息,因此在您按下该屏幕之前,不会将任何内容发送到其他设备。

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

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


我建议你首先使用URI mime类型或纯文本(简单的东西)制作一个测试应用程序,以确保你的&#34; Share Logic&#34;没关系确认后,您可以回滚到自己的mime类型