Android NFC通信示例

前言

近距离无线通信 (NFC) 是一组近距离无线技术,通常只有在距离不超过 4 厘米时才能启动连接。借助 NFC,您可以在 NFC 标签与 Android 设备之间或者两台 Android 设备之间共享小型负载。

支持 NFC 的 Android 设备同时支持以下三种主要操作模式:

  1. 读取器/写入器模式:支持 NFC 设备读取和/或写入被动 NFC 标签和贴纸。
  2. 点对点模式:支持 NFC 设备与其他 NFC 对等设备交换数据;Android Beam 使用的就是此操作模式。
  3. 卡模拟模式:支持 NFC 设备本身充当 NFC 卡。然后,可以通过外部 NFC 读取器(例如 NFC 销售终端)访问模拟 NFC 卡。

示例

下面是一个简单的 Android NFC 通信示例,它演示了如何使用 NFC 技术在两个 Android 设备之间进行通信。

在 AndroidManifest.xml 文件中添加以下权限:

<uses-permission android:name="android.permission.NFC" />

在您的 Activity 中,您需要创建一个 NfcAdapter 对象,并注册一个 NDEF 消息接收器来处理接收到的 NDEF 消息。以下是一个示例:

public class MainActivity extends AppCompatActivity {
    private NfcAdapter nfcAdapter;
    private PendingIntent pendingIntent;
    private IntentFilter[] intentFiltersArray;
    private String[][] techListsArray;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 获取 NfcAdapter 对象
        nfcAdapter = NfcAdapter.getDefaultAdapter(this);

        // 创建一个 PendingIntent 对象,用于处理 NFC Intent
        Intent intent = new Intent(this, getClass());
        intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);

        // 创建一个 IntentFilter 对象,用于过滤 NFC Intent
        IntentFilter intentFilter = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
        try {
            intentFilter.addDataType("application/vnd.com.example.android.beam");
        } catch (IntentFilter.MalformedMimeTypeException e) {
            e.printStackTrace();
        }
        intentFiltersArray = new IntentFilter[] { intentFilter };

        // 创建一个 TechList 数组,用于指定 NFC 技术列表
        techListsArray = new String[][] { new String[] { NfcF.class.getName() } };
    }

    @Override
    protected void onResume() {
        super.onResume();
        // 在 onResume() 方法中启用 NFC 功能,注册 NDEF 消息接收器
        if (nfcAdapter != null) {
            nfcAdapter.enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techListsArray);
        }
    }

    @Override
    protected void onPause() {
        // 在 onPause() 方法中禁用 NFC 功能,注销 NDEF 消息接收器
        super.onPause();
        if (nfcAdapter != null) {
            nfcAdapter.disableForegroundDispatch(this);
        }
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        // 处理接收到的 NDEF 消息
        String action = intent.getAction();
        if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {
            Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
            if (rawMsgs != null) {
                NdefMessage[] msgs = new NdefMessage[rawMsgs.length];
                for (int i = 0; i < rawMsgs.length; i++) {
                    msgs[i] = (NdefMessage) rawMsgs[i];
                }
                // 处理接收到的 NDEF 消息
                // ...
            }
        }
    }
}

在上述代码中,我们创建了一个 NfcAdapter 对象,使用 enableForegroundDispatch() 方法启用 NFC 功能,并在 onResume() 方法中注册了一个 NDEF 消息接收器。在 onPause() 方法中禁用 NFC 功能,并在 onNewIntent() 方法中处理接收到的 NDEF 消息。

此示例使用 NfcF 技术来进行 NFC 通信。如果您需要使用其他 NFC 技术进行通信,您需要修改 techListsArray 数组中的技术列表。同时,您还需要修改 IntentFilter 中的数据类型,以适应您的应用程序需求。

请注意,此示例仅演示了如何使用 NFC 技术在两个 Android 设备之间进行通信。在实际应用中,您可能需要更复杂的通信协议和数据格式。