2012-06-05 103 views
0

我的活动正在实施NFC发送错误的标签/记录

CreateNdefMessageCallback, OnNdefPushCompleteCallback 

我打电话

mNfcAdapter.setNdefPushMessageCallback(this, this); 
    // Register callback to listen for message-sent success 
    mNfcAdapter.setOnNdefPushCompleteCallback(this, this); 

我重写

@Override 
public NdefMessage createNdefMessage(NfcEvent event) { 
    Log.d(TAG, "Creating massage"); 
    String text = TAG + DATA_SPLITTER + ADDRESS + DATA_SPLITTER 
      + USER_NAME; 

    // Nachricht vorbereiten. 
    // String text = "Hello NFC World!"; 
    NdefRecord record = new NdefRecord(NdefRecord.TNF_MIME_MEDIA, 
      MIME_TYPE.getBytes(), new byte[0], text.getBytes()); 
    NdefRecord[] records = { record }; 
    NdefMessage msg = new NdefMessage(records); 
    return msg; 
} 

但当我收到,我获得不同的记录,其中两个,一个与市场uri一起搜索应用程序,一个只有java包名(我猜)。 在此之前,我只是简单地使用了enableForegroundNdefPush ...等,所以没有任何回调,但因为我需要它来处理在两个设备上完成我的推送。我已经改变它到这种方式,现在它没有正确地传输我的数据了。

编辑:

,使其更好地理解:

public class NfcActivity extends Activity implements CreateNdefMessageCallback, 
    OnNdefPushCompleteCallback { 
// ================================ Member ================================= 
// Speichert den NFC Adapter. 
private NfcAdapter mNfcAdapter = null; 
private boolean retryChannel = false; 

public static final String TAG = "NfcActivity"; 
private static final String DATA_SPLITTER = "__:DATA:__"; 
private static final String MIME_TYPE = "application/my.applications.mimetype"; 

private String ADDRESS = null; 
private String USER_NAME = null; 

// Speichert das Intent, welches von Android mit erkannten Tags gefüllt 
// und an die Activity weitergeleitet wird. 
private PendingIntent mNfcPendingIntent = null; 

private static final String LOG_TAG = "NfcActivity"; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    ADDRESS = "Something"; 

    USER_NAME = "Someone"; 

    // Zugriff auf den NFC Adapter erhalten. 
    mNfcAdapter = NfcAdapter.getDefaultAdapter(this); 

    mNfcAdapter.setNdefPushMessageCallback(this, this); 
    mNfcAdapter.setOnNdefPushCompleteCallback(this, this); 

    Intent intent = new Intent(this, getClass()); 
    intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
    mNfcPendingIntent = PendingIntent.getActivity(this, 0, intent, 0); 
} 

@Override 
protected void onNewIntent(Intent intent) { 
    if (!NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) { 
     return; 
    } 

    // Nutzdaten des Intent auslesen. 
    Parcelable[] rawMsgs = intent 
      .getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); 
    if (rawMsgs == null) { 
     return; 
    } 

    for (int i = 0; i < rawMsgs.length; ++i) { 
     NdefMessage msg = (NdefMessage) rawMsgs[i]; 
     NdefRecord[] records = msg.getRecords(); 
     for (NdefRecord record : records) { 
      String text = new String(record.getPayload()); 
          // this one has the wrong content. I receive two records, one for the market, one with java packet name (or something) 
     } 
    } 
} 

@Override 
protected void onResume() { 
    super.onResume(); 

      // activate receiving of messages 
    mNfcAdapter.enableForegroundDispatch(this, mNfcPendingIntent, null, 
      null); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    // deactivate receiving 
    mNfcAdapter.disableForegroundDispatch(this); 
} 


private void logError(String msg) { 
    Toast.makeText(this, msg, Toast.LENGTH_LONG).show(); 
    Log.v(LOG_TAG, msg); 
} 

@Override 
public void onNdefPushComplete(NfcEvent arg0) { 
    Log.d(TAG, "Push complete"); 
} 

@Override 
public NdefMessage createNdefMessage(NfcEvent event) { 
    Log.d(TAG, "Creating massage"); 

      String text = "asdfgh"; 

    // Nachricht vorbereiten. 
    // String text = "Hello NFC World!"; 
    NdefRecord record = new NdefRecord(NdefRecord.TNF_MIME_MEDIA, 
      MIME_TYPE.getBytes(), new byte[0], text.getBytes()); 
    NdefRecord[] records = { record }; 
    NdefMessage msg = new NdefMessage(records); 
    return msg; 
} 

} 
+0

你在你的Manifest中为你的Activity定义了什么? –

+0

<意图滤波器> \t \t \t <动机器人:名称= “android.nfc.action.NDEF_DISCOVERED”/> \t \t \t <类别机器人:名称= “android.intent.category.DEFAULT”/> \t \t \t \t \t damian

+0

嗯,我明白了。 text/plain的。所以也许这就是为什么我没有收到我的NdefMessages?当然是 – damian

回答

1

我发布此为你解答,你能接受它。

该解决方案是Android-Manifest中的错误Mime类型。它必须与NdefRecord定义的相同