是否可以在不使用意图的情况下从卡中读取 NFC 标签?
Is it possible to read an NFC tag from a card without using an intent?
我正在使用 Kotlin 构建一个 Android 应用程序。我应该能够通过单击按钮来读取 NFC 标签。我在阅读的所有文档中都看不到这样做的方法。
通常会发生什么:在 Android 设备旁边设置 NFC 令牌(卡、芯片等)。设备自动打开 NFC 应用程序。这个时候就会发现意图,读卡。
但是我怎样才能在应用程序中将令牌放在设备附近,然后单击 'read' 按钮,然后才从令牌中读取信息?
答案是肯定的,也不是,您可以在不使用意图的情况下阅读卡片,但这对您在单击按钮时阅读没有帮助,但其他更改意味着您只能在单击按钮时阅读标签。
你没有展示你如何获得意图的现有代码,也没有描述你正在阅读的数据类型,所以答案会有点含糊。
需要澄清的一点是,标签检测始终由进入范围的标签启动,这始终是您的代码与标签交互的起点,但您可以将读取与标签检测分开。
所以“检测和存储”的方法
首先要做的是使用 enableReaderMode
在标签在范围内时获得回调。
例如
public class NFCActivity extends AppCompatActivity implements NfcAdapter.ReaderCallback{
private NfcAdapter mNfcAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_nfc);
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
// Rest of Activity setup
}
@Override
protected void onResume() {
super.onResume();
if(mNfcAdapter!= null) {
Bundle options = new Bundle();
// Work around for some broken Nfc firmware implementations that poll the card too fast
options.putInt(NfcAdapter.EXTRA_READER_PRESENCE_CHECK_DELAY, 250);
// Enable ReaderMode for all types of card and disable platform sounds
mNfcAdapter.enableReaderMode(this,
this,
NfcAdapter.FLAG_READER_NFC_A |
NfcAdapter.FLAG_READER_NFC_B |
NfcAdapter.FLAG_READER_NFC_F |
NfcAdapter.FLAG_READER_NFC_V |
NfcAdapter.FLAG_READER_NFC_BARCODE |
NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK |
NfcAdapter.FLAG_READER_NO_PLATFORM_SOUNDS,
options);
}
}
@Override
protected void onPause() {
super.onPause();
if(mNfcAdapter!= null)
mNfcAdapter.disableReaderMode(this);
}
标签检测的声音被关闭,系统自动读取任何NDEF消息也被关闭(因此用户不知道标签检测)
然后在 onTagDiscovered
回调方法中,您只需存储它为您提供的 Tag
对象,供您稍后在按下按钮时使用。
当您读取标签时,您使用存储的 Tag
对象并将其转换为标签技术类型之一
例如
Ndef mNdef = Ndef.get(tag);
// Check that it is an Ndef capable card
if (mNdef!= null) {
NdefMessage mNdefMessage = mNdef.getNdefMessage();
}
您还必须处理一些异常,因为无法保证在您按下按钮时标签仍在范围内。
你不能真正延迟启用检测,直到你点击按钮,因为如果你没有要求你的 运行 应用程序在它被发送时,系统很可能会对标签做一些事情检测到。
我正在使用 Kotlin 构建一个 Android 应用程序。我应该能够通过单击按钮来读取 NFC 标签。我在阅读的所有文档中都看不到这样做的方法。
通常会发生什么:在 Android 设备旁边设置 NFC 令牌(卡、芯片等)。设备自动打开 NFC 应用程序。这个时候就会发现意图,读卡。
但是我怎样才能在应用程序中将令牌放在设备附近,然后单击 'read' 按钮,然后才从令牌中读取信息?
答案是肯定的,也不是,您可以在不使用意图的情况下阅读卡片,但这对您在单击按钮时阅读没有帮助,但其他更改意味着您只能在单击按钮时阅读标签。
你没有展示你如何获得意图的现有代码,也没有描述你正在阅读的数据类型,所以答案会有点含糊。
需要澄清的一点是,标签检测始终由进入范围的标签启动,这始终是您的代码与标签交互的起点,但您可以将读取与标签检测分开。
所以“检测和存储”的方法
首先要做的是使用 enableReaderMode
在标签在范围内时获得回调。
例如
public class NFCActivity extends AppCompatActivity implements NfcAdapter.ReaderCallback{
private NfcAdapter mNfcAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_nfc);
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
// Rest of Activity setup
}
@Override
protected void onResume() {
super.onResume();
if(mNfcAdapter!= null) {
Bundle options = new Bundle();
// Work around for some broken Nfc firmware implementations that poll the card too fast
options.putInt(NfcAdapter.EXTRA_READER_PRESENCE_CHECK_DELAY, 250);
// Enable ReaderMode for all types of card and disable platform sounds
mNfcAdapter.enableReaderMode(this,
this,
NfcAdapter.FLAG_READER_NFC_A |
NfcAdapter.FLAG_READER_NFC_B |
NfcAdapter.FLAG_READER_NFC_F |
NfcAdapter.FLAG_READER_NFC_V |
NfcAdapter.FLAG_READER_NFC_BARCODE |
NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK |
NfcAdapter.FLAG_READER_NO_PLATFORM_SOUNDS,
options);
}
}
@Override
protected void onPause() {
super.onPause();
if(mNfcAdapter!= null)
mNfcAdapter.disableReaderMode(this);
}
标签检测的声音被关闭,系统自动读取任何NDEF消息也被关闭(因此用户不知道标签检测)
然后在 onTagDiscovered
回调方法中,您只需存储它为您提供的 Tag
对象,供您稍后在按下按钮时使用。
当您读取标签时,您使用存储的 Tag
对象并将其转换为标签技术类型之一
例如
Ndef mNdef = Ndef.get(tag);
// Check that it is an Ndef capable card
if (mNdef!= null) {
NdefMessage mNdefMessage = mNdef.getNdefMessage();
}
您还必须处理一些异常,因为无法保证在您按下按钮时标签仍在范围内。
你不能真正延迟启用检测,直到你点击按钮,因为如果你没有要求你的 运行 应用程序在它被发送时,系统很可能会对标签做一些事情检测到。