Files
idcard/lib/idcard.dart
2026-03-31 08:51:18 +08:00

215 lines
7.2 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import 'idcard_platform_interface.dart';
/// 身份证读卡器插件主类
/// 基于神思标准化接口规范实现的Flutter插件
class Idcard {
/// 获取平台版本
Future<String?> getPlatformVersion() {
return IdcardPlatform.instance.getPlatformVersion();
}
/// 获取USB权限
/// [vid] - USB设备的厂商ID默认为0x261A神思USB读卡器厂商ID
/// [pid] - USB设备的产品ID默认为0x0011
Future<int> getUsbPermission({int vid = 0x261A, int pid = 0x0011}) {
return IdcardPlatform.instance.getUsbPermission(vid, pid);
}
/// 打开设备连接
/// [portType] - 端口类型,支持"USB"、"COM"、"SKT"、"BTH"、"AUTO"
/// [portPara] - 端口参数,根据端口类型不同而不同
/// [extendPara] - 扩展参数
/// 返回值大于0表示成功设备句柄其他为失败
Future<int> openDevice({String portType = 'USB', String portPara = '', String extendPara = ''}) {
return IdcardPlatform.instance.openDevice(
portType: portType,
portPara: portPara,
extendPara: extendPara,
);
}
/// 设置当前设备(多设备操作)
/// [devHandle] - 设备句柄
/// 返回值0表示成功非0表示失败
Future<int> setCurrentDevice(int devHandle) {
return IdcardPlatform.instance.setCurrentDevice(devHandle);
}
/// 获取当前设备(多设备操作)
/// 返回值:返回当前设备的句柄
Future<int> getCurrentDevice() {
return IdcardPlatform.instance.getCurrentDevice();
}
/// 获取接口库信息
/// 返回值包含version和description的Map
Future<Map<String, String>> getLibraryInfo() {
return IdcardPlatform.instance.getLibraryInfo();
}
/// 获取设备型号
/// 返回值:设备型号字符串
Future<String> getTerminalModel() {
return IdcardPlatform.instance.getTerminalModel();
}
/// 设备轮询心跳
/// 用于检测与读卡器是否已建立连接并且通讯正常
/// 返回值0表示成功非0表示失败
Future<int> terminalHeartBeat() {
return IdcardPlatform.instance.terminalHeartBeat();
}
/// 获取接收数据
/// 获取最后一次通讯收到的数据,一般用于获取读卡器协议层错误信息
/// 返回值:最后一次通讯收到的数据
Future<List<int>> getLastRecvData() {
return IdcardPlatform.instance.getLastRecvData();
}
/// 获取设备固件版本
/// 返回值包含firmVersion和hardwareVersion的Map
Future<Map<String, String>> getTerminalFirmVersion() {
return IdcardPlatform.instance.getTerminalFirmVersion();
}
/// 获取设备序列号
/// 返回值:设备序列号字符串
Future<String> getTerminalSn() {
return IdcardPlatform.instance.getTerminalSn();
}
/// 关闭设备连接
/// 返回值0表示成功非0表示失败
Future<int> closeDevice() {
return IdcardPlatform.instance.closeDevice();
}
/// 寻找身份证卡片
/// 返回值大于0表示成功找到卡片小于等于0表示错误码
Future<int> findCard() {
return IdcardPlatform.instance.findCard();
}
/// 选择身份证卡片
/// 返回值大于0表示成功选择卡片小于等于0表示错误码
Future<int> selectCard() {
return IdcardPlatform.instance.selectCard();
}
/// 读取身份证(新版接口,支持多种证件类型)
/// [cardType] - 读取卡类型:
/// 0x00读取二代证或外国人或港澳台
/// 0x01只读二代证
/// 0x02只读外国人
/// 0x03只读港澳台
/// 0x10-0x13对应上述类型但包含指纹信息
/// [infoEncoding] - 返回信息的编码方式:
/// 0x01GB18030编码GBK
/// 0x02UTF16-LE编码
/// 0x03UTF-8编码
/// [timeOut] - 读卡超时时间毫秒0表示不等待>0表示等待放卡
/// 返回值包含result错误码和data冒号分隔的身份证信息字符串的Map
Future<Map<String, dynamic>> idReadCard({int cardType = 0x00, int infoEncoding = 0x01, int timeOut = 30000}) {
return IdcardPlatform.instance.idReadCard(
cardType: cardType,
infoEncoding: infoEncoding,
timeOut: timeOut,
);
}
/// 读取身份证原始数据(兼容旧版接口)
/// [cardType] - 卡片类型1表示身份证
/// [infoEncoding] - 信息编码0表示默认编码
/// [timeOut] - 超时时间毫秒默认30秒
/// 返回值包含result错误码和data原始数据的Map
Future<Map<String, dynamic>> readCard({int cardType = 1, int infoEncoding = 0, int timeOut = 30000}) {
return IdcardPlatform.instance.readCard(
cardType: cardType,
infoEncoding: infoEncoding,
timeOut: timeOut,
);
}
/// 读取身份证详细信息
/// 返回值IdCardInfo对象包含姓名、性别、民族等详细信息
/// 抛出异常如果读取失败会抛出Exception
Future<IdCardInfo> readCardInfo() {
return IdcardPlatform.instance.readCardInfo();
}
/// 读取追加住址
/// 返回值:追加住址信息字符串
Future<String> readNewAddress() {
return IdcardPlatform.instance.readNewAddress();
}
/// 获取SAM模块状态
/// 返回值0表示成功非0表示失败
Future<int> getSamStatus() {
return IdcardPlatform.instance.getSamStatus();
}
/// 获取SAM模块编号字符串
/// 返回值SAM模块编号字符串
Future<String> getSamIdStr() {
return IdcardPlatform.instance.getSamIdStr();
}
/// 完整的身份证读取流程
/// 自动执行寻卡、选卡、读取信息的完整流程
/// [timeOut] - 超时时间毫秒默认30秒
/// [retryInterval] - 重试间隔时间毫秒默认500毫秒
/// 返回值IdCardInfo对象
/// 抛出异常如果超时或读取失败会抛出Exception
Future<IdCardInfo> readCardComplete({int timeOut = 30000, int retryInterval = 500}) async {
final startTime = DateTime.now().millisecondsSinceEpoch;
while (true) {
try {
// 1. 寻卡
int findResult = await findCard();
print("寻卡结果:$findResult");
if (findResult == 0) {
// 2. 选卡
int selectResult = await selectCard();
print("选卡结果:$selectResult");
if (selectResult == 0) {
// 3. 读取信息
return await readCardInfo();
} else {
print('选卡失败,错误码:$selectResult,继续重试...');
}
} else {
print('寻卡失败,错误码:$findResult,继续重试...');
}
} catch (e) {
print('读卡过程中发生异常:$e,继续重试...');
}
// 检查是否超时
final currentTime = DateTime.now().millisecondsSinceEpoch;
if (currentTime - startTime >= timeOut) {
throw Exception('读卡超时,超时时间:$timeOut毫秒');
}
// 等待重试间隔
await Future.delayed(Duration(milliseconds: retryInterval));
}
}
/// 检查设备是否已连接
/// 通过尝试获取平台版本来检查设备连接状态
Future<bool> isDeviceConnected() async {
try {
final version = await getPlatformVersion();
return version != null;
} catch (e) {
return false;
}
}
}