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

相关推荐

  • IBM的MapReduce是什么?MapReduce的工作原理及优缺点分析

    关于ibm的mapreduce在云计算与大数据处理日益成为企业数字化转型核心驱动力的今天,底层计算框架的稳定性、扩展性以及成本效益直接决定了业务创新的边界,IBM作为企业级计算领域的长期领导者,其基于Hadoop生态构建的MapReduce解决方案,并非简单的开源代码堆砌,而是经过数十年企业级场景打磨的工业级标……

    2026年6月15日
    4900
  • unity 4.3游戏开发怎么入门?unity 4.3游戏开发教程与实战指南

    Unity 4.3游戏开发:奠定2D游戏工业化的关键转折点2014年发布的Unity 4.3,虽为旧版,却在2D游戏开发领域实现了革命性突破,它首次将2D工作流从“临时补丁”升级为完整、稳定、可量产的专业引擎支持体系,成为 indie开发者构建高质量2D作品的基石,本文从技术架构、核心功能、开发流程、性能优化与……

    程序开发 2026年4月17日
    4900
  • 人脸识别系统规定有哪些?人脸识别系统规定

    关于人脸识别系统的规定在数字化身份认证日益普及的今天,人脸识别技术已从单纯的安防监控延伸至金融支付、智慧社区及企业考勤等核心场景,随着《个人信息保护法》与《信息安全技术 个人信息安全规范》等法规的落地,合规性已成为人脸识别系统部署的首要门槛,对于服务器基础设施而言,如何在满足严苛法律合规要求的同时,提供毫秒级的……

    2026年6月4日
    5800
  • ios游戏开发pdf下载?ios游戏开发电子书免费资源

    iOS游戏开发的核心路径:高效学习与实战落地掌握iOS游戏开发,关键在于系统化知识构建 + 工具链深度实践 + 持续迭代能力,本文基于苹果最新技术栈(Swift 5.9 + Xcode 15 + iOS 17),结合行业主流引擎(SpriteKit、SceneKit、Unity、Unreal),为你梳理一条可落……

    程序开发 2026年4月17日
    7100
  • Mac提示来自不明开发者怎么办,Mac软件损坏无法打开怎么修复

    macOS系统中遇到应用无法打开,提示“无法打开因为来自身份不明的开发者”是开发者和高级用户经常面临的安全限制问题,核心结论是:这一现象源于macOS的安全机制Gatekeeper,通过右键菜单、系统设置修改或命令行移除隔离属性,可以有效解决该问题,同时需平衡系统安全性与开发效率,根本原因分析:Gatekeep……

    2026年2月23日
    16500
  • 魔幻农庄游戏开发需要多少钱?,魔幻农庄游戏开发成本预算

    构建沉浸式虚拟田园的核心框架与实战核心结论: 成功开发一款吸引玩家的魔幻农庄游戏,关键在于打造循环自洽的核心玩法(种植/养殖、合成、探索、交易),采用稳定可扩展的技术架构(Unity+稳定后端+合理数据库),并融入适度的魔幻元素与强社交驱动,最终通过精细化运营与数据分析持续优化体验, 核心玩法设计:构建成瘾性循……

    程序开发 2026年2月16日
    18900
  • 云服务器1m带宽够用吗?云服务器1m带宽够不够用

    关于云服务器1m在云计算基础设施日益普及的今天,带宽资源往往是决定应用体验的关键瓶颈,许多初学者或小型项目开发者在选购服务器时,常对“1M带宽”这一基础配置产生困惑:它究竟能承载多大的业务?在2026年的市场环境下,1M带宽的云服务器是否依然具有性价比?本文将基于真实测试数据与行业经验,深入剖析1M带宽云服务器……

    程序开发 2026年6月9日
    2800
  • ios开发流媒体怎么做,ios流媒体开发教程推荐

    iOS流媒体开发的核心在于构建一套低延迟、高稳定且具备强纠错能力的音视频传输链路,这直接决定了直播、视频会议及实时互动场景的用户体验,成功的流媒体应用并非简单的API堆砌,而是对采集、编码、传输、渲染全链路的精细化打磨,必须在弱网环境下依然保持画面的流畅与音画的同步, 开发者必须从系统底层机制出发,平衡性能消耗……

    2026年3月23日
    12100
  • 公有云价格真的便宜吗?公有云价格表现六大误区

    关于公有云价格表现的六大误区在数字化转型的深水区,云计算已从单纯的IT基础设施升级为企业的核心竞争力,许多企业在进行服务器选型与成本核算时,往往被表面上的“低价”标签所迷惑,忽略了长期运营中的隐性成本与性能损耗,作为深耕云计算领域多年的技术观察者,我们基于大量真实业务场景的压测数据与财务模型分析,梳理出关于公有……

    2026年6月1日
    5500
  • 个人网站通讯地址怎么填?网站备案必填信息详解

    【个人网站通讯地址】在构建个人网站或小型企业官网的初期,许多站长往往忽略了服务器选型的重要性,直到流量激增导致访问卡顿,或遭遇数据丢失才追悔莫及,服务器作为网站的“地基”,其稳定性、响应速度及安全性能直接决定了用户体验与业务连续性,本文基于实测数据与长期运维经验,深度解析当前主流服务器产品的优劣,助您做出最理性……

    2026年7月5日
    14600

发表回复

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