📜  Android NFC功能(1)

📅  最后修改于: 2023-12-03 15:29:20.787000             🧑  作者: Mango

Android NFC功能介绍

简介

NFC(Near Field Communication)即近距离无线通信技术,是一种基于 RFID(Radio Frequency Identification)技术的非接触式通信,具有短距离、高频率、高安全性、低功耗等特点。在 Android 设备上,NFC 用于实现设备之间的数据传输、电子支付、智能标签读取等应用。本文将介绍 Android 平台下 NFC 的相关知识和使用方法。

NFC 功能的使用方法
检测设备是否支持 NFC

使用以下代码检测设备是否支持 NFC:

boolean hasNfc = getPackageManager().hasSystemFeature(PackageManager.FEATURE_NFC);
if (hasNfc) {
    // 设备支持 NFC
} else {
    // 设备不支持 NFC
}
打开/关闭 NFC

可以使用如下代码来打开 NFC:

NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
if (nfcAdapter != null) {
    if (!nfcAdapter.isEnabled()) {
        Intent intent = new Intent(Settings.ACTION_NFC_SETTINGS);
        startActivity(intent);
    }
}

使用如下代码来关闭 NFC:

NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
if (nfcAdapter != null) {
    if (nfcAdapter.isEnabled()) {
        nfcAdapter.disable();
    }
}
NFC 标签的读写

读取 NFC 标签的数据

在 Android 中,读取 NFC 标签的数据需要实现 NFCAdapter.ReaderCallback 接口,具体代码如下:

public class MainActivity extends AppCompatActivity implements NfcAdapter.ReaderCallback {
    private NfcAdapter mNfcAdapter;
    private PendingIntent mPendingIntent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        // 初始化 NfcAdapter 和 PendingIntent
        mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
        mPendingIntent = PendingIntent.getActivity(this, 0,
                new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
    }

    @Override
    protected void onResume() {
        super.onResume();
        // 开启前台调度系统
        if (mNfcAdapter != null) {
            mNfcAdapter.enableReaderMode(this, this, NfcAdapter.FLAG_READER_NFC_A, null);
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        // 关闭前台调度系统
        if (mNfcAdapter != null) {
            mNfcAdapter.disableReaderMode(this);
        }
    }

    @Override
    public void onTagDiscovered(Tag tag) {
        String[] techList = tag.getTechList();
        for (String tech : techList) {
            if (tech.equals(NfcA.class.getName())) {
                NfcA nfcA = NfcA.get(tag);
                try {
                    nfcA.connect();
                    byte[] data = nfcA.transceive(new byte[]{/*查询数据的命令*/});
                    // 处理数据
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        nfcA.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}

写入 NFC 标签的数据

写入 NFC 标签的数据比较简单,可以直接调用 Tag 对象的 writeNdefMessage() 方法,示例代码如下:

Tag tag = ...; // 获取要写入的标签
NdefMessage ndefMessage = ...; // 要写入的 NDEF 消息对象
Ndef ndef = Ndef.get(tag);
if (ndef != null) {
    ndef.connect();
    boolean isSuccess = false;
    if (ndef.isWritable()) {
        isSuccess = true;
        try {
            ndef.writeNdefMessage(ndefMessage);
        } catch (Exception e) {
            isSuccess = false;
            e.printStackTrace();
        }
    }
    try {
        ndef.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    if (isSuccess) {
        // 写入成功
    } else {
        // 写入失败
    }
}
支付功能

使用 NFC 实现移动支付需要获取设备的 SE(Secure Element)芯片,SE 是一种专门用于加密计算的微处理器,具有高度安全性,可以对应用程序提供安全存储和执行加密计算的环境。在 Android 上,SE 芯片一般由设备厂商或运营商提供,可以通过相应的 SDK 接口来访问。具体的实现方法和接口使用请参考相关的文档和资料。

总结

以上介绍了 Android 平台下 NFC 功能的相关知识和使用方法,包括检测设备是否支持 NFC、打开/关闭 NFC、NFC 标签的读写和支付功能等。NFC 技术应用非常广泛,未来也将越来越普及和成熟,开发者可以结合自身需求灵活运用。