import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; import 'idcard_platform_interface.dart'; /// 使用方法通道的IdcardPlatform实现 class MethodChannelIdcard extends IdcardPlatform { /// 与原生平台交互的方法通道 @visibleForTesting final methodChannel = const MethodChannel('idcard'); @override Future getPlatformVersion() async { final version = await methodChannel.invokeMethod('getPlatformVersion'); return version; } @override Future getUsbPermission(int vid, int pid) async { final result = await methodChannel.invokeMethod('getUsbPermission', { 'vid': vid, 'pid': pid, }); return result ?? -1; } @override Future openDevice({String portType = 'USB', String portPara = '', String extendPara = ''}) async { final result = await methodChannel.invokeMethod('openDevice', { 'portType': portType, 'portPara': portPara, 'extendPara': extendPara, }); return result ?? -1; } @override Future setCurrentDevice(int devHandle) async { final result = await methodChannel.invokeMethod('setCurrentDevice', { 'devHandle': devHandle, }); return result ?? -1; } @override Future getCurrentDevice() async { final result = await methodChannel.invokeMethod('getCurrentDevice'); return result ?? -1; } @override Future> getLibraryInfo() async { final result = await methodChannel.invokeMethod('getLibraryInfo'); if (result == null) return {'version': '', 'description': ''}; // 安全地转换类型 final Map data = Map.from(result as Map); return { 'version': data['version']?.toString() ?? '', 'description': data['description']?.toString() ?? '', }; } @override Future getTerminalModel() async { final result = await methodChannel.invokeMethod('getTerminalModel'); return result ?? ''; } @override Future terminalHeartBeat() async { final result = await methodChannel.invokeMethod('terminalHeartBeat'); return result ?? -1; } @override Future> getLastRecvData() async { final result = await methodChannel.invokeMethod>('getLastRecvData'); return result?.cast() ?? []; } @override Future> getTerminalFirmVersion() async { final result = await methodChannel.invokeMethod('getTerminalFirmVersion'); if (result == null) return {'firmVersion': '', 'hardwareVersion': ''}; // 安全地转换类型 final Map data = Map.from(result as Map); return { 'firmVersion': data['firmVersion']?.toString() ?? '', 'hardwareVersion': data['hardwareVersion']?.toString() ?? '', }; } @override Future getTerminalSn() async { final result = await methodChannel.invokeMethod('getTerminalSn'); return result ?? ''; } @override Future closeDevice() async { final result = await methodChannel.invokeMethod('closeDevice'); return result ?? -1; } @override Future findCard() async { final result = await methodChannel.invokeMethod('findCard'); return result ?? -1; } @override Future selectCard() async { final result = await methodChannel.invokeMethod('selectCard'); return result ?? -1; } @override Future> idReadCard({int cardType = 0x00, int infoEncoding = 0x01, int timeOut = 30000}) async { final result = await methodChannel.invokeMethod('idReadCard', { 'cardType': cardType, 'infoEncoding': infoEncoding, 'timeOut': timeOut, }); if (result == null) { return {'result': -1}; } // 安全地转换类型 return Map.from(result as Map); } @override Future> readCard({int cardType = 1, int infoEncoding = 0, int timeOut = 30000}) async { final result = await methodChannel.invokeMethod('readCard', { 'cardType': cardType, 'infoEncoding': infoEncoding, 'timeOut': timeOut, }); if (result == null) { return {'result': -1}; } // 安全地转换类型 return Map.from(result as Map); } @override Future readCardInfo() async { // 使用idReadCard方法读取身份证信息 final result = await idReadCard(); if (result['result'] != 0) { throw Exception('Failed to read card info, error code: ${result['result']}'); } final String? dataStr = result['data']; if (dataStr == null || dataStr.isEmpty) { throw Exception('Card data is empty'); } // 根据文档,数据是冒号分隔的字符串格式 return IdCardInfo.fromColonString(dataStr); } @override Future readNewAddress() async { final result = await methodChannel.invokeMethod('readNewAddress'); return result ?? ''; } @override Future getSamStatus() async { final result = await methodChannel.invokeMethod('getSamStatus'); return result ?? -1; } @override Future getSamIdStr() async { final result = await methodChannel.invokeMethod('getSamIdStr'); return result ?? ''; } }