Android NfcAdapter.enableReaderMode 回调未调用
Android NfcAdapter.enableReaderMode callback not called
我想在应用程序的某个时刻请求用户扫描 NFC 标签。 enableReaderMode
似乎是一个合理的解决方案。但是,它不起作用 - 考虑将以下代码放在新 Android 项目(添加了 NFC 权限)的 Activity 中的 onCreate
中。
nfcAdapter = NfcAdapter.getDefaultAdapter(this);
if (nfcAdapter == null) {
Toast.makeText(this, "No NFC", Toast.LENGTH_LONG).show();
return;
}
System.out.println("NFC enable reader mode");
nfcAdapter.enableReaderMode(this, tag -> {
System.out.println("NFC tag found");
Toast.makeText(this, "Tag found", Toast.LENGTH_LONG).show();
}, NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK, null);
我在日志中看到“NFC 启用 reader 模式”,并且(在 Android 的 one 版本上)当应用程序启动时,标记不要导致其他应用程序打开,这表明 reader 模式确实处于活动状态(FLAG_READER_SKIP_NDEF_CHECK
阻止 ndef 检查),但不会调用回调。我在应用程序背面贴了一个标签,没有观察到任何东西,退出应用程序,标签立即扫描 - 所以标签很好,它们的位置也很好,只是,出于某种原因 enableReaderMode
不是'当标签靠近时导致回调被调用。
我已经在 Oxygen OS 10 和 Android 11 上试过了。在 10 上,它显示了上面给出的行为。在 11 日,标签正常打开其他应用程序(即错误地),而不是被 ndef 标志抑制。都没有调用回调。
这似乎是一个非常基本的用例,如果它坏了,我会找到几十个关于它的线程,但我只找到了两个相关的东西:on some device not call callback (NfcAdapter.ReaderCallback) method in nfcAdapter.enableReaderMode and NFCAdpater.enableReaderMode(...) doesn't work consistently if booting in Kiosk mode activity。前者看起来很相关,后者则不太相关,但都没有得到回答。我总觉得我一定是做错了什么——但这是一个如此简单的代码块,我不确定我可能做错了什么。另外,设备之间存在不同的行为。有人知道怎么回事吗?
您已将 enableReaderMode
配置为跳过 Ndef 检测,但尚未将其配置为读取任何其他标签技术类型
而不是 NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK
您标记的选项应该如下所示,以便于阅读标签
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_SOUND
我想在应用程序的某个时刻请求用户扫描 NFC 标签。 enableReaderMode
似乎是一个合理的解决方案。但是,它不起作用 - 考虑将以下代码放在新 Android 项目(添加了 NFC 权限)的 Activity 中的 onCreate
中。
nfcAdapter = NfcAdapter.getDefaultAdapter(this);
if (nfcAdapter == null) {
Toast.makeText(this, "No NFC", Toast.LENGTH_LONG).show();
return;
}
System.out.println("NFC enable reader mode");
nfcAdapter.enableReaderMode(this, tag -> {
System.out.println("NFC tag found");
Toast.makeText(this, "Tag found", Toast.LENGTH_LONG).show();
}, NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK, null);
我在日志中看到“NFC 启用 reader 模式”,并且(在 Android 的 one 版本上)当应用程序启动时,标记不要导致其他应用程序打开,这表明 reader 模式确实处于活动状态(FLAG_READER_SKIP_NDEF_CHECK
阻止 ndef 检查),但不会调用回调。我在应用程序背面贴了一个标签,没有观察到任何东西,退出应用程序,标签立即扫描 - 所以标签很好,它们的位置也很好,只是,出于某种原因 enableReaderMode
不是'当标签靠近时导致回调被调用。
我已经在 Oxygen OS 10 和 Android 11 上试过了。在 10 上,它显示了上面给出的行为。在 11 日,标签正常打开其他应用程序(即错误地),而不是被 ndef 标志抑制。都没有调用回调。
这似乎是一个非常基本的用例,如果它坏了,我会找到几十个关于它的线程,但我只找到了两个相关的东西:on some device not call callback (NfcAdapter.ReaderCallback) method in nfcAdapter.enableReaderMode and NFCAdpater.enableReaderMode(...) doesn't work consistently if booting in Kiosk mode activity。前者看起来很相关,后者则不太相关,但都没有得到回答。我总觉得我一定是做错了什么——但这是一个如此简单的代码块,我不确定我可能做错了什么。另外,设备之间存在不同的行为。有人知道怎么回事吗?
您已将 enableReaderMode
配置为跳过 Ndef 检测,但尚未将其配置为读取任何其他标签技术类型
而不是 NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK
您标记的选项应该如下所示,以便于阅读标签
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_SOUND