更新记录
1.0.0(2026-03-20) 下载此版本
【v1.0.0】初始版本
- 基于UTS原生实现,直接访问Android NFC API
- 支持NFC标签的读取和写入操作
- 支持NDEF格式数据处理
- 内置超时检测和错误处理
- 提供完整的API接口和示例代码
平台兼容性
Android NFC Plugin for uni-app
这是一个基于Android原生UTS的uni-app NFC插件,直接访问Android的NFC API,解决JavaScript层无法获取NFC事件的问题。
功能特性
- ✅ 基于原生UTS实现
- ✅ 直接访问Android NFC API
- ✅ NFC标签写入
- ✅ NFC标签读取
- ✅ Toast提示
- ✅ 完善的错误处理
- ✅ 日志输出
- ✅ 超时检测
项目结构
androidnfs/
├── utssdk/
│ ├── app-android/
│ │ ├── index.uts # UTS实现文件
│ │ ├── manifest.json # Android原生配置
│ │ └── res/
│ │ └── values/
│ │ └── strings.xml
├── js_sdk/
│ └── index.js # JavaScript接口
├── package.json # 插件配置
└── README.md # 使用说明
安装方法
1. 复制插件文件
将androidnfs目录复制到项目根目录下:
ShopUniapp/
├── androidnfs/
│ ├── utssdk/
│ ├── js_sdk/
│ ├── package.json
│ └── README.md
2. 配置manifest.json
在项目的manifest.json中添加NFC权限:
{
"app-plus": {
"distribute": {
"android": {
"permissions": [
"<uses-permission android:name=\"android.permission.NFC\"/>",
"<uses-feature android:name=\"android.hardware.nfc\" android:required=\"true\"/>"
]
}
}
}
}
3. 在页面中引用
// 在需要使用NFC的页面中引入
import NFCHelper from '@/androidnfs/js_sdk/index.js'
API文档
NFCHelper.initialize(options)
初始化NFC功能。
参数:
options.alwaysRead(Boolean): 是否始终读取,默认falseoptions.isShowToast(Boolean): 是否显示Toast提示,默认true
返回:
- Promise
: 初始化是否成功
示例:
const success = await NFCHelper.initialize({
alwaysRead: false,
isShowToast: true
});
if (success) {
console.log('NFC初始化成功');
uni.showToast({
title: 'NFC初始化成功',
icon: 'success'
});
}
NFCHelper.writeData(url)
写入NFC标签。
参数:
url(String): 要写入的URL数据
返回:
- Promise
: 写入是否成功
示例:
const success = await NFCHelper.writeData('http://example.com');
if (success) {
console.log('写入成功');
uni.showToast({
title: 'NFC标签写入成功',
icon: 'success'
});
}
说明:
- 调用后会显示Toast提示"请将NFC标签靠近手机背面!"
- 30秒后如果没有检测到NFC标签,会返回超时错误
- 需要确保NFC标签靠近手机NFC感应区域
NFCHelper.readData()
读取NFC标签。
返回:
- Promise
: 读取是否成功
示例:
const success = await NFCHelper.readData();
if (success) {
console.log('读取成功');
uni.showToast({
title: 'NFC标签读取成功',
icon: 'success'
});
}
说明:
- 调用后会显示Toast提示"请将NFC标签靠近手机背面!"
- 5秒后如果没有检测到NFC标签,会返回超时错误
- 需要确保NFC标签靠近手机NFC感应区域
- 注意:当前版本只支持读取,不支持返回读取到的数据
NFCHelper.destroy()
销毁NFC功能,释放资源。
示例:
NFCHelper.destroy();
使用示例
完整的NFC写入示例
export default {
data() {
return {
nfcInitialized: false,
writeUrl: ''
}
},
methods: {
// 初始化NFC
async initNFC() {
try {
const success = await NFCHelper.initialize({
alwaysRead: false,
isShowToast: true
});
if (success) {
this.nfcInitialized = true;
uni.showToast({
title: 'NFC初始化成功',
icon: 'success'
});
} else {
uni.showToast({
title: 'NFC初始化失败',
icon: 'none'
});
}
} catch (error) {
console.error('NFC初始化错误:', error);
uni.showToast({
title: 'NFC初始化错误',
icon: 'none'
});
}
},
// 写入NFC标签
async writeNFC(url) {
try {
if (!this.nfcInitialized) {
uni.showToast({
title: '请先初始化NFC',
icon: 'none'
});
return;
}
this.writeUrl = url;
const success = await NFCHelper.writeData(url);
if (success) {
uni.showToast({
title: 'NFC标签写入成功',
icon: 'success'
});
} else {
uni.showToast({
title: '写入失败,请重试',
icon: 'none'
});
}
} catch (error) {
console.error('NFC写入操作异常:', error);
uni.showToast({
title: 'NFC操作失败',
icon: 'none'
});
}
},
// 读取NFC标签
async readNFC() {
try {
if (!this.nfcInitialized) {
uni.showToast({
title: '请先初始化NFC',
icon: 'none'
});
return;
}
const success = await NFCHelper.readData();
if (success) {
uni.showToast({
title: 'NFC标签读取成功',
icon: 'success'
});
} else {
uni.showToast({
title: '读取失败,请重试',
icon: 'none'
});
}
} catch (error) {
console.error('NFC读取操作异常:', error);
uni.showToast({
title: 'NFC操作失败',
icon: 'none'
});
}
},
// 销毁NFC
destroyNFC() {
try {
NFCHelper.destroy();
this.nfcInitialized = false;
uni.showToast({
title: 'NFC已关闭',
icon: 'success'
});
} catch (error) {
console.error('NFC销毁错误:', error);
}
},
// 页面卸载时销毁NFC
onUnload() {
if (this.nfcInitialized) {
this.destroyNFC();
}
}
},
onUnload() {
// 页面卸载时销毁NFC
if (this.nfcInitialized) {
this.destroyNFC();
}
}
}
重要说明
1. UTS插件 vs JavaScript插件
UTS插件(当前实现):
- ✅ 直接访问Android原生NFC API
- ✅ 可以正确处理NFC事件
- ✅ 可以实现完整的NFC标签读写逻辑
- ✅ 性能更好,执行效率更高
- ❌ 需要打包和发布流程
JavaScript插件(之前的实现):
- ✅ 简单快速,不需要等待审核
- ❌ JavaScript层无法直接获取NFC事件
- ❌ 无法实现完整的NFC标签检测逻辑
2. 当前实现状态
已实现:
- ✅ UTS原生NFC API访问
- ✅ NFC初始化和检测
- ✅ Toast提示
- ✅ 超时检测
- ✅ 错误处理
- ✅ 日志输出
待完善:
- ⚠️ JavaScript层与UTS层的通信机制
- ⚠️ NFC标签检测和写入逻辑的测试
- ⚠️ 读取功能的完善(返回读取到的数据)
3. 发布到插件市场
如果要发布到uni-app插件市场,需要:
- 打包插件:使用HBuilderX打包插件
- 上传到插件市场:登录DCloud开发者中心
- 审核通过:等待DCloud审核
- 发布:插件发布后,其他开发者可以搜索和使用
4. 本地测试
在发布前,建议先进行本地测试:
- 测试NFC初始化
- 测试NFC标签写入
- 测试NFC标签读取
- 测试错误处理
- 测试超时检测
注意事项
1. Android权限
确保在manifest.json中正确配置NFC权限:
{
"app-plus": {
"distribute": {
"android": {
"permissions": [
"<uses-permission android:name=\"android.permission.NFC\"/>",
"<uses-feature android:name=\"android.hardware.nfc\" android:required=\"true\"/>"
]
}
}
}
}
2. NFC标签要求
- 确保NFC标签已格式化
- 确保NFC标签支持NDEF格式
- 建议使用NFC Type 2或Type 4标签
- 确保NFC标签靠近手机NFC感应区域
3. 错误处理
所有NFC操作都可能失败,需要完善的错误处理:
try {
await NFCHelper.writeData(url);
} catch (error) {
console.error('NFC操作失败:', error);
uni.showToast({
title: '操作失败',
icon: 'none'
});
}
4. 性能优化
- 避免频繁初始化和销毁NFC
- 在页面卸载时及时销毁NFC
- 合理设置超时时间
- 避免在不需要NFC的页面初始化NFC
5. 调试
使用adb logcat查看Android原生日志:
adb logcat -s NFCHelper
故障排除
问题1: NFC未初始化
症状: 提示"NFC未初始化"
解决方案:
- 检查设备是否支持NFC
- 检查NFC是否已启用
- 检查Android权限是否已授予
问题2: 写入/读取超时
症状: 提示"写入超时"或"读取超时"
解决方案:
- 确保NFC标签靠近手机NFC感应区域
- 检查NFC标签是否正常工作
- 增加超时时间
- 检查NFC标签是否支持NDEF格式
问题3: 权限被拒绝
症状: 提示"权限被拒绝"
解决方案:
- 检查
manifest.json中的权限配置 - 引导用户手动授予权限
- 重启应用
版本历史
v1.0.0 (2024-03-19)
- ✅ 初始版本发布
- ✅ 基于UTS原生实现
- ✅ 支持NFC初始化
- ✅ 支持NFC标签写入
- ✅ 支持NFC标签读取
- ✅ Toast提示
- ✅ 错误处理
- ✅ 日志输出
- ✅ 超时检测
许可证
MIT License
联系方式
如有问题或建议,请联系开发团队。
致谢
感谢使用本NFC插件!

收藏人数:
下载插件并导入HBuilderX
赞赏(0)
下载 1
赞赏 0
下载 11458415
赞赏 1880
赞赏
京公网安备:11010802035340号