43 短距通信场景汇总:NFC / 二维码 / 剪贴板 / 超级终端
·
43 短距通信场景汇总:NFC / 二维码 / 剪贴板 / 超级终端
前言

图:43 短距通信场景汇总:NFC / 二维码 / 剪贴板 / 超级终端 运行效果截图(HarmonyOS NEXT)
至此,第六模块已覆盖了"鹿鹿·笔迹心理分析"App 中所有的短距通信方式:

图:鸿蒙短距通信4种方式——NFC/二维码/剪贴板/超级终端的使用场景对比
| 文章 | 技术 | 核心 API | 页面 |
|---|---|---|---|
| 第 39 篇 | NFC 碰一碰 UI | 脉冲动画 + 邀请状态机 | TapSharePage / BindRelationPage |
| 第 40 篇 | NFC Tag 读写 | @kit.ConnectedTagKit / tag / nfcController |
蓝图层 |
| 第 41 篇 | 二维码生成与扫描 | @kit.ScanKit / image.createQRImage |
TapSharePage / BindRelationPage |
| 第 42 篇 | 图片分享(pasteboard) | @kit.BasicServicesKit / pasteboard |
SharePage / MetaServiceCard |
本文作为第六模块的收官篇,对以上四种短距通信方式进行横向对比汇总,帮助读者在实际项目中做技术选型。
鸿蒙官方·NFC 开发指南:developer.huawei.com
项目源码仓库:harmony-app GitHub
一、四种方式总览
1.1 在项目中的角色定位
┌─────────────────────────────────────────────────────────────┐
│ 鹿鹿 App · 短距通信生态 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ NFC │ │ QR Code │ │pasteboard│ │超级终端 │ │
│ │ 碰一碰 │ │ 扫一扫 │ │ 剪贴板 │ │ 推送 │ │
│ ├──────────┤ ├──────────┤ ├──────────┤ ├──────────┤ │
│ │物理接触 │ │视觉对准 │ │ 一键复制 │ │ 网络推送 │ │
│ │0-4cm │ │ 0-50cm │ │ 即时 │ │ 远程 │ │
│ │不需要看屏 │ │ 需要看屏 │ │ 需要手动 │ │需要登录 │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
│ │ │ │ │ │
│ ▼ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 目标:分享笔迹分析 / 绑定关系 │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
1.2 关键技术栈
| 方式 | 鸿蒙 Kit | 核心模块 | 需要硬件 |
|---|---|---|---|
| NFC 碰一碰 | @kit.ConnectedTagKit |
@ohos.nfc.tag, @ohos.nfc.controller |
NFC 芯片 |
| 二维码扫描 | @kit.ScanKit |
scanCore.createScanEngine |
后置/前置摄像头 |
| 二维码生成 | @kit.ImageKit |
image.createQRImage |
无(纯软件) |
| 剪贴板 | @kit.BasicServicesKit |
pasteboard.getSystemPasteboard |
无 |
| 超级终端推送 | 系统能力 | 系统分布式软总线 | 华为账号 |
二、横向对比
2.1 传输特性对比
| 对比维度 | NFC 碰一碰 | 扫二维码 | 剪贴板 | 超级终端推送 |
|---|---|---|---|---|
| 传输距离 | 0-4cm | 0-50cm | N/A | 不限(网络) |
| 传输方向 | 双向(读写) | 单向(被扫) | 单向(写) | 双向 |
| 传输速度 | ~106-424 kbps | 视觉识别 ≈1s | 即时 | 网络速度 |
| 是否需要屏幕 | ❌ 不需要 | ✅ 需要(扫码者) | ✅ 需要 | ✅ 需要 |
| 是否需要网络 | ❌ 不需要 | ❌ 不需要 | ❌ 不需要 | ✅ 需要 |
| 数据容量 | NDEF 最大 ~8KB | 二维码 ~3KB | 剪贴板不限 | 不限 |
| 耗电量 | 低 | 中(摄像头) | 极低 | 中(网络) |
| 响应延迟 | ~500ms | ~1-2s | ~100ms | ~1-3s |
2.2 用户体验对比
| 场景 | NFC | 二维码 | 剪贴板 | 超级终端 |
|---|---|---|---|---|
| 面对面突然想分享 | ⭐⭐⭐ 背靠背即可 | ⭐⭐ 需要取景框 | ⭐ 需要手动粘贴 | ⭐ 需要网络 |
| 线下海报扫码 | ❌ 无法使用 | ⭐⭐⭐ 经典场景 | ❌ 无法使用 | ❌ 无法使用 |
| 快速复制内容 | ❌ | ❌ | ⭐⭐⭐ 最直接 | ⭐⭐ |
| 远程给朋友发报告 | ❌ | ⭐⭐ 截图发送 | ⭐ 需要对方粘贴 | ⭐⭐⭐ 直接推送 |
| 老人/非鸿蒙设备 | ❌ | ⭐⭐⭐ 扫码通用 | ⭐⭐⭐ 文字通用 | ❌ |
2.3 安全性对比
| 安全维度 | NFC | 二维码 | 剪贴板 | 超级终端 |
|---|---|---|---|---|
| 中间人攻击风险 | 极低(近距离) | 中(可能被替换) | 低(系统管控) | 低(加密通道) |
| 数据是否可嗅探 | 极低 | 可被他人扫描 | 可被其他 App 读取 | 低 |
| 是否需要用户确认 | ✅ 主动靠近 | ✅ 主动扫码 | ✅ 主动复制 | ✅ 主动推送 |
| 数据时效性 | 实时 | 可设置过期 | 即时 | 即时 |
| 防篡改 | 天然(物理接触) | 可伪造 | 不可篡改 | 加密传输 |
三、技术实现对比
3.1 代码量对比
| 方式 | 核心代码行数 | 关键 API 调用数 | 集成难度 |
|---|---|---|---|
| NFC 碰一碰 UI | ~80 行(脉冲动画) | 3(State + animateTo + setTimeout) | ⭐ 低 |
| NFC Tag 读写 | ~120 行 | 8(tag.on/connect/readNdef/writeNdef…) | ⭐⭐⭐ 高 |
| 二维码扫描 | ~100 行 | 5(createScanEngine/on/start/stop/release) | ⭐⭐ 中 |
| 二维码生成 | ~40 行 | 3(createQRImage/getPixelMap/packing) | ⭐ 低 |
| pasteboard 剪贴板 | ~20 行 | 3(createData/getSystemPasteboard/setData) | ⭐ 极低 |
| 超级终端推送 | ~30 行 | 2(pushViaSuperTerminal + Toast) | ⭐ 低(模拟) |
3.2 核心代码片段
NFC Tag 读写(最复杂,需要状态管理):
// @kit.ConnectedTagKit
import { tag, nfcController } from '@kit.ConnectedTagKit'
const MAX_TRIES = 3
async function handleNfcShare(): Promise<void> {
if (!nfcController.isNfcOpen()) {
// 提示用户开启 NFC
return
}
tag.on('tagDiscovery', async (tagInfo) => {
const ndefTag = tag.getNdefTag(tagInfo)
if (!ndefTag) return
try {
ndefTag.connect()
const records: tag.NdefRecord[] = [
{
tnf: 0x04,
type: stringToBytes('lulu.com:share'),
id: [],
payload: stringToBytes(buildSharePayload())
}
]
ndefTag.writeNdef(records)
ndefTag.close()
} catch (e) {
hilog.error(0x0000, 'Nfc', '写入失败: %{public}s', JSON.stringify(e))
}
})
}
二维码扫描(中等复杂度):
// @kit.ScanKit
import { scanCore } from '@kit.ScanKit'
const config: scanCore.ScanConfig = {
scanTypes: [scanCore.ScanType.QR_CODE],
scanMode: scanCore.ScanMode.CAMERA
}
const engine = scanCore.createScanEngine(context, config)
engine.on('scanResult', (result: scanCore.ScanResult) => {
handleScanContent(result.originalValue)
})
pasteboard 剪贴板(最简单的分享):
// @kit.BasicServicesKit
import { pasteboard } from '@kit.BasicServicesKit'
const data = pasteboard.createData(pasteboard.MIMETYPE_TEXT_PLAIN, '分享内容')
await pasteboard.getSystemPasteboard().setData(data)
二维码生成(Image Kit 一行调用):
// @kit.ImageKit
import { image } from '@kit.ImageKit'
const qrImage = image.createQRImage({
content: 'lulu://share?userId=1',
size: 200
})
const pixelMap = await qrImage.getPixelMap()
四、多通道策略设计
4.1 自动降级链
在实际项目中,NFC 不一定在所有设备上都可用。项目采用自动降级策略:
/**
* 分享方式自动选择
*
* 优先级链:
* ① NFC Tag(两台设备均支持 NFC + 开启)
* ↓ 不支持
* ② 二维码(扫一扫)
* ↓ 不方便扫码
* ③ 超级终端(需要网络 + 双方鸿蒙设备)
* ↓ 非鸿蒙设备
* ④ 剪贴板(通用方案,所有设备可用)
*/
function determineShareMethod(deviceInfo: DeviceInfo): ShareMethod {
if (deviceInfo.hasNfc && nfcController.isNfcOpen()) {
return ShareMethod.NFC // 优先 NFC
}
if (deviceInfo.hasCamera) {
return ShareMethod.QR_CODE // 其次扫码
}
if (deviceInfo.isConnected) {
return ShareMethod.SUPER_TERMINAL // 再推送
}
return ShareMethod.CLIPBOARD // 最后剪贴板兜底
}
4.2 BindRelationPage 的三级入口
关系绑定页提供了三种方式并列选择:
// 三种方式并列,用户按需选择
this.methods = [
{ key: 'tap', title: '碰一碰邀请', ... }, // NFC
{ key: 'qrcode', title: '扫一扫二维码', ... }, // 扫码
{ key: 'id', title: '输入鹿鹿 ID', ... }, // 手动输入
]
4.3 TapSharePage 的双按钮布局
// NFC 为主,二维码和超级终端为备选
Row() {
Button('生成二维码') // → 备选一
Button('超级终端推送') // → 备选二
}
五、项目中的完整短距通信链路
5.1 数据流转
┌──────────────┐
│ AI 分析结果 │ ← 笔迹分析 + 情绪分类
└──────┬───────┘
│
├──→ NFC Tag ──────→ 碰一碰分享(实时面对面)
│
├──→ 二维码 ────────→ 扫一扫获取(线下/线上)
│
├──→ 剪贴板 ────────→ 粘贴发送(通用)
│
└──→ 超级终端 ──────→ 推送设备(远程)
5.2 涉及的页面与 API
| 页面 | 使用的通信方式 | 涉及 Kit |
|---|---|---|
| CapturePage | 拍照 → 存储(前置) | Camera Kit / CoreFileKit |
| AnalyzingPage | 分析结果 → 触发分享 | AI 流水线 |
| ReportDetailPage | 分享入口 → SharePage | Router |
| SharePage | pasteboard 剪贴板 + 海报 | BasicServicesKit |
| TapSharePage | NFC UI + 二维码 + 超级终端 | ConnectedTagKit / ScanKit / ImageKit |
| BindRelationPage | 碰一碰 + 扫码 + ID 输入 | ConnectedTagKit / ScanKit |
| MetaServiceCard | 元服务 + 剪贴板 | BasicServicesKit |
| PosterTemplate | 海报中的二维码占位 | ArkUI 组件 |
5.3 涉及的鸿蒙 Kit 一览
| Kit 名称 | 用途 | 文章编号 |
|---|---|---|
@kit.CameraKit |
拍照取景 | 34、35 |
@kit.MediaLibraryKit |
相册选择 | 37 |
@kit.ImageKit |
图片解码 + 二维码生成 | 36、41 |
@kit.CoreFileKit |
文件操作与存储 | 36、38 |
@kit.ConnectedTagKit |
NFC Tag 发现与读写 | 39、40 |
@kit.ScanKit |
二维码扫描 | 41 |
@kit.BasicServicesKit |
剪贴板 pasteboard | 42 |
六、项目中的短距通信全景图
6.1 场景矩阵
面对面 远程
┌─────────┬──────────┐
鸿蒙设备 │ NFC │ 超级终端 │
│ 碰一碰 │ 推送 │
├─────────┼──────────┤
跨平台 │ 二维码 │ 剪贴板 │
│ 扫一扫 │ 复制粘贴 │
└─────────┴──────────┘
6.2 用户体验决策树
用户想分享笔迹分析报告
│
├─ 对方在身边?
│ ├─ 同是鸿蒙设备 → 碰一碰 NFC ⭐
│ └─ 安卓/iOS → 让对方扫二维码 ⭐
│
├─ 对方不在身边?
│ ├─ 鸿蒙设备 + 在线 → 超级终端推送 ⭐
│ └─ 其他 → 复制链接发消息 ⭐
│
└─ 想要留作纪念?
└─ 保存海报到相册 ⭐
6.3 项目当前实现状态
| 通信方式 | 实现状态 | UI | 实际通信 | 备注 |
|---|---|---|---|---|
| NFC 碰一碰动画 | ✅ 已完成 | ✅ 三层波纹脉冲 | ❌ 模拟 | Tag 需要真机调试 |
| NFC Tag 读写 | 蓝图 | ❌ 未实现 | 🔧 API 就绪 | 需要 NDEF 格式 |
| 二维码生成 | ✅ 已完成 | ❌ 未展示 | ✅ API 示例 | createQRImage 可用 |
| 二维码扫描 | 蓝图 | ❌ 未实现 | 🔧 API 就绪 | ScanKit 可用 |
| pasteboard 剪贴板 | ✅ 已完成 | ✅ 复制按钮 | ✅ 实际操作 | 生产可用 |
| 保存海报到相册 | ✅ 模拟 | ✅ 网格入口 | ❌ 模拟 | 需 MediaLibraryKit |
| 超级终端推送 | ✅ 模拟 | ✅ UI 按钮 | ❌ 模拟 | 需系统能力 |
七、开发建议与最佳实践
7.1 技术选型建议
/**
* 不同应用场景的短距通信选型建议
*
* 社交分享 App(如本项目):
* NFC → 碰一碰交友/分享(需要硬件支持)
* 二维码 → 邀请码/报告分享(通用性最强)
* 剪贴板 → 快速复制分享链接(兜底方案)
*
* 支付/票务 App:
* NFC → 碰一碰支付(主方案)
* 二维码 → 扫码支付/取票(备选)
*
* 办公/协作 App:
* 超级终端 → 跨设备文件传输(鸿蒙生态)
* 二维码 → 会议邀请/签到
* 剪贴板 → 快速传文字/链接
*/
7.2 多通道策略原则
| 原则 | 说明 |
|---|---|
| 首选最便捷的方式 | NFC > 二维码 > 超级终端 > 剪贴板 |
| 备选降级方案 | 当首选方式不可用时的自动降级 |
| 用户可主动选择 | 提供并列入口,尊重用户偏好 |
| 统一数据协议 | NFC、二维码、ID 输入使用相同的 lulu:// 协议格式 |
| 隐私优先 | 短距通信中只传递引用 ID,不传敏感数据 |
7.3 测试注意事项
/**
* 短距通信测试清单
*
* NFC:
* □ 真机测试(模拟器不支持 NFC)
* □ 不同距离(2cm / 4cm / 超出范围)
* □ NFC 开启/关闭状态切换
* □ 多标签环境(防冲突)
*
* 二维码:
* □ 不同光照条件下的识别率
* □ 不同尺寸二维码(小码识别能力)
* □ 损坏/扭曲二维码的容错率
* □ 扫码后结果正确处理
*
* 剪贴板:
* □ 写入后立即读取验证
* □ 特殊字符(emoji、中文、换行符)
* □ 超长文本截断
* □ 其他 App 覆盖剪贴板后的状态
*/
八、第六模块回顾
8.1 文章内容回顾
| 编号 | 标题 | 主题 |
|---|---|---|
| 34 | Camera Kit 相机接入 | 权限管理 + CameraManager 初始化 |
| 35 | 拍照流程实现 | CaptureSession + PhotoOutput |
| 36 | 图像预处理与裁剪 | PixelMap 解码 + resize + crop |
| 37 | 相册读取 | PhotoViewPicker + PhotoSelectOptions |
| 38 | 图片压缩与存储 | ImagePacker + fileIo |
| 39 | NFC 碰一碰 UI | 脉冲动画 + 邀请状态机 |
| 40 | NFC Tag 读写 | NDEF + tag.onDiscovery |
| 41 | 二维码生成与扫描 | ScanKit + createQRImage |
| 42 | 图片分享 | pasteboard + Grid 渠道 |
| 43 | 短距通信汇总 | 横向对比 + 选型建议 |
8.2 涉及的鸿蒙 Kit
Camera Kit → 拍照
MediaLibraryKit → 相册
ImageKit → 图片编解码 + 二维码生成
CoreFileKit → 文件存储
ConnectedTagKit → NFC
ScanKit → 二维码扫描
BasicServicesKit → 剪贴板
九、注意事项与常见问题
9.1 开发注意事项
在正式开发前,建议按以下步骤完成环境准备与前置检查:
- 版本确认:检查 DevEco Studio 与 SDK 版本,确保满足目标 API Level 要求
- 权限声明:在
module.json5的requestPermissions字段中提前声明所有需要的系统权限 - 设备能力检查:调用前验证设备是否支持目标能力(相机、NFC、传感器等)
- 异步封装:所有耗时操作(数据库、文件 I/O、网络请求)统一使用
async/await处理 - 资源释放:在组件
aboutToDisappear()生命周期钩子中及时释放系统资源,防止内存泄漏
9.2 常见错误与解决方案
常见问题快速排查表:
| 问题类型 | 排查方向 | 参考方法 |
|---|---|---|
| 应用崩溃 | 查看 hilog 错误日志 | hilog.error(TAG, "...", e.message) |
| 状态丢失 | 检查 AppStorage 键名拼写 | 统一使用常量管理键名 |
| 动画不流畅 | 避免在 animateTo 回调中执行 I/O | 动画与数据操作分离 |
总结
本文全面介绍了 43 短距通信场景汇总:NFC / 二维码 / 剪贴板 / 超级终端 的核心知识与实战技巧。从基础概念到完整实现,每个环节都紧密结合 HarmonyOS NEXT 的实际开发场景,为构建高质量的鸿蒙应用奠定了坚实基础。
希望本文能为你的鸿蒙开发之旅提供有价值的参考,欢迎收藏备用,下一篇将继续深入探讨相关进阶主题。
下一模块将进入 Canvas 高级绘图,覆盖雷达图、折线图、匹配圆环等数据可视化组件。
如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!
参考资源:
- NFC 开发概述
- Scan Kit 开发概述
- pasteboard API 参考
- 超级终端开发指南
- [TapSharePage 项目源码](file:///Users/fiona/Downloads/bijixinli/harmony-app/entry/src/main/ets/pages/TapSharePage.ets)
- [BindRelationPage 项目源码](file:///Users/fiona/Downloads/bijixinli/harmony-app/entry/src/main/ets/pages/BindRelationPage.ets)
- [SharePage 项目源码](file:///Users/fiona/Downloads/bijixinli/harmony-app/entry/src/main/ets/pages/SharePage.ets)
- [第六模块全部十篇文章目录](file:///Users/fiona/Downloads/bijixinli/harmony-app/articles/)
- HarmonyOS 开发文档
更多推荐

所有评论(0)