在 Android 平台上开发 NFC(近场通信)功能,主要涉及以下几个步骤:
1. 权限声明
首先,在 AndroidManifest.xml 文件中声明 NFC 权限:
<uses-permission android:name="android.permission.NFC" />
运行 HTML
如果你的应用需要在前台处理 NFC 事件,还需要声明以下权限:
<uses-feature android:name="android.hardware.nfc" android:required="true" />
运行 HTML
2. 配置 AndroidManifest.xml
在 AndroidManifest.xml 中配置 activity,使其能够处理 NFC 事件:
<activity android:name=".YourActivity">
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
<intent-filter>
<action android:name="android.nfc.action.TECH_DISCOVERED" />
</intent-filter>
<meta-data
android:name="android.nfc.action.TECH_DISCOVERED"
android:resource="@xml/nfc_tech_filter" />
</activity>
运行 HTML
3. 创建 NFC 技术过滤文件
在 res/xml 目录下创建一个 XML 文件(例如 nfc_tech_filter.xml),用于指定支持的 NFC 技术:
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<tech-list>
<tech>android.nfc.tech.Ndef</tech>
</tech-list>
</resources>
运行 HTML
4. 初始化 NFC 适配器
在你的 Activity 中初始化 NFC 适配器:
import android.nfc.NfcAdapter;
import android.nfc.NfcManager;
import android.content.Context;
public class YourActivity extends AppCompatActivity {
private NfcAdapter nfcAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
NfcManager manager = (NfcManager) getSystemService(Context.NFC_SERVICE);
nfcAdapter = manager.getDefaultAdapter();
if (nfcAdapter == null) {
// 设备不支持 NFC
Toast.makeText(this, "设备不支持 NFC", Toast.LENGTH_SHORT).show();
finish();
}
}
}
5. 处理 NFC 事件
在 onNewIntent 方法中处理 NFC 事件:
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
Parcelable[] rawMessages = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
if (rawMessages != null) {
NdefMessage[] messages = new NdefMessage[rawMessages.length];
for (int i = 0; i < rawMessages.length; i++) {
messages[i] = (NdefMessage) rawMessages[i];
}
// 处理 NDEF 消息
processNdefMessages(messages);
}
}
}
private void processNdefMessages(NdefMessage[] messages) {
for (NdefMessage message : messages) {
for (NdefRecord record : message.getRecords()) {
if (record.getTnf() == NdefRecord.TNF_WELL_KNOWN && Arrays.equals(record.getType(), NdefRecord.RTD_TEXT)) {
// 处理文本记录
String text = new String(record.getPayload());
Toast.makeText(this, "NFC 数据: " + text, Toast.LENGTH_SHORT).show();
}
}
}
}
6. 启用前台调度
在 onResume 和 onPause 方法中启用和禁用前台调度:
@Override
protected void onResume() {
super.onResume();
if (nfcAdapter != null) {
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
nfcAdapter.enableForegroundDispatch(this, pendingIntent, null, null);
}
}
@Override
protected void onPause() {
super.onPause();
if (nfcAdapter != null) {
nfcAdapter.disableForegroundDispatch(this);
}
}
7. 写入 NFC 标签
如果你想写入 NFC 标签,可以使用以下代码:
private void writeNdefTag(NdefMessage message, Tag tag) {
Ndef ndef = Ndef.get(tag);
if (ndef != null) {
try {
ndef.connect();
ndef.writeNdefMessage(message);
Toast.makeText(this, "写入成功", Toast.LENGTH_SHORT).show();
} catch (IOException | FormatException e) {
e.printStackTrace();
Toast.makeText(this, "写入失败", Toast.LENGTH_SHORT).show();
} finally {
try {
ndef.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
8. 测试 NFC 功能
确保你的设备支持 NFC 功能,并使用 NFC 标签进行测试。
9. 处理不同 NFC 标签类型
根据不同的 NFC 标签类型(如 NDEF、MIFARE 等),你可能需要处理不同的技术栈。可以参考 Android 官方文档了解更多细节。
10. 参考文档
通过以上步骤,你可以在 Android 应用中实现基本的 NFC 功能。根据具体需求,你可能需要进一步扩展和优化代码。