[英]Check programmatically if device has NFC reader
有没有办法在运行时检查设备是否有 NFC 阅读器? 我的应用程序使用 NFC 来执行任务,但如果没有阅读器,它可以通过使用按钮来执行相同的任务。
希望这对你有用
NfcManager manager = (NfcManager) context.getSystemService(Context.NFC_SERVICE);
NfcAdapter adapter = manager.getDefaultAdapter();
if (adapter != null && adapter.isEnabled()) {
//Yes NFC available
}else if(adapter != null && !adapter.isEnabled()){
//NFC is not enabled.Need to enable by the user.
}else{
//NFC is not supported
}
检查 Android 设备是否具有 NFC 功能的最简单方法是检查系统功能PackageManager.FEATURE_NFC
("android.hardware.nfc"):
PackageManager pm = context.getPackageManager();
if (pm.hasSystemFeature(PackageManager.FEATURE_NFC)) {
// device has NFC functionality
}
但是,存在无法正确报告FEATURE_NFC
设备(至少索尼首批 Android NFC 智能手机之一存在此问题)。 (那些不允许您通过 Play 商店安装需要 NFC 功能的应用程序的设备会检查需要 NFC 的应用程序。)
因此,更可靠的解决方案是Sainath Patwary karnate描述的解决方案。 要检查设备是否具有 NFC 功能(或者设备是否具有正在运行的 NFC 服务),您可以使用:
NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(context);
if (nfcAdapter != null) {
// device has NFC functionality
}
如果您还想检查用户是否在其设备上启用了 NFC,您可以使用NfcAdapter
的isEnabled()
方法。 但请注意,它并不总是像Sainath Patwary karnate所描述的那样容易。 特别是在 Android 4.0.* 上, isEnabled()
方法有时会在 NFC 服务之前崩溃时抛出未记录的异常,因此您可能想要捕获这些异常。 此外,在 Android >= 2.3.4 和 < 4.1(我无法在更高版本上重现该问题,但这并不意味着它不存在!),在 NFC 服务停止或崩溃后第一次调用isEnabled()
始终返回false
,因此建议始终忽略第一次调用isEnabled()
。
if (nfcAdapter != null) {
try {
nfcAdapter.isEnabled();
} catch (Exception e) {}
bool isEnabled = false;
try {
isEnabled = nfcAdapter.isEnabled();
} catch (Exception e) {}
if (isEnabled) {
// NFC functionality is available and enabled
}
}
这是我用于检测 NFC 存在的函数。
public static boolean deviceHasNfc() {
// Is NFC adapter present (whether enabled or not)
NfcManager nfcMgr = (NfcManager) context.getSystemService(Context.NFC_SERVICE);
if (manager != null) {
NfcAdapter adapter = manager.getDefaultAdapter();
return adapter != null;
}
return false;
}
如@Sainath 的回答所述,您还可以使用adapter.isEnabled()
检测是否启用了 NFC
对于那些使用 Kotlin 的人来说,这里是一个快速启用的检查扩展,遵循上面发布的规则
fun Context.isNfcEnabled(): Boolean {
val nfcAdapter = NfcAdapter.getDefaultAdapter(this)
if (nfcAdapter != null) {
return try {
nfcAdapter.isEnabled
} catch (exp: Exception) {
// Double try this as there are times it will fail first time
try {
nfcAdapter.isEnabled
} catch (exp: Exception) {
false
}
}
}
return false
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.