1

我正在创建一个使用 NFC 注册从设备到设备的触摸的 Android 应用程序。我正在使用两个 Nexus 7 进行测试。

理想的用例是让应用程序在一台设备上处于活动状态,而在另一台设备上不处于活动状态。主动设备推送一个带有记录的 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 范围内时,我仍然只能获得可选的“Touch to beam”界面。

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

4

1 回答 1

1

“Touch to Beam”消息是由 Google 定义的,用于推送您希望在 setNdefPushMessage 上共享的 NDEF 消息,因此在您推送该屏幕之前,不会将任何内容发送到另一台设备。

实际上,您在 Android 中使用的那个 API 称为 Android BEAM

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


I recommend you make a test app first using URI mime type, or plain text (something easy) to make sure that your "Share Logic" is OK. When you confirm that, you can rollback to your own mime types

于 2012-12-04T12:51:26.337 回答