📅  最后修改于: 2023-12-03 15:29:20.787000             🧑  作者: Mango
NFC(Near Field Communication)即近距离无线通信技术,是一种基于 RFID(Radio Frequency Identification)技术的非接触式通信,具有短距离、高频率、高安全性、低功耗等特点。在 Android 设备上,NFC 用于实现设备之间的数据传输、电子支付、智能标签读取等应用。本文将介绍 Android 平台下 NFC 的相关知识和使用方法。
使用以下代码检测设备是否支持 NFC:
boolean hasNfc = getPackageManager().hasSystemFeature(PackageManager.FEATURE_NFC);
if (hasNfc) {
// 设备支持 NFC
} else {
// 设备不支持 NFC
}
可以使用如下代码来打开 NFC:
NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
if (nfcAdapter != null) {
if (!nfcAdapter.isEnabled()) {
Intent intent = new Intent(Settings.ACTION_NFC_SETTINGS);
startActivity(intent);
}
}
使用如下代码来关闭 NFC:
NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
if (nfcAdapter != null) {
if (nfcAdapter.isEnabled()) {
nfcAdapter.disable();
}
}
在 Android 中,读取 NFC 标签的数据需要实现 NFCAdapter.ReaderCallback
接口,具体代码如下:
public class MainActivity extends AppCompatActivity implements NfcAdapter.ReaderCallback {
private NfcAdapter mNfcAdapter;
private PendingIntent mPendingIntent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化 NfcAdapter 和 PendingIntent
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
mPendingIntent = PendingIntent.getActivity(this, 0,
new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
}
@Override
protected void onResume() {
super.onResume();
// 开启前台调度系统
if (mNfcAdapter != null) {
mNfcAdapter.enableReaderMode(this, this, NfcAdapter.FLAG_READER_NFC_A, null);
}
}
@Override
protected void onPause() {
super.onPause();
// 关闭前台调度系统
if (mNfcAdapter != null) {
mNfcAdapter.disableReaderMode(this);
}
}
@Override
public void onTagDiscovered(Tag tag) {
String[] techList = tag.getTechList();
for (String tech : techList) {
if (tech.equals(NfcA.class.getName())) {
NfcA nfcA = NfcA.get(tag);
try {
nfcA.connect();
byte[] data = nfcA.transceive(new byte[]{/*查询数据的命令*/});
// 处理数据
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
nfcA.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}
写入 NFC 标签的数据比较简单,可以直接调用 Tag
对象的 writeNdefMessage()
方法,示例代码如下:
Tag tag = ...; // 获取要写入的标签
NdefMessage ndefMessage = ...; // 要写入的 NDEF 消息对象
Ndef ndef = Ndef.get(tag);
if (ndef != null) {
ndef.connect();
boolean isSuccess = false;
if (ndef.isWritable()) {
isSuccess = true;
try {
ndef.writeNdefMessage(ndefMessage);
} catch (Exception e) {
isSuccess = false;
e.printStackTrace();
}
}
try {
ndef.close();
} catch (IOException e) {
e.printStackTrace();
}
if (isSuccess) {
// 写入成功
} else {
// 写入失败
}
}
使用 NFC 实现移动支付需要获取设备的 SE(Secure Element)芯片,SE 是一种专门用于加密计算的微处理器,具有高度安全性,可以对应用程序提供安全存储和执行加密计算的环境。在 Android 上,SE 芯片一般由设备厂商或运营商提供,可以通过相应的 SDK 接口来访问。具体的实现方法和接口使用请参考相关的文档和资料。
以上介绍了 Android 平台下 NFC 功能的相关知识和使用方法,包括检测设备是否支持 NFC、打开/关闭 NFC、NFC 标签的读写和支付功能等。NFC 技术应用非常广泛,未来也将越来越普及和成熟,开发者可以结合自身需求灵活运用。