Android NFC写入数据的实现流程
1. 整体流程概述
在Android开发中,实现NFC写入数据的过程可以分为以下几个步骤:
- 初始化NFC适配器:获取设备上的NFC适配器,并检查设备是否支持NFC功能。
- 创建NDEF消息:创建一个NDEF消息对象,并将需要写入的数据添加到消息中。
- 将NDEF消息写入标签:将NDEF消息写入NFC标签中。
- 监听标签写入结果:注册一个写入结果的回调函数,用于处理写入操作的结果。
下面将详细介绍每一步需要做什么以及相应的代码实现。
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