- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 Android 10 中,我注意到我从操作系统收到一条 Toast 消息,说明“此 NFC 标签不支持应用程序”或“此 NFC 标签不支持应用程序”(取决于设备):
奇怪的是,我在 enableReaderMode
时看到了 Toast。在前台 Activity 中处于 Activity 状态。在所有以前的 Android 版本中,enableReaderMode
将覆盖 Android Intent 标签调度系统。这是 Android 10 中的错误吗?
我知道enableForegroundDispatch
也存在,即使在 Android 10 中,该 API 似乎也确实覆盖了 Intent 标签调度系统。但我想继续控制仅由 enableReaderMode
提供的 NFC 发现声音。 .
我也知道我可以在 list 中声明一个 Intent 过滤器来摆脱 Toast,同时继续使用 enableReaderMode
,但这也有意想不到的副作用(例如,我的应用程序可能会在从我不想要的设备主屏幕读取 NFC 标签时启动)。
最佳答案
是的,这似乎是一个错误,因为 Android 操作系统会在以下条件下触发一个新的 tagDiscovery 事件:
import android.app.PendingIntent;
import android.content.Intent;
import android.content.IntentFilter;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.nfc.tech.IsoDep;
import android.os.Bundle;
import android.widget.Toast;
import java.io.IOException;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity
{
private NfcAdapter nfcAdapter;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
//Assuming nfc adapter is present and active, such checks are ignored for code clarity,
//production code must check for hardware nfc adapter existence
nfcAdapter = NfcAdapter.getDefaultAdapter(this); //Get the default NFC adapter from OS
//Additional initialization code
}
private void onTagDiscovered(Tag tag)
{
try
{
if (tag == null)
return;
//Assumption: We're using an NFC card that supports IsoDep
IsoDep iso = IsoDep.get(tag);
if (iso == null)
return;
iso.setTimeout(1000);
iso.connect();
//doCardReadWrite(iso);
iso.close();
//Workaround 1
//Wait until the card has been removed from the range of NFC
//Then finish the activity
while(true)
{
try
{
iso.connect();
Thread.sleep(100);
iso.close();
}
catch (IOException | InterruptedException e)
{
//On this example, once we're done with the activity, we want to close it
//then onPause event will call disableReaderMode, at that moment we don't want a card to be in proximity
onCardRemoved();
break;
}
}
//End of Workaround 1
}
catch (IOException e)
{
Toast.makeText(this, "Tag disconnected. Reason: " + e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
private void onCardRemoved()
{
this.finish();
}
@Override
protected void onResume()
{
super.onResume();
//Workaround 2
//Legacy nfc reader activation method, just enabled it but we won't use it
//(to fully support [e.g. OS version < v4.4.4] you must override onNewIntent(Intent intent) method as well)
//create intent/tag filters to be used with enableForegroundDispatch
PendingIntent pendingIntent = PendingIntent.getActivity(
this,
0,
new Intent(this, this.getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),
0
);
IntentFilter tagDetected = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);
tagDetected.addCategory(Intent.CATEGORY_DEFAULT);
IntentFilter[] writeTagFilters = new IntentFilter[]{tagDetected};
nfcAdapter.enableForegroundDispatch(this, pendingIntent, writeTagFilters, null);
//End of Workaround 2
//ReaderMode activation
Bundle options = new Bundle();
options.putInt(NfcAdapter.EXTRA_READER_PRESENCE_CHECK_DELAY, 1000);//Presence check interval
final int READER_FLAGS = NfcAdapter.FLAG_READER_NFC_A | NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK | NfcAdapter.FLAG_READER_NO_PLATFORM_SOUNDS;
nfcAdapter.enableReaderMode(this, new NfcAdapter.ReaderCallback()
{
@Override
public void onTagDiscovered(Tag tag)
{
MainActivity.this.onTagDiscovered(tag);
}
}, READER_FLAGS, options);
}
@Override
protected void onPause()
{
nfcAdapter.disableReaderMode(this);
//Workaround 2
nfcAdapter.disableForegroundDispatch(this);
super.onPause();
}
}
关于android - 前台 Activity 中的 NfcAdapter.enableReaderMode 是否应该覆盖 Intent 标签调度系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60868912/
我在通过 Dagger 模块返回可为空的 NfcAdapter 时遇到问题。在这里: @Provides @Singleton @Nullable public NfcAdapter
我有 3 个不同的带有 NFC 的设备。其中 2 个设备上的 NfcAdapter.getDefaultAdapter(this) 返回应有的结果,但在第三个设备上返回null。第三台设备上安装了一个
我正在尝试使用 IsoDep 和 NfcAdapter 类将 APDU 发送到标签(智能卡),我有两个问题: 1) 有没有办法获得 Disconnected Intent (例如,当卡片被拿走时)?我
我正在尝试在模拟器 API 10 (Android 2.3. 3). 当我调用 NfcAdapter.getDefaultAdapter(this) 时,我得到 null。为什么会这样? 代码: pu
我在主 Activity 的 onCreate() 方法中有以下代码: super.mAdapter.enableReaderMode(this, new NfcAdapter.ReaderCallb
我的应用程序在后台和前台使用 NFC 读取。对于用户信息,我在我的 Activity 中使用 CountDownTimer(120 * 1000, 5 * 1000) 和方法 onTick(long
我正在尝试使用 Robolectric 来测试 NFC 助手类。简化,我正在做这样的事情: Activity activity = Robolectric.buildActivity(Activity
在 Android 10 中,我注意到我从操作系统收到一条 Toast 消息,说明“此 NFC 标签不支持应用程序”或“此 NFC 标签不支持应用程序”(取决于设备): 奇怪的是,我在 enableR
我是一名优秀的程序员,十分优秀!