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

NFC安卓开发实战指南

NFC技术核心原理
近场通信(NFC)允许安卓设备在10厘米内与其他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)
上一篇 2026年2月11日 02:26
下一篇 2026年2月11日 02:28

相关推荐

  • APP开发申明怎么写,软件免责声明模板哪里找?

    一个完善的软件开发声明不仅是法律层面的免责护盾,更是建立用户信任、明确项目边界以及规范使用行为的核心基石,在程序开发的全生命周期中,无论是开源项目还是商业软件,一份专业、严谨且符合SEO优化逻辑的开发声明,能够有效规避知识产权纠纷,界定责任归属,并提升产品的专业形象,撰写开发声明并非简单的文字堆砌,而是需要结合……

    2026年2月17日
    5300
  • 如何成为腾讯后端开发工程师,腾讯后端开发岗位要求和薪资待遇

    构建高可用、高并发服务的架构精要腾讯后端体系以微服务化、云原生、智能运维为核心支柱,支撑着微信、QQ、王者荣耀等十亿级用户产品,其核心架构思想在于:通过服务化拆分提升迭代效率,依托云原生技术实现弹性伸缩,运用智能监控保障系统韧性,以下是分层解析:基础设施层:云原生筑基 (腾讯云TCS)容器化部署 (TKE):标……

    2026年2月15日
    9700
  • 汽车开发体系的最大痛点是什么?需求变更与协同困难的深度解析

    汽车开发体系是现代汽车工业复杂产品诞生的核心框架,它融合了机械工程、电子电气、软件工程、系统工程及项目管理等多学科知识,确保车辆的安全性、可靠性、功能性与创新性,构建高效、严谨的开发体系是车企核心竞争力的关键,汽车开发体系:从概念到量产的精密交响一套完整的汽车开发体系远不止设计图纸和组装零件,它是一个高度结构化……

    2026年2月15日
    5930
  • 为什么联想手机停止开发?揭秘联想手机市场策略与未来走向

    联想手机没有开发?共享技术方案与移动开发实战指南“联想手机没有开发”这一表述并不完全准确,联想集团作为全球领先的科技企业,其智能手机业务(Lenovo手机/Moto手机)拥有专业的研发团队,持续进行硬件设计、软件(基于Android的ZUI系统)开发、优化和维护工作,如果您指的是“联想手机应用开发”或“为联想手……

    程序开发 2026年2月14日
    300
  • Android开发社区有哪些?国内最好的安卓开发者论坛推荐

    Android开发社区是开发者技术进阶与解决复杂工程问题的核心生态系统,在移动应用开发日益复杂的今天,单打独斗已无法满足快速迭代的需求,深度融入并利用开发社区,是每一位Android开发者从入门到精通的必经之路,通过社区,开发者不仅能获取最新的技术动态,还能在遇到棘手Bug时获得高手的指点,更能通过参与开源项目……

    2026年2月16日
    10100
  • 安阳开发区地图高清版哪里下载?|安阳开发区位置导航图

    为什么需要安阳开发区地图?安阳开发区作为河南省重要的经济引擎,涵盖高新技术、制造业等产业集群,开发一个数字地图应用,能帮助用户直观浏览企业分布、交通路线和公共服务,提升招商引资效率,本教程将一步步教你用主流技术构建响应式地图,确保专业可靠且符合百度SEO优化,准备开发环境确保基础工具就绪,安装Node.js(推……

    2026年2月8日
    230
  • 阿里云平台开发入门指南,如何高效学习并掌握高流量云开发技术?

    阿里云平台开发简介阿里云作为全球领先的云计算服务提供商,为企业开发者提供一站式平台,支持从基础设施到应用开发的完整生命周期,其核心优势在于弹性伸缩、高可用性和成本优化,帮助团队快速构建和部署应用,无论你是初创公司还是大型企业,阿里云都能通过丰富的服务如ECS(弹性计算)、OSS(对象存储)和RDS(关系型数据库……

    2026年2月13日
    230
  • 研发活动说明怎么写?研究开发活动说明撰写指南

    研究开发活动是企业或机构推动创新的核心驱动力,涉及探索新技术、产品和解决方案的过程,在当今数字化时代,程序开发成为研究开发的关键组成部分,它通过代码实现想法,加速实验和产品迭代,本教程将深入解析如何在研究开发活动中高效进行程序开发,涵盖基础概念、实操步骤、最佳实践和常见问题解决,确保您能快速上手并提升项目成功率……

    程序开发 2026年2月11日
    200
  • Discuz模板制作怎么做?discuz模板开发详细步骤教程

    Discuz! 模板开发的核心在于理解和修改位于 /template/ 目录下的模板文件(.htm)及其关联的 CSS/JavaScript,通过覆盖默认结构和样式,可实现完全自定义的社区界面,以下是系统化的开发指南:理解Discuz!模板结构核心目录 (以默认模板default为例):/template/de……

    2026年2月13日
    130
  • 软件开发 系统分析如何有效提升系统分析在软件开发中的应用效率?

    软件开发的成功,其根基在于深入、准确、全面的系统分析,它是理解业务需求、定义问题边界、规划解决方案蓝图的关键阶段,直接决定了软件项目的成败,忽视系统分析,就如同在流沙上盖楼,无论后续编码如何精妙,最终都可能因需求偏差、架构缺陷或理解错位而崩塌,一个优秀的系统分析师,是业务与技术之间的桥梁,能将模糊的业务愿景转化……

    2026年2月5日
    200

发表回复

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