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

时间:2014-05-09 12:17:11

标签: android nfc

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

4 个答案:

答案 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
}