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/nfc%e5%8a%9f%e8%83%bd%e5%a6%82%e4%bd%95%e5%ae%9e%e7%8e%b0%ef%bc%9f%e5%ae%89%e5%8d%93%e5%bc%80%e5%8f%91%e6%95%99%e7%a8%8b%e6%ad%a5%e9%aa%a4%e8%af%a6%e8%a7%a3/

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

相关推荐

  • 云服务器没有声音提示怎么办,远程连接没有声音如何解决?

    云服务器没有声音提示是正常现象,绝大多数云厂商默认不配置声卡设备,但这并不代表无法解决,通过正确的系统设置和虚拟音频方案完全可以恢复声音提醒功能,为什么云服务器天生“哑巴”云服务器本质上是一台寄居在数据中心的物理机切片,它的硬件资源完全由虚拟化层调度分配,声卡这类与远程用户交互的硬件设备,在默认分配策略中几乎不……

    2026年9月27日
    100
  • 仙剑5前传开发山怎么去?开发山隐藏剧情触发攻略

    《仙剑奇侠传五前传》作为国产单机 RPG 的里程碑之作,其剧情深度、人物塑造以及迷宫设计至今仍被玩家津津乐道,开发山”这一地图场景的设计更是教科书级别的关卡设计典范,核心结论在于:“开发山”不仅仅是一个简单的迷宫关卡,它是游戏叙事与玩法机制完美融合的载体,通过高难度的解谜机制、独特的视觉氛围以及隐含的剧情隐喻……

    2026年4月8日
    6400
  • K8s Endpoint Controller是什么?如何配置K8s Endpoint Controller

    K8s Endpoint Controller在云原生架构的演进中,Kubernetes 的稳定性与扩展性已成为企业数字化转型的核心基石,作为底层基础设施的关键组件,Kubernetes Endpoint Controller 负责维护 Service 与 Pod 之间的网络映射关系,其性能直接决定了微服务调用……

    2026年7月10日
    7300
  • 人的大脑开发了多少?大脑开发程度真的只有10%吗?

    人类大脑的开发利用程度,实际上远超大众的普遍认知,所谓的“大脑只开发了10%”是一个缺乏科学依据的谬误,从神经科学和进化论的角度来看,大脑是一个高度节能且极其高效的器官,每一块脑组织都在特定的生理和心理活动中发挥着不可替代的作用,真正制约人类智力上限的,并非“未开发的脑区”,而是神经连接的效率、突触的可塑性以及……

    2026年3月11日
    13900
  • mysql是什么?mysql数据库安装教程

    关于mysql在构建高并发、大数据量的Web应用或企业级数据库系统时,MySQL作为全球最流行的开源关系型数据库管理系统,其性能表现直接决定了业务的稳定性与扩展性,数据库的性能瓶颈往往不仅仅取决于软件本身的优化,更与底层服务器的硬件配置、网络架构及运维支持密切相关,本次测评旨在通过真实的服务器环境部署,深入剖析……

    2026年6月13日
    3710
  • 开发软件用什么工具好?开发软件用什么语言最流行

    开发软件的核心在于选择合适的编程语言、开发工具、框架以及数据库,并遵循科学的开发流程,一套高效的技术栈组合,直接决定了软件的性能、开发效率及后期维护成本,面对市场上琳琅满目的技术方案,开发者需根据项目类型、团队技术储备及长期生态支持做出决策,而非盲目跟风热门技术,编程语言:软件开发的基石编程语言是构建软件逻辑的……

    2026年4月6日
    9300
  • 日本ZgoCloudVPS测评,实测体验与数据对比,日本VPS哪家好

    日本ZgoCloud VPS测评:实测体验与数据对比在云服务器市场竞争日益激烈的当下,日本节点因其独特的地理位置优势,成为连接东亚市场、降低延迟以及访问特定海外内容的首选方案,ZgoCloud作为近年来在VPS领域崭露头角的服务商,以其高性价比和灵活的配置方案吸引了大量用户关注,本文基于实际测试数据,从网络性能……

    程序开发 2026年5月25日
    4100
  • 开发报建专员是做什么的?开发报建专员工作内容有哪些?

    开发报建专员是房地产项目开发链条中决定项目生死时速的关键角色,其核心价值在于通过专业的行政审批统筹能力,将政策红利转化为企业的时间红利与经济效益,确保项目在合法合规的前提下实现最快周转,这一岗位绝非简单的“跑腿办事”,而是需要具备极强的政策解读能力、资源整合能力与风险预判能力的复合型专业人才, 核心职能:构建项……

    2026年3月23日
    11600
  • 中国银行天津开发区,业务拓展如何应对区域金融竞争挑战?

    中国银行天津开发区企业金融接口开发实战指南在天津开发区外向型经济高速发展的背景下,企业接入银行系统实现自动化金融操作成为刚需,本教程将基于中国银行天津分行开放平台,手把手实现企业账户余额查询功能的系统集成,采用主流技术栈确保方案落地性, 环境准备与技术选型天津开发区企业需特别关注:申请API权限登录中行天津分行……

    2026年2月5日
    13100
  • 个人自助网站怎么做?个人建站平台哪个好

    个人自助网站服务器深度测评与选型指南在构建个人自助网站、博客或小型应用时,服务器不仅是承载代码的硬件基础,更是决定用户体验、SEO排名以及长期运营稳定性的核心要素,对于个人开发者而言,面对市场上琳琅满目的云服务商,如何从性能、价格、稳定性及售后服务等多个维度进行科学评估,是降低试错成本的关键,本文将基于真实测试……

    2026年7月3日
    3700

发表回复

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