📜  近场通信 (NFC)(1)

📅  最后修改于: 2023-12-03 15:28:18.862000             🧑  作者: Mango

近场通信 (NFC)

近场通信(Near Field Communication,NFC)是一种短距离高频无线技术,允许两个设备之间进行无线通信和数据交换,距离通常在4厘米或更短。NFC在移动支付、近距离数据传输、门禁系统等方面有广泛应用。

NFC标签

NFC标签是一种被动的NFC设备,可以存储信息并且被读取。常见的NFC标签类型包括MIFARE Classic、MIFARE Ultralight、NFC Forum Type 2等。

Android读写NFC标签

在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通讯技术实现的移动支付方式。用户只需将支持NFC支付的设备靠近POS机,便可完成支付流程。

Android实现NFC支付

在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技术,并能够在自己的开发中加以应用。