【发布时间】:2014-05-09 12:17:10
【问题描述】:
有没有办法在运行时检查设备是否有 NFC 读取器?我的应用使用 NFC 执行任务,但如果没有阅读器,它可以使用按钮执行相同的任务。
【问题讨论】:
有没有办法在运行时检查设备是否有 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
}
【讨论】:
adapter == null(不存在阅读器)和!adapter.isEnabled()(阅读器已关闭)。这样,系统会提示用户启用 NFC 适配器。
检查 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.* 上,当 NFC 服务之前崩溃时,isEnabled() 方法有时会引发未记录的异常,因此您可能希望捕获这些异常。此外,在 Android >= 2.3.4 和 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
}
【讨论】: