有没有办法在运行时检查设备是否有NFC读卡器?我的应用程序使用NFC执行任务,但如果没有阅读器,则可以使用按钮执行相同的任务。
答案 0 :(得分:25)
希望这对你有用
NfcManager manager = (NfcManager) context.getSystemService(Context.NFC_SERVICE);
NfcAdapter adapter = manager.getDefaultAdapter();
if (adapter != null && adapter.isEnabled()) {
//Yes NFC available
}else{
//Your device doesn't support NFC
}
答案 1 :(得分:8)
检查Android设备是否具有NFC功能的最简单方法是检查系统功能PackageManager.FEATURE_NFC
(“android.hardware.nfc”):
PackageManager pm = context.getPackageManager();
if (pm.hasSystemFeature(PackageManager.FEATURE_NFC)) {
// device has NFC functionality
}
但是,有些设备(至少有一个索尼的第一款Android NFC智能手机有此问题)无法正确报告FEATURE_NFC
。 (那些不允许您通过Play商店安装需要NFC功能的应用的设备可以检查需要NFC的应用。)
因此,更可靠的解决方案是Sainath Patwary karnate描述的解决方案。要检查设备是否具有NFC功能(或者更确切地说,如果设备具有正在运行的NFC服务),您可以使用:
NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(context);
if (nfcAdapter != null) {
// device has NFC functionality
}
如果您还想检查用户是否在其设备上启用了NFC,则可以使用NfcAdapter
的{{1}}方法。但请注意,它并不总是像Sainath Patwary karnate所描述的那样容易。特别是在Android 4.0。*上,isEnabled()
方法有时会在NFC服务崩溃之前抛出未记录的异常,因此您可能希望捕获这些异常。此外,在Android> = 2.3.4和< 4.1(我无法在以后的版本中重现该问题,但这并不意味着它不存在!),在NFC服务停止或崩溃后第一次调用isEnabled()
总是返回isEnabled()
,所以建议始终忽略false
的第一次调用的结果。
isEnabled()
答案 2 :(得分:2)
这是我用来检测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
答案 3 :(得分:0)
对于那些从事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
}