📅  最后修改于: 2023-12-03 15:28:18.862000             🧑  作者: Mango
近场通信(Near Field Communication,NFC)是一种短距离高频无线技术,允许两个设备之间进行无线通信和数据交换,距离通常在4厘米或更短。NFC在移动支付、近距离数据传输、门禁系统等方面有广泛应用。
NFC标签是一种被动的NFC设备,可以存储信息并且被读取。常见的NFC标签类型包括MIFARE Classic、MIFARE Ultralight、NFC Forum Type 2等。
在Android设备上使用NFC功能,可以通过系统NFC API进行操作。
// 检查设备是否支持NFC
PackageManager pm = context.getPackageManager();
if (!pm.hasSystemFeature(PackageManager.FEATURE_NFC)) {
// 设备不支持NFC
return;
}
// 在Activity中注册NFC事件
private PendingIntent createPendingIntent(Context context) {
Intent intent = new Intent(context, getClass());
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
return PendingIntent.getActivity(
context, 0, intent, 0);
}
NfcAdapter mAdapter = NfcAdapter.getDefaultAdapter(this);
if (mAdapter == null) {
// 设备不支持NFC
return;
}
PendingIntent pendingIntent = createPendingIntent(this);
mAdapter.enableForegroundDispatch(this, pendingIntent, null, null);
以上代码演示了如何检查设备是否支持NFC,并在Activity中注册NFC事件。接下来我们看一下如何在Activity中处理NFC事件。
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) {
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
// 处理Tag数据
}
}
以上代码中,我们在Activity的onNewIntent
方法中处理NFC事件。当一个NFC标签被检测到时,系统会发送一个ACTION_TAG_DISCOVERED
广播。我们可以从Intent中获取一个Tag
对象,然后通过这个对象进行数据读写。
// 写入数据到NFC标签
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) {
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
Ndef ndef = Ndef.get(tag);
if (ndef != null) {
try {
ndef.connect();
NdefRecord record = NdefRecord.createTextRecord("en", "Hello, world!");
NdefMessage message = new NdefMessage(new NdefRecord[] { record });
ndef.writeNdefMessage(message);
ndef.close();
} catch (IOException e) {
// 写入失败
} catch (FormatException e) {
// 写入失败
}
} else {
// 标签不支持NDEF格式
}
}
}
// 从NFC标签中读取数据
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) {
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
Ndef ndef = Ndef.get(tag);
if (ndef != null) {
try {
ndef.connect();
NdefMessage message = ndef.getNdefMessage();
NdefRecord[] records = message.getRecords();
for (NdefRecord record : records) {
String text = record.toUri().toString();
// 使用text数据
}
ndef.close();
} catch (IOException e) {
// 读取失败
} catch (FormatException e) {
// 读取失败
}
} else {
// 标签不支持NDEF格式
}
}
}
以上代码演示了如何在Android中使用NFC功能进行数据读写。在写入数据时,我们使用了NDEF格式进行存储。在读取数据时,我们先读取NDEFMessage,然后获取其中的NDEFRecord。
NFC支付是指通过NFC通讯技术实现的移动支付方式。用户只需将支持NFC支付的设备靠近POS机,便可完成支付流程。
在Android上实现NFC支付,需要调用支付宝或微信提供的SDK,进行支付操作。通过这些SDK,我们可以调用支付API,发起支付请求。
// 支付宝支付
private void alipay(String orderInfo) {
PayTask payTask = new PayTask(activity);
Map<String, String> result = payTask.payV2(orderInfo, true);
if ("9000".equals(result.get("resultStatus"))) {
// 支付成功
} else {
// 支付失败
}
}
// 微信支付
private void wechatPay(String request) {
IWXAPI api = WXAPIFactory.createWXAPI(activity, APP_ID);
PayReq req = new PayReq();
req.appId = APP_ID;
req.partnerId = PARTNER_ID;
req.prepayId = PREPAY_ID;
req.nonceStr = NONCE_STR;
req.timeStamp = String.valueOf(System.currentTimeMillis() / 1000);
req.packageValue = "Sign=WXPay";
req.sign = SIGN;
api.sendReq(req);
}
以上代码演示了如何在Android上实现支付宝和微信支付,通过支付宝和微信提供的SDK完成支付操作。
本文介绍了近场通信(NFC)技术的应用和在Android上的开发实践。无论是数据传输还是支付功能,都可以通过NFC技术实现。希望读者能够通过本文了解NFC技术,并能够在自己的开发中加以应用。