读取存储在 NDEF 标签上的消息。 Android
Reading a message stored on NDEF tag. Android
我试图找到一个工作示例,说明如何在应用程序的活动 Activity 中读取存储在 NDEF 标签上的消息。到目前为止,我拥有的最好的是这样的代码:
public class Activity1_3_1_1 extends AppCompatActivity {
private Button done;
NfcAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity1_3_1_1);
done = findViewById(R.id.button5);
done.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
switchActivityTo1();
}
});
}
private void switchActivityTo1() {
Intent switchActivityIntent = new Intent(this, MainActivity.class);
startActivity(switchActivityIntent);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) {
adapter = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); // get the detected tag
Parcelable[] msgs =
intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
NdefRecord firstRecord = ((NdefMessage) msgs[0]).getRecords()[0];
byte[] payload = firstRecord.getPayload();
int payloadLength = payload.length;
int langLength = payload[0];
int textLength = payloadLength - langLength - 1;
byte[] text = new byte[textLength];
System.arraycopy(payload, 1 + langLength, text, 0, textLength);
Toast.makeText(getApplicationContext(), new String(text), Toast.LENGTH_LONG).show();//display the response on screen
}
}
}
和清单文件:
...
<uses-permission android:name="android.permission.NFC"/>
<uses-feature android:name="android.hardware.nfc"/>
...
<activity
android:name=".Activity1_3_1_1"
android:exported="true"
android:alwaysRetainTaskState="true"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
问题是 NFC 服务正在启动,而不是应用程序的 onNewIntent() 方法。
对我来说,弄清楚清单文件是否搞砸了(因为其中一个解决方案是修改清单文件以使 NFC 服务无法启动)或者它是 Activity 代码本身的问题,这对我来说是个问题。或者,也许两者都有。
等待您的解决方案。
因此 Android 中 NFC 的正常模式是:-
1) 当您的应用程序不是 运行 并且您希望它在设备出现某种类型的 NFC 标签时启动,然后您将 intent-filters
放在清单中。然后您的应用程序开始并传递一个 Intent
,您需要使用 getIntent()
在 onCreate
方法中处理它
2a) 你的应用程序已经 运行 在前台,然后你使用 enableForegroundDispatch
,给它一个关于你想要通知什么的未决 Intent,然后在 [=15] 中处理=] 当您的应用程序重新启动(暂停和恢复)以接收 Intent 时。
onNewIntent
不会被任何清单条目调用。
或
2b)您的应用程序已经 运行 在前台然后您使用 enableReaderMode
这是 enableForegroundDispatch
的更好替代品,然后您在 onTagDiscovered
中处理标签这是在一个单独的线程中。
如何处理通过模式 1 和 2a 收到的 Intent
是相同的,只是需要从与触发 Intent 的方法相匹配的代码中的正确路径调用它们,即 [=12] =] 或 onNewIntent
查看 以获取有关如何使用 Manifest 和 enableForeGroundDispatch
的示例
还有很多在 Whosebug 上使用 enableReaderMode
的例子。
我试图找到一个工作示例,说明如何在应用程序的活动 Activity 中读取存储在 NDEF 标签上的消息。到目前为止,我拥有的最好的是这样的代码:
public class Activity1_3_1_1 extends AppCompatActivity {
private Button done;
NfcAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity1_3_1_1);
done = findViewById(R.id.button5);
done.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
switchActivityTo1();
}
});
}
private void switchActivityTo1() {
Intent switchActivityIntent = new Intent(this, MainActivity.class);
startActivity(switchActivityIntent);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) {
adapter = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); // get the detected tag
Parcelable[] msgs =
intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
NdefRecord firstRecord = ((NdefMessage) msgs[0]).getRecords()[0];
byte[] payload = firstRecord.getPayload();
int payloadLength = payload.length;
int langLength = payload[0];
int textLength = payloadLength - langLength - 1;
byte[] text = new byte[textLength];
System.arraycopy(payload, 1 + langLength, text, 0, textLength);
Toast.makeText(getApplicationContext(), new String(text), Toast.LENGTH_LONG).show();//display the response on screen
}
}
}
和清单文件:
...
<uses-permission android:name="android.permission.NFC"/>
<uses-feature android:name="android.hardware.nfc"/>
...
<activity
android:name=".Activity1_3_1_1"
android:exported="true"
android:alwaysRetainTaskState="true"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
问题是 NFC 服务正在启动,而不是应用程序的 onNewIntent() 方法。 对我来说,弄清楚清单文件是否搞砸了(因为其中一个解决方案是修改清单文件以使 NFC 服务无法启动)或者它是 Activity 代码本身的问题,这对我来说是个问题。或者,也许两者都有。
等待您的解决方案。
因此 Android 中 NFC 的正常模式是:-
1) 当您的应用程序不是 运行 并且您希望它在设备出现某种类型的 NFC 标签时启动,然后您将 intent-filters
放在清单中。然后您的应用程序开始并传递一个 Intent
,您需要使用 getIntent()
onCreate
方法中处理它
2a) 你的应用程序已经 运行 在前台,然后你使用 enableForegroundDispatch
,给它一个关于你想要通知什么的未决 Intent,然后在 [=15] 中处理=] 当您的应用程序重新启动(暂停和恢复)以接收 Intent 时。
onNewIntent
不会被任何清单条目调用。
或
2b)您的应用程序已经 运行 在前台然后您使用 enableReaderMode
这是 enableForegroundDispatch
的更好替代品,然后您在 onTagDiscovered
中处理标签这是在一个单独的线程中。
如何处理通过模式 1 和 2a 收到的 Intent
是相同的,只是需要从与触发 Intent 的方法相匹配的代码中的正确路径调用它们,即 [=12] =] 或 onNewIntent
查看 enableForeGroundDispatch
还有很多在 Whosebug 上使用 enableReaderMode
的例子。