Android 11 NFC源码解析与实践应用指南

Android 11 NFC源码解析与实践应用指南
引言
随着移动支付的普及和物联网技术的迅猛发展,NFC(Near Field Communication,近场通信)技术在现代智能手机中的应用越来越广泛。从简单的数据传输到复杂的身份验证,NFC技术为我们提供了便捷的解决方案。本文将深入解析Android 11系统中NFC技术的源码,并结合实际案例,探讨其在开发中的应用。
一、NFC技术概述
NFC是一种短距离无线通信技术,能够在10厘米左右的范围内实现设备间的数据传输。其传输速度有106Kbit/秒、212Kbit/秒和424Kbit/秒三种模式。NFC技术由飞利浦公司和索尼公司共同开发,广泛应用于移动支付、身份识别、数据交换等领域。
1.1 NFC的工作模式
NFC主要有三种工作模式:
读卡器模式(Reader/Writer Mode)
:通过支持NFC的设备从带有NFC芯片的标签、贴纸、名片等媒介中读写信息。
仿真卡模式(Card Emulation Mode)
:将支持NFC的设备模拟成借记卡、公交卡、门禁卡等IC卡使用。
点对点模式(P2P Mode)
:实现设备间的直接数据传输,类似于蓝牙但距离更短。
二、Android 11 NFC源码解析
Android系统的NFC功能主要由
android.nfc
包实现。以下是对Android 11中NFC相关源码的详细解析。
2.1 NFC服务启动流程
NFC服务的启动流程如下:
系统启动时加载NFC服务
:在
SystemServer.java
中,通过
startService
方法启动
NfcService
。
NfcService初始化
:
NfcService.java
负责初始化NFC相关硬件和软件资源,包括创建
NfcAdapter
实例。
public class NfcService extends SystemService {
@Override
public void onStart() {
// 初始化NFC硬件
mNfcController = NfcController.getInstance();
mNfcController.initialize();
// 创建NfcAdapter实例
mNfcAdapter = NfcAdapter.getDefaultAdapter(mContext);
}
}
2.2 NFC数据传输机制
NFC数据传输主要通过
NfcAdapter
类实现。以下是一个简单的数据传输示例:
NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
if (nfcAdapter != null) {
Intent intent = new Intent(this, NfcActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
nfcAdapter.enableForegroundDispatch(this, pendingIntent, null, null);
}
在
NfcActivity
中处理接收到的NFC数据:
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
NdefMessage[] msgs = null;
if (rawMsgs != null) {
msgs = new NdefMessage[rawMsgs.length];
for (int i = 0; i < rawMsgs.length; i++) { msgs[i] = (NdefMessage) rawMsgs[i]; } } // 处理NDEF消息 processNdefMessages(msgs); } } 三、NFC实践应用 3.1 移动支付 移动支付是NFC技术的一个重要应用场景。以下是一个简单的移动支付示例: public class PaymentActivity extends AppCompatActivity { private NfcAdapter nfcAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_payment); nfcAdapter = NfcAdapter.getDefaultAdapter(this); if (nfcAdapter == null) { Toast.makeText(this, "NFC is not available", Toast.LENGTH_SHORT).show(); finish(); } } @Override protected void onResume() { super.onResume(); Intent intent = new Intent(this, PaymentActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0); nfcAdapter.enableForegroundDispatch(this, pendingIntent, null, null); } @Override protected void onPause() { super.onPause(); nfcAdapter.disableForegroundDispatch(this); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) { // 处理支付信息 handlePayment(intent); } } private void handlePayment(Intent intent) { Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); if (rawMsgs != null) { NdefMessage msg = (NdefMessage) rawMsgs[0]; NdefRecord[] records = msg.getRecords(); for (NdefRecord record : records) { if (record.getTnf() == NdefRecord.TNF_WELL_KNOWN && Arrays.equals(record.getType(), NdefRecord.RTD_TEXT)) { String paymentInfo = new String(record.getPayload()); // 处理支付信息 Toast.makeText(this, "Payment Info: " + paymentInfo, Toast.LENGTH_SHORT).show(); } } } } } 3.2 身份识别 NFC技术还可以用于身份识别,以下是一个简单的身份识别示例: public class IdentityActivity extends AppCompatActivity { private NfcAdapter nfcAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_identity); nfcAdapter = NfcAdapter.getDefaultAdapter(this); if (nfcAdapter == null) { Toast.makeText(this, "NFC is not available", Toast.LENGTH_SHORT).show(); finish(); } } @Override protected void onResume() { super.onResume(); Intent intent = new Intent(this, IdentityActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0); nfcAdapter.enableForegroundDispatch(this, pendingIntent, null, null); } @Override protected void onPause() { super.onPause(); nfcAdapter.disableForegroundDispatch(this); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) { // 处理身份信息 handleIdentity(intent); } } private void handleIdentity(Intent intent) { Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); if (rawMsgs != null) { NdefMessage msg = (NdefMessage) rawMsgs[0]; NdefRecord[] records = msg.getRecords(); for (NdefRecord record : records) { if (record.getTnf() == NdefRecord.TNF_WELL_KNOWN && Arrays.equals(record.getType(), NdefRecord.RTD_TEXT)) { String identityInfo = new String(record.getPayload()); // 处理身份信息 Toast.makeText(this, "Identity Info: " + identityInfo, Toast.LENGTH_SHORT).show(); } } } } } 四、总结 通过本文的解析,我们深入了解了Android 11系统中NFC技术的源码实现及其在实际应用中的使用方法。NFC技术以其便捷性和安全性,在移动支付、身份识别等领域有着广泛的应用前景。希望本文能为开发者们在NFC应用开发中提供有价值的参考。 参考文献 《Android NFC 开发实战详解》 《深入Android应用开发:核心技术解析与最佳实践》 Android官方文档 本文旨在为开发者提供全面的NFC技术解析和实践指南,希望对您的开发工作有所帮助。如果有任何疑问或建议,欢迎在评论区交流讨论。