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

长按可调倍速

【极客学院】 Android 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

相关推荐

  • ios开发网络怎么做?ios开发网络请求原理详解

    iOS开发网络层的核心构建在于构建一套高效、稳定且安全的通信架构,其本质是对网络请求生命周期的全链路管控,优秀的网络层设计不仅能保障数据传输的准确性与安全性,更能通过缓存策略与并发控制显著提升用户体验,这是iOS应用架构中至关重要的一环, 开发者必须跳出单纯的API调用思维,从架构高度审视网络层的健壮性与扩展性……

    2026年3月22日
    5600
  • arm开发资料哪里找?arm开发板入门教程推荐

    掌握ARM架构的核心逻辑与开发工具链,是构建高性能嵌入式系统的唯一捷径,在当前的嵌入式开发领域,ARM架构凭借其低功耗、高性能的绝对优势,已占据全球微控制器市场的主导地位,对于工程师而言,系统化的arm开发资料不仅是入门的基石,更是解决复杂工程难题、提升开发效率的关键所在,高效的学习路径应直接聚焦于架构原理、编……

    2026年3月17日
    8500
  • 小米4开发者在哪里打开?小米4开发者选项怎么开启

    小米4开启开发者选项的核心路径在于“系统设置”的隐藏入口,通过连续点击“MIUI版本”即可激活开发者模式,这是解决{小米4开发者在哪}这一问题的最直接、最权威的方案,对于一款经典的机型而言,系统版本的差异不会改变这一底层逻辑,掌握这一核心方法,便能解锁USB调试、窗口动画缩放等高级功能,为刷机、Root或日常深……

    2026年4月7日
    5700
  • InterServerVPS怎么样?美国4.8美元/月VPS性能实测好不好

    InterServer作为美国老牌主机商,凭借其自建机房和独特的“价格锁定”承诺,在站长圈中一直保持着较高的关注度,本次针对其入门级美国VPS方案进行深度实测,月付4.8美元的配置在实际生产环境中的表现究竟如何,以下为详尽的测评数据与分析, 测评基础信息与方案配置本次实测选用的是InterServer最基础的V……

    2026年4月28日
    2700
  • 如何用Java开发游戏?完整视频教程从入门到精通

    要构建高性能的Java游戏,LWJGL(Lightweight Java Game Library)是专业开发者的首选工具链,下面通过实战步骤演示核心开发流程:环境配置与项目初始化基础环境# 使用JDK 17+ (LTS版本)sdk install java 17.0.5-temMaven依赖配置<dep……

    2026年2月12日
    7660
  • 小米8开发选项在哪里,怎么打开开发者选项

    在小米8(MIUI系统)中,开发者选项默认处于隐藏状态,这是为了防止普通用户误操作修改系统核心参数,对于程序开发者和高级用户而言,开启并找到该选项是进行调试、性能分析及系统优化的前提,核心结论是:米8的开发选项在哪里?它位于“设置”->“更多设置”->“开发者选项”中,但前提是需要通过连续点击“MI……

    2026年2月18日
    17700
  • Web2.0开发是什么意思?Web2.0开发需要学哪些技术

    Web 2.0开发的核心在于构建以用户为中心、强调交互与数据动态管理的互联网应用体系,其本质是从单向信息传递向双向互动生态的转变,成功的Web 2.0项目不仅需要扎实的技术架构,更需深刻理解用户生成内容(UGC)与社会化网络的运作逻辑,通过富客户端技术提升用户体验,利用集体智慧创造数据价值,技术架构的革新与选择……

    2026年3月14日
    10800
  • HTML开发用什么IDE好 | VS Code推荐

    掌握现代HTML开发:提升效率的核心工具与实战指南开发高效、现代的HTML网页,选择并精通一款集成开发环境(IDE)是成功的关键起点,现代IDE已远超基础文本编辑器的范畴,成为集智能编码、实时调试、项目管理于一身的强大平台, 现代HTML开发IDE的核心能力支撑智能代码引擎语法高亮与错误提示:即时识别HTML标……

    2026年2月16日
    15200
  • 腾讯前端开发待遇如何?腾讯前端面试难吗?

    腾讯前端开发的技术体系代表了行业顶尖水准,其核心在于构建了一套高效率、高性能且具备极致用户体验的工程化解决方案,这套体系不仅支撑着微信、QQ等国民级应用的稳定运行,更通过标准化流程与前沿技术栈的深度融合,解决了海量并发与快速迭代之间的矛盾,是业界公认的标杆,技术栈选型:深度定制与标准化并重腾讯前端开发团队并未止……

    2026年4月4日
    5800
  • iOS UI开发如何入门?零基础教程步骤详解

    iOS UI开发实战指南:从入门到精通核心工具与框架选择UIKit vs SwiftUI: UIKit是成熟稳定的基石,掌控UIViewController生命周期、视图层级管理;SwiftUI是声明式新范式,代码简洁、实时预览、跨苹果平台通用,关键决策点: 新项目优先SwiftUI(尤其瞄准iOS16+),大……

    2026年2月13日
    9300

发表回复

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