Android NFC写入数据的实现流程

1. 整体流程概述

在Android开发中,实现NFC写入数据的过程可以分为以下几个步骤:

  1. 初始化NFC适配器:获取设备上的NFC适配器,并检查设备是否支持NFC功能。
  2. 创建NDEF消息:创建一个NDEF消息对象,并将需要写入的数据添加到消息中。
  3. 将NDEF消息写入标签:将NDEF消息写入NFC标签中。
  4. 监听标签写入结果:注册一个写入结果的回调函数,用于处理写入操作的结果。

下面将详细介绍每一步需要做什么以及相应的代码实现。

2. 代码实现

步骤1:初始化NFC适配器

首先,我们需要在AndroidManifest.xml文件中添加NFC权限:

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

然后,在需要使用NFC的Activity中,定义一个NFC适配器的变量,并在onCreate()方法中进行初始化。

private NfcAdapter nfcAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // 初始化NFC适配器
    nfcAdapter = NfcAdapter.getDefaultAdapter(this);
    
    // 检查设备是否支持NFC
    if (nfcAdapter == null) {
        Toast.makeText(this, "设备不支持NFC功能", Toast.LENGTH_SHORT).show();
        finish();
        return;
    }
}

步骤2:创建NDEF消息

在这一步中,我们需要创建一个NDEF消息对象,并将需要写入的数据添加到消息中。

private NdefMessage createNdefMessage(String data) {
    NdefRecord record = NdefRecord.createTextRecord(null, data);
    return new NdefMessage(new NdefRecord[]{record});
}

createTextRecord()方法用于创建一个文本类型的NDEF记录,可以将需要写入的数据作为参数传入。createNdefMessage()方法则用于创建一个NDEF消息对象,并将NDEF记录作为参数传入。

步骤3:将NDEF消息写入标签

在这一步中,我们需要将上一步创建的NDEF消息写入NFC标签中。

private void writeNdefMessage(Tag tag, NdefMessage ndefMessage) {
    try {
        Ndef ndef = Ndef.get(tag);
        if (ndef != null) {
            ndef.connect();
            if (ndef.isWritable()) {
                ndef.writeNdefMessage(ndefMessage);
                Toast.makeText(this, "写入成功", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(this, "标签不可写", Toast.LENGTH_SHORT).show();
            }
            ndef.close();
        } else {
            Toast.makeText(this, "标签不支持NDEF", Toast.LENGTH_SHORT).show();
        }
    } catch (Exception e) {
        Toast.makeText(this, "写入失败:" + e.getMessage(), Toast.LENGTH_SHORT).show();
    }
}

writeNdefMessage()方法用于将NDEF消息写入NFC标签中。首先,我们需要获取到一个Ndef对象,并连接到标签上。然后,我们检查标签是否可写,如果可以写入就调用writeNdefMessage()方法将消息写入标签。最后,我们关闭连接。

步骤4:监听标签写入结果

在这一步中,我们需要注册一个写入结果的回调函数,用于处理写入操作的结果。

private PendingIntent nfcPendingIntent;
private IntentFilter[] intentFilters;
private String[][] techLists;

@Override
protected void onResume() {
    super.onResume();

    // 创建一个PendingIntent,用于处理标签写入结果的回调
    Intent intent = new Intent(this, getClass());
    intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    nfcPendingIntent = PendingIntent.getActivity(this, 0, intent, 0);

    // 创建IntentFilter和techLists
    IntentFilter ndefFilter = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
    try {
        ndefFilter.addDataType("*/*");
    } catch (IntentFilter.MalformedMimeTypeException e) {
        throw new RuntimeException("Failed to add MIME type.");
    }
    intentFilters = new IntentFilter[]{ndefFilter};

    techLists = new String[][]{new String[]{Ndef.class.getName()}};

    // 启用前台调度系统
    nfcAdapter.enableForegroundDispatch(this, nfcPendingIntent, intentFilters, techLists);
}

@Override
protected void onPause() {
    super