NFC功能如何实现?安卓开发教程步骤详解

NFC安卓开发实战指南

NFC技术核心原理
近场通信(NFC)允许安卓设备在10厘米内与其他NFC设备或标签安全交换数据,其工作模式包括:

安卓开发教程步骤详解

nfc徽章复制教程安卓篇
加载中
nfc徽章复制教程安卓篇
  • 读/写模式: 设备主动读取或写入NFC标签数据
  • 点对点模式: 两台设备直接交换信息(如Android Beam)
  • 卡模拟模式: 设备模拟实体智能卡(如门禁、支付卡)

开发环境与基础配置

  1. 权限声明 (AndroidManifest.xml)

    <uses-permission android:name="android.permission.NFC" />
    <uses-feature android:name="android.hardware.nfc" android:required="true" />
  2. NFC功能检测

    NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
    if (nfcAdapter == null) {
     Toast.makeText(this, "设备不支持NFC", Toast.LENGTH_SHORT).show();
     finish();
    } else if (!nfcAdapter.isEnabled()) {
     // 引导用户开启NFC
     startActivity(new Intent(Settings.ACTION_NFC_SETTINGS));
    }
  3. 前台调度系统配置 (Activity中)

    @Override
    protected void onResume() {
     super.onResume();
     PendingIntent pendingIntent = PendingIntent.getActivity(
         this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 
         PendingIntent.FLAG_MUTABLE
     );
     nfcAdapter.enableForegroundDispatch(this, pendingIntent, null, null);
    }

@Override
protected void onPause() {
super.onPause();
nfcAdapter.disableForegroundDispatch(this);
}


---
### 二、NDEF数据解析实战
处理最常见的NFC数据格式(NDEF):
```java
@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];
                for (NdefRecord record : messages[i].getRecords()) {
                    // 解析文本记录
                    if (record.getTnf() == NdefRecord.TNF_WELL_KNOWN && 
                        Arrays.equals(record.getType(), NdefRecord.RTD_TEXT)) {
                        byte[] payload = record.getPayload();
                        String textEncoding = ((payload[0] & 128) == 0) ? "UTF-8" : "UTF-16";
                        int languageCodeLength = payload[0] & 0063;
                        String text = new String(payload, languageCodeLength + 1, 
                                payload.length - languageCodeLength - 1, textEncoding);
                        Log.d("NFC", "文本内容: " + text);
                    }
                    // 解析URI记录
                    else if (record.getTnf() == NdefRecord.TNF_WELL_KNOWN && 
                            Arrays.equals(record.getType(), NdefRecord.RTD_URI)) {
                        Uri uri = record.toUri();
                        Log.d("NFC", "URI: " + uri.toString());
                    }
                }
            }
        }
    }
}

高级应用场景实现

门禁卡模拟(需系统权限)

安卓开发教程步骤详解

// 获取卡片ID(UID)
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
byte[] uid = tag.getId();
String hexUid = bytesToHex(uid); // 转换为十六进制字符串
// 模拟逻辑(需ROOT或系统签名)
if (hexUid.equals("A1B2C3D4")) { 
    unlockDoor(); // 执行开锁操作
}

HCE主机卡模拟开发

public class MyHostApduService extends HostApduService {
    @Override
    public byte[] processCommandApdu(byte[] commandApdu, Bundle extras) {
        if (Arrays.equals(COMMAND_SELECT, commandApdu)) {
            return SELECT_OK_SW; // 0x9000
        } else if (Arrays.equals(COMMAND_VERIFY, commandApdu)) {
            return verifyPin(commandApdu); // 自定义验证逻辑
        }
        return UNKNOWN_CMD_SW; // 0x0000
    }
    @Override
    public void onDeactivated(int reason) { }
}
// AndroidManifest.xml注册服务
<service android:name=".MyHostApduService"
         android:exported="true"
         android:permission="android.permission.BIND_NFC_SERVICE">
    <intent-filter>
        <action android:name="android.nfc.cardemulation.action.HOST_APDU_SERVICE"/>
    </intent-filter>
    <meta-data android:name="android.nfc.cardemulation.host_apdu_service"
               android:resource="@xml/apduservice"/>
</service>

避坑指南与性能优化

  1. 厂商兼容性问题

    • 华为/小米等设备可能限制后台NFC扫描
    • 解决方案:申请android.permission.USE_CREDENTIALS权限(需系统签名)
  2. NDEF写入稳定性

    // 写入前检查标签是否可写
    Ndef ndef = Ndef.get(tag);
    if (ndef != null) {
        ndef.connect();
        if (!ndef.isWritable()) {
            throw new IOException("标签不可写");
        }
        // 执行写入操作...
    }
  3. 低功耗设计

    • 检测到标签后立即释放资源
    • 避免在onNewIntent()中执行耗时操作

安全加固方案

  1. 防中继攻击

    安卓开发教程步骤详解

    // 验证NFC通信距离(示例逻辑)
    if (calculateDistance(tag) > 0.1) { // 单位:米
        abortTransaction();
    }
  2. 数据加密传输

    // 使用AES加密NDEF负载
    Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
    cipher.init(Cipher.ENCRYPT_MODE, secretKey);
    byte[] encryptedPayload = cipher.doFinal(payload);

技术思考:随着UWB技术的普及,NFC+UWB组合定位将成为高精度近场交互新标准,开发者需提前关注Android UWB API,构建空间感知能力。

实战挑战:你在尝试NFC门禁模拟时是否遇到过厂商加密?或对HCE支付开发有具体疑问?欢迎在评论区分享你的技术瓶颈或成功案例,我们将抽取典型问题深度剖析解决方案!

首发原创文章,作者:王坚‌,如若转载,请注明出处:https://idctop.com/article/22657.html

(0)
ASP.NET服务器环境配置教程,从零开始搭建高效运行环境
上一篇 2026年2月11日 02:26
服务器负载均衡有什么用?作用原理与提升性能方法详解
下一篇 2026年2月11日 02:28

相关推荐

  • 微信开发文件下载怎么实现,微信小程序文件下载教程

    在微信生态内进行文件下载功能开发,核心痛点在于微信浏览器对普通文件流下载的限制以及小程序原生API的机制差异,实现高效、稳定的文件下载,必须采取“环境判断-权限处理-平台适配”的三步策略,针对小程序与H5页面分别构建独立的下载逻辑,并严格处理用户授权与文件预览环节, 只有打通这些技术关节,才能在保障用户体验的前……

    2026年3月30日
    9300
  • 母婴渠道开发加盟代理怎么找?母婴加盟

    母婴渠道开发母婴渠道开发的核心在于构建以用户为中心的数字化全渠道体系,整合线上线下资源,精准触达目标群体,通过数据驱动优化,实现高效转化与长期忠诚度提升,现代父母需求日益个性化和场景化,渠道开发必须兼顾便捷性、信任感和体验价值,方能抢占市场先机,母婴市场的独特特性母婴市场用户群体高度敏感,决策周期长,注重安全与……

    2026年2月16日
    15900
  • web前端开发简历怎么写?前端开发简历模板下载

    一份优秀的Web前端开发简历,其核心价值在于能够用数据量化的项目成果与匹配度极高的技术栈,在HR扫描的前10秒内锁定面试机会,简历不仅仅是工作经历的罗列,更是个人技术品牌与解决问题能力的直接体现,其根本目的是证明求职者能够胜任目标岗位并为企业创造实际价值,技术栈的精准布局与关键词策略技术能力是前端开发者的立身之……

    2026年4月2日
    9400
  • 彩票是谁开发的,福利彩票最早起源于哪个国家?

    彩票系统的开发并非单一发明者的创造,而是从古代公共筹资形式演变至今,由政府授权的专业软件开发商构建的高安全性金融科技系统,现代彩票系统的核心在于确保公平性、随机性及资金安全,其开发过程融合了密码学、高并发架构及严格的合规审计机制,要构建一套符合行业标准的彩票系统,必须理解其历史渊源背后的技术逻辑,并掌握现代软件……

    2026年3月1日
    11800
  • mac上的开发工具有哪些?Mac开发工具推荐排行榜

    macOS 系统凭借其 Unix 底层架构与卓越的图形界面,构建了一个高效、稳定且现代化的开发环境,对于开发者而言,选择正确的工具链,意味着将生产力提升至极限,核心结论在于:构建一套高效的 Mac 开发工具链,必须围绕代码编辑器、终端环境、版本控制、API 测试及数据库管理五大核心维度进行深度配置,而非简单的软……

    2026年3月9日
    14300
  • 微信开发中如何避免常见错误?专家分享实战经验 | 微信开发分析

    微信开发的核心在于深度整合微信生态的用户流量与社交属性,通过小程序、公众号等平台实现高效业务闭环,提升用户粘性与转化率,作为全球最大社交应用之一,微信月活用户超12亿,开发者需掌握其开放能力来构建沉浸式体验,本教程基于多年实战经验,系统分析开发全流程,提供可落地的专业方案,微信开发生态概述微信开发主要围绕小程序……

    程序开发 2026年2月14日
    11800
  • ZgoCloud日本、美国VPS测评:19.9美元/月实测数据与性能表现

    在跨境业务与出海建站场景中,网络基础设施的稳定性与延迟表现直接决定用户体验,本次针对ZgoCloud主打的美西洛杉矶与日本东京机房的VPS进行了为期72小时的深度实测,结合19.9美元/月的定价策略,提供详尽的性能数据与选购参考, 测评环境与基础配置本次实测选取ZgoCloud两款热门线路VPS,核心配置如下……

    2026年5月3日
    7000
  • 供应商开发体系怎么建立?供应商开发流程详解

    构建高效的供应商开发体系是企业供应链管理的核心战略,直接决定了企业的成本竞争力、交付能力与产品质量,一个成熟的体系不仅仅是寻找供应商的流程,更是企业整合外部资源、降低经营风险、实现价值最大化的关键机制,核心结论在于:企业必须从单纯的“比价采购”转向“战略寻源”,建立包含渠道拓展、准入审核、样件验证、绩效评估在内……

    2026年3月11日
    13100
  • 公司建网站到底要花多少钱?建一个网站需要多少费用

    公司建一个网站需要多少费用在数字化转型的浪潮中,企业官网不仅是品牌的线上名片,更是获客转化的核心阵地,许多企业在启动网站建设时,往往会被“建站费用”这一模糊的概念困扰,建站成本并非单一的数字,而是由域名注册、服务器配置、域名备案、网站开发设计以及后期维护等多个维度共同构成的综合体系,为了帮助企业在2026年的市……

    2026年6月28日
    1500
  • 个人网站需要哪些内容?个人网站搭建必备要素有哪些

    2026年高性价比云主机深度测评与优惠解析在构建个人网站、博客或小型应用时,服务器(VPS/云主机)是决定网站加载速度、稳定性及用户体验的核心基础设施,面对市场上琳琅满目的云服务商,许多个人开发者往往陷入“参数陷阱”,忽略了实际业务场景下的性能表现与长期维护成本,本文将基于2026年的最新市场数据,从性能实测……

    2026年7月4日
    20200

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注