如果设备有NFC读卡器,请以编程方式检查

gio*_*ozh 6 android nfc

有没有办法在运行时检查设备是否有NFC读卡器?我的应用程序使用NFC执行任务,但如果没有阅读器,则可以使用按钮执行相同的任务.

Sai*_*ate 29

希望这适合你

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
}
Run Code Online (Sandbox Code Playgroud)

  • 您可能希望区分`adapter == null`(不存在reader)和`!adapter.isEnabled()`(读取器已关闭).这样,可以提示用户启用NFC适配器. (11认同)
  • 我不同意.您可以提供*完整*答案,让开发人员决定目标受众是什么. (5认同)
  • ya '@323go' 它总是取决于个人,开发人员是否需要,如果他不想显示简单的弹出窗口,他只会使用适配器检查!= null 条件我认为这没什么大不了的 (2认同)

Mic*_*and 8

检查Android设备是否具有NFC功能的最简单方法是检查系统功能PackageManager.FEATURE_NFC("android.hardware.nfc"):

PackageManager pm = context.getPackageManager();
if (pm.hasSystemFeature(PackageManager.FEATURE_NFC)) {
    // device has NFC functionality
}
Run Code Online (Sandbox Code Playgroud)

但是,有些设备(至少有一个索尼的第一款Android NFC智能手机有这个问题)没有正确报告FEATURE_NFC.(那些不允许您通过Play商店安装需要NFC功能的应用程序的设备可以检查需要NFC的应用程序.)

因此,更可靠的解决方案是Sainath Patwary karnate描述的解决方案.要检查设备是否具有NFC功能(或者更确切地说,如果设备具有正在运行的NFC服务),您可以使用:

NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(context);
if (nfcAdapter != null) {
    // device has NFC functionality
}
Run Code Online (Sandbox Code Playgroud)

如果你还需要检查用户是否启用NFC在他们的设备上,你可以使用NfcAdapterisEnabled()方法.但要注意的是,并不总是像Sainath Patwary karnate所描述的那样容易.特别是在Android 4.0.*上,该isEnabled()方法有时会在NFC服务崩溃之前抛出未记录的异常,因此您可能希望捕获这些异常.此外,在Android> = 2.3.4和<4.1(我无法在以后的版本上重现问题,但这并不意味着它不存在!),isEnabled()NFC服务停止或崩溃后的第一次调用总是返回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
    }
}
Run Code Online (Sandbox Code Playgroud)