index.uts 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. import Intent from 'android.content.Intent';
  2. import HmsScanAnalyzerOptions from "com.huawei.hms.ml.scan.HmsScanAnalyzerOptions";
  3. import HmsScan from "com.huawei.hms.ml.scan.HmsScan";
  4. import ScanUtil from "com.huawei.hms.hmsscankit.ScanUtil";
  5. import Activity from "android.app.Activity";
  6. import {HMScanManager, ScanCodeOption, GeneralCallbackResult, ScanCodeSuccessCallbackResult, ScanType } from "../interface.uts"
  7. const CODE_TYPE_MAP = new Map<Int, ScanType>([
  8. [HmsScan.QRCODE_SCAN_TYPE, 'QR_CODE'],
  9. [HmsScan.AZTEC_SCAN_TYPE, 'AZTEC'],
  10. [HmsScan.CODABAR_SCAN_TYPE, 'CODABAR'],
  11. [HmsScan.CODE39_SCAN_TYPE, 'CODE_39'],
  12. [HmsScan.CODE93_SCAN_TYPE, 'CODE_93'],
  13. [HmsScan.CODE128_SCAN_TYPE, 'CODE_128'],
  14. [HmsScan.DATAMATRIX_SCAN_TYPE, 'DATA_MATRIX'],
  15. [HmsScan.EAN8_SCAN_TYPE, 'EAN_8'],
  16. [HmsScan.EAN13_SCAN_TYPE, 'EAN_13'],
  17. [HmsScan.ITF14_SCAN_TYPE, 'ITF'],
  18. [HmsScan.UPCCODE_A_SCAN_TYPE, 'UPC_A'],
  19. [HmsScan.UPCCODE_E_SCAN_TYPE, 'UPC_E'],
  20. [HmsScan.PDF417_SCAN_TYPE, 'PDF_417'],
  21. ]);
  22. const SCAN_TYPE_MAP = new Map<string, Int>([
  23. ['barCode', HmsScan.CODABAR_SCAN_TYPE],
  24. ['datamatrix', HmsScan.DATAMATRIX_SCAN_TYPE],
  25. ['qrCode', HmsScan.QRCODE_SCAN_TYPE],
  26. ['pdf417', HmsScan.PDF417_SCAN_TYPE],
  27. ])
  28. class LScanManager implements HMScanManager {
  29. private creator : HmsScanAnalyzerOptions.Creator | null = null;
  30. private timer : number = -1;
  31. @Suppress("DEPRECATION")
  32. scanCode(options : ScanCodeOption) {
  33. try {
  34. // 扫码返回 // requestCode
  35. UTSAndroid.onAppActivityResult((_ : Int, resultCode : Int, data : Intent | null) => {
  36. clearTimeout(this.timer)
  37. this.timer = setTimeout(() => {
  38. UTSAndroid.offAppActivityResult();
  39. if (resultCode != Activity.RESULT_OK || data == null) {
  40. return
  41. }
  42. let errorCode = data.getIntExtra(ScanUtil.RESULT_CODE, ScanUtil.SUCCESS)
  43. if(errorCode == ScanUtil.SUCCESS){
  44. let hmsScans : HmsScan | null = data.getParcelableExtra<HmsScan>(ScanUtil.RESULT) //data!.getParcelableExtra(ScanUtil.RESULT)
  45. if(hmsScans != null){
  46. options.success?.({
  47. charSet: '',
  48. path: '',
  49. rawData: '',
  50. result: hmsScans.originalValue ?? '',
  51. scanType: (CODE_TYPE_MAP.get(hmsScans.getScanType()) ?? '') as ScanType,
  52. errMsg: 'ok'
  53. } as ScanCodeSuccessCallbackResult)
  54. } else {
  55. options.fail?.({
  56. errMsg: '无效返回'
  57. } as GeneralCallbackResult)
  58. }
  59. }
  60. if(errorCode == ScanUtil.ERROR_NO_READ_PERMISSION){
  61. // 无文件权限,请求文件权限
  62. options.fail?.({
  63. errMsg: errorCode.toString()
  64. } as GeneralCallbackResult)
  65. }
  66. }, 50)
  67. })
  68. // 请求权限后扫码
  69. this.checkSelfPermission().then(()=>{
  70. let scanTypeSet = new Set<Int>()
  71. let scanTypes : Int[] = []
  72. options.scanType?.forEach(item => {
  73. if (SCAN_TYPE_MAP.has(item)) {
  74. scanTypeSet.add(SCAN_TYPE_MAP.get(item)!)
  75. }
  76. })
  77. scanTypeSet.forEach(item =>{
  78. scanTypes.push(item)
  79. })
  80. if (options.scanMode == null || options.scanMode == 'defaultMode') {
  81. let creator = this.creator
  82. if (creator == null) {
  83. creator = new HmsScanAnalyzerOptions.Creator();
  84. }
  85. if (scanTypes.length == 1) {
  86. creator.setHmsScanTypes(scanTypes[0])
  87. } else if (scanTypes.length == 2) {
  88. creator.setHmsScanTypes(scanTypes[0], scanTypes[1])
  89. } else if (scanTypes.length == 3) {
  90. creator.setHmsScanTypes(scanTypes[0], scanTypes[1], scanTypes[2])
  91. } else {
  92. creator.setHmsScanTypes(HmsScan.ALL_SCAN_TYPE);
  93. }
  94. // 0 表示设置扫码标题为 “扫描二维码/条码”
  95. ScanUtil.startScan(UTSAndroid.getUniActivity()!, 100, creator.setViewType(0).create());
  96. } else if (options.scanMode == 'multiProcessorMode') {
  97. }
  98. }).catch(err =>{
  99. options.fail?.({
  100. errMsg: JSON.stringify(err)
  101. } as GeneralCallbackResult)
  102. })
  103. } catch (e) {
  104. options.fail?.({
  105. errMsg: JSON.stringify(e)
  106. } as GeneralCallbackResult)
  107. }
  108. }
  109. checkSelfPermission():Promise<boolean> {
  110. let permissionNeed = ["android.permission.CAMERA", "android.permission.READ_EXTERNAL_STORAGE"]
  111. return new Promise((resoleve, reject)=>{
  112. UTSAndroid.requestSystemPermission(UTSAndroid.getUniActivity()!, permissionNeed, function (allRight : boolean, grantedList : string[]) {
  113. if (allRight) {
  114. // 权限请求成功
  115. if (allRight) {
  116. resoleve(true);
  117. } else {
  118. reject(grantedList);
  119. }
  120. } else {
  121. //用户拒绝了部分权限
  122. }
  123. }, function (_ : boolean, grantedList : string[]) {
  124. reject(grantedList);
  125. //用户拒绝了部分权限
  126. })
  127. })
  128. }
  129. }
  130. let globalManager = new LScanManager()
  131. export function scanCode(options : ScanCodeOption) {
  132. globalManager.scanCode(options)
  133. }