如何通过 NdefMessage 传递自定义对象
How to pass Custom Object through NdefMessage
关于 Whosebug 的第一个问题。我试图说清楚并符合标准。我是 Android 开发新手,尤其是 NFC。我正在开发一个应用程序,您可以在其中创建和加入活动,有点像在 Facebook 上。我有一个 ListEvent activity 和一个 DisplayEvent activity。当我 select 我的列表中的一个事件时,它会打开 DisplayEvent activity,其中包含关于我的事件的正确信息。
我希望当 X 在他的设备上打开事件 A 时,当他与 Y 进入 NFC 范围时,Y 现在在他的设备上有事件 A。我目前能够打开正确的 activity,我什至能够将字符串从一个 phone 发送到另一个。我在网上搜索了很多,但我似乎无法弄清楚如何通过 NFC 而不是字符串发送自定义对象,在我的例子中是一个事件。我还需要随事件一起发送一个布尔值。这可能非常简单,但我在那个问题上很愚蠢。非常感谢您。
这是我的代码。
清单:
<activity
android:name="vincent.ievennement.activity.DisplayEventActivity"
android:parentActivityName="vincent.ievennement.activity.ListeEventActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="vincent.ievennement.activity.ListeEventActivity" />
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain" />
</intent-filter>
</activity>
恢复时:
protected void onResume() {
//Normal way to get my Event and my Boolean
event = (Event) getIntent().getSerializableExtra("MonEvent");
participe = (boolean) getIntent().getSerializableExtra("Participe");
//I prepare my message and make it ready to be sent when a device is into range
NdefMessage messageSend = createNdefMessage("SomeText");
mNfcAdapter.setNdefPushMessage(messageSend, this);
Intent intent = getIntent();
//If my activity is openned by NFC, proceed to get the message that was sent
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
Parcelable[] rawMessages = intent.getParcelableArrayExtra(
NfcAdapter.EXTRA_NDEF_MESSAGES);
NdefMessage message = (NdefMessage) rawMessages[0]; // only one message transferred
Log.e("Test - ",new String(message.getRecords()[0].getPayload()));
}
super.onResume();
createNdefMessage:
public NdefMessage createNdefMessage(String message) {
NdefRecord ndefRecord = NdefRecord.createMime("text/plain", message.getBytes());
NdefMessage ndefMessage = new NdefMessage(ndefRecord);
return ndefMessage;
}
您可以使用 NdefRecord.createExternal
函数创建包含您的应用程序特定数据的 NdefRecord。 documentation describes how to include a "payload" in an NdefRecord. You'll just need to convert your "custom object" into a byte array which is described here。然后将其添加到新的 NdefRecord 并将其添加到您的 NdefMessage。
关于 Whosebug 的第一个问题。我试图说清楚并符合标准。我是 Android 开发新手,尤其是 NFC。我正在开发一个应用程序,您可以在其中创建和加入活动,有点像在 Facebook 上。我有一个 ListEvent activity 和一个 DisplayEvent activity。当我 select 我的列表中的一个事件时,它会打开 DisplayEvent activity,其中包含关于我的事件的正确信息。
我希望当 X 在他的设备上打开事件 A 时,当他与 Y 进入 NFC 范围时,Y 现在在他的设备上有事件 A。我目前能够打开正确的 activity,我什至能够将字符串从一个 phone 发送到另一个。我在网上搜索了很多,但我似乎无法弄清楚如何通过 NFC 而不是字符串发送自定义对象,在我的例子中是一个事件。我还需要随事件一起发送一个布尔值。这可能非常简单,但我在那个问题上很愚蠢。非常感谢您。
这是我的代码。
清单:
<activity
android:name="vincent.ievennement.activity.DisplayEventActivity"
android:parentActivityName="vincent.ievennement.activity.ListeEventActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="vincent.ievennement.activity.ListeEventActivity" />
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain" />
</intent-filter>
</activity>
恢复时:
protected void onResume() {
//Normal way to get my Event and my Boolean
event = (Event) getIntent().getSerializableExtra("MonEvent");
participe = (boolean) getIntent().getSerializableExtra("Participe");
//I prepare my message and make it ready to be sent when a device is into range
NdefMessage messageSend = createNdefMessage("SomeText");
mNfcAdapter.setNdefPushMessage(messageSend, this);
Intent intent = getIntent();
//If my activity is openned by NFC, proceed to get the message that was sent
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
Parcelable[] rawMessages = intent.getParcelableArrayExtra(
NfcAdapter.EXTRA_NDEF_MESSAGES);
NdefMessage message = (NdefMessage) rawMessages[0]; // only one message transferred
Log.e("Test - ",new String(message.getRecords()[0].getPayload()));
}
super.onResume();
createNdefMessage:
public NdefMessage createNdefMessage(String message) {
NdefRecord ndefRecord = NdefRecord.createMime("text/plain", message.getBytes());
NdefMessage ndefMessage = new NdefMessage(ndefRecord);
return ndefMessage;
}
您可以使用 NdefRecord.createExternal
函数创建包含您的应用程序特定数据的 NdefRecord。 documentation describes how to include a "payload" in an NdefRecord. You'll just need to convert your "custom object" into a byte array which is described here。然后将其添加到新的 NdefRecord 并将其添加到您的 NdefMessage。