【问题标题】:Check programmatically if device has NFC reader以编程方式检查设备是否具有 NFC 阅读器
【发布时间】:2014-05-09 12:17:10
【问题描述】:

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

【问题讨论】:

    标签: android nfc


    【解决方案1】:

    希望这对你有用

    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 适配器。
    • ya '@323go' 它总是取决于个人,开发人员是否需要它,如果他不想简单地显示弹出窗口,他将只检查适配器!= 我认为 null 条件没什么大不了的
    • 我不同意。您可以提供一个完整的答案,让开发者决定目标受众是什么。
    【解决方案2】:

    检查 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,您可以使用NfcAdapterisEnabled() 方法。但请注意,它并不总是像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 服务可能会任意崩溃,或者仅在特定情况下崩溃?
    • 通常情况下,在配备 NXP 芯片组的设备上,NFC 服务通常会在与卡的通信中断或手机无法正确识别卡(例如,因为卡没有收到足够的电量)时崩溃。
    【解决方案3】:

    这是我用于检测 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

    【讨论】:

      【解决方案4】:

      对于那些使用 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
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-19
        • 1970-01-01
        • 1970-01-01
        • 2017-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-12
        相关资源
        最近更新 更多