diff --git a/.hbuilderx/launch.json b/.hbuilderx/launch.json new file mode 100644 index 0000000..5d03eed --- /dev/null +++ b/.hbuilderx/launch.json @@ -0,0 +1,14 @@ +{ + "version" : "1.0", + "configurations" : [ + { + "playground" : "standard", + "type" : "uni-app:app-ios_simulator" + }, + { + "customPlaygroundType" : "device", + "playground" : "standard", + "type" : "uni-app:app-ios" + } + ] +} diff --git a/pages/index/index.uvue b/pages/index/index.uvue index f26fa57..2ccc64b 100644 --- a/pages/index/index.uvue +++ b/pages/index/index.uvue @@ -1,52 +1,84 @@ - - - - - + + + + + \ No newline at end of file diff --git a/uni_modules/xtf-qrcode/.DS_Store b/uni_modules/xtf-qrcode/.DS_Store deleted file mode 100644 index 89a43a0..0000000 Binary files a/uni_modules/xtf-qrcode/.DS_Store and /dev/null differ diff --git a/uni_modules/xtf-qrcode/changelog.md b/uni_modules/xtf-qrcode/changelog.md deleted file mode 100644 index b48cf76..0000000 --- a/uni_modules/xtf-qrcode/changelog.md +++ /dev/null @@ -1,6 +0,0 @@ -## 1.0.2(2025-03-04) -优化 -## 1.0.1(2025-02-10) -初始化 -## 1.0.0(2025-02-10) -初始化 diff --git a/uni_modules/xtf-qrcode/package.json b/uni_modules/xtf-qrcode/package.json deleted file mode 100644 index e37b127..0000000 --- a/uni_modules/xtf-qrcode/package.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "id": "xtf-qrcode", - "displayName": "二维码生成 qrcode uts ", - "version": "1.0.2", - "description": "android/ios/web 通过平台sdk 生成二维码返回base64格式数据,可自行设置显示,动态二维码", - "keywords": [ - "二维码", - "生成二维码", - "动态二维码", - "二维码生成", - "qrcode" -], - "repository": "", - "engines": { - "HBuilderX": "^3.6.8" - }, - "dcloudext": { - "type": "uts", - "sale": { - "regular": { - "price": "1.99" - }, - "sourcecode": { - "price": "10.00" - } - }, - "contact": { - "qq": "" - }, - "declaration": { - "ads": "无", - "data": "无", - "permissions": "无" - }, - "npmurl": "" - }, - "uni_modules": { - "dependencies": [], - "encrypt": [], - "platforms": { - "cloud": { - "tcb": "y", - "aliyun": "y", - "alipay": "y" - }, - "client": { - "Vue": { - "vue2": "y", - "vue3": "y" - }, - "App": { - "app-android": "y", - "app-ios": "y", - "app-harmony": "n" - }, - "H5-mobile": { - "Safari": "y", - "Android Browser": "y", - "微信浏览器(Android)": "y", - "QQ浏览器(Android)": "y" - }, - "H5-pc": { - "Chrome": "y", - "IE": "y", - "Edge": "y", - "Firefox": "y", - "Safari": "y" - }, - "小程序": { - "微信": "n", - "阿里": "u", - "百度": "u", - "字节跳动": "u", - "QQ": "u", - "钉钉": "u", - "快手": "u", - "飞书": "u", - "京东": "u" - }, - "快应用": { - "华为": "u", - "联盟": "u" - } - } - } - }, - "dependencies": { - "qrcode": "^1.5.4", - "weapp-qrcode": "^1.0.0" - } -} diff --git a/uni_modules/xtf-qrcode/readme.md b/uni_modules/xtf-qrcode/readme.md deleted file mode 100644 index edc5884..0000000 --- a/uni_modules/xtf-qrcode/readme.md +++ /dev/null @@ -1,43 +0,0 @@ -# xtf-qrcode -#### 若web 端报错,可用解压插件目录web.zip覆盖web文件夹文件 -### uniappx -``` - import {QrOpt,getQrData} from "@/uni_modules/xtf-qrcode" - - getQrData({ - content:"xtf", - logo:"/static/logo.png", - logoW:80, - logoH:80, - qrSize:300, - callback:function(data:string){ - // that.img=data; - //data 为base64图片 - } - } as QrOpt); - -``` -### uniapp -``` - import {getQrData} from "@/uni_modules/xtf-qrcode" - - getQrData({ - content:"xtf", - logo:"/static/logo.png", - logoW:80, - logoH:80, - qrSize:300, - callback:function(data:string){ - // that.img=data; - //data 为base64图片 - } - }); - -``` -二维码logo 宽高 建议为二维码大小的1/5 左右 -### 开发文档 -[UTS 语法](https://uniapp.dcloud.net.cn/tutorial/syntax-uts.html) -[UTS API插件](https://uniapp.dcloud.net.cn/plugin/uts-plugin.html) -[UTS uni-app兼容模式组件](https://uniapp.dcloud.net.cn/plugin/uts-component.html) -[UTS 标准模式组件](https://doc.dcloud.net.cn/uni-app-x/plugin/uts-vue-component.html) -[Hello UTS](https://gitcode.net/dcloud/hello-uts) \ No newline at end of file diff --git a/uni_modules/xtf-qrcode/utssdk/.DS_Store b/uni_modules/xtf-qrcode/utssdk/.DS_Store deleted file mode 100644 index db151be..0000000 Binary files a/uni_modules/xtf-qrcode/utssdk/.DS_Store and /dev/null differ diff --git a/uni_modules/xtf-qrcode/utssdk/app-android/QRCodeGenerator.java b/uni_modules/xtf-qrcode/utssdk/app-android/QRCodeGenerator.java deleted file mode 100644 index edebd07..0000000 --- a/uni_modules/xtf-qrcode/utssdk/app-android/QRCodeGenerator.java +++ /dev/null @@ -1,171 +0,0 @@ - -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.pdf.PdfRenderer; -import android.os.ParcelFileDescriptor; -import android.text.TextUtils; -import android.util.Log; -import android.util.Base64; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.BinaryBitmap; -import com.google.zxing.ChecksumException; -import com.google.zxing.EncodeHintType; -import com.google.zxing.FormatException; -import com.google.zxing.MultiFormatWriter; -import com.google.zxing.NotFoundException; -import com.google.zxing.RGBLuminanceSource; -import com.google.zxing.Result; -import com.google.zxing.WriterException; -import com.google.zxing.common.BitMatrix; -import com.google.zxing.common.CharacterSetECI; -import com.google.zxing.common.HybridBinarizer; -import com.google.zxing.pdf417.PDF417Writer; -import com.google.zxing.pdf417.encoder.Compaction; -import com.google.zxing.pdf417.encoder.Dimensions; -import com.google.zxing.pdf417.encoder.PDF417; -import com.google.zxing.qrcode.QRCodeReader; -import com.google.zxing.qrcode.QRCodeWriter; -import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; - - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.HashMap; -import java.util.Hashtable; -import java.util.Map; - -/** - * 二维码生成工具类 - */ -public class QRCodeGenerator { - private static final String TAG = "ZxingUtil"; - - - /** - * 在二维码中间添加Logo图案 - */ - private static Bitmap addLogo(Bitmap src,int logoW,int logoH, Bitmap logo) { - if (src == null) { - return null; - } - - if (logo == null) { - return src; - } - logo=resizeBitmap(logo,logoW,logoH); - // 获取图片的宽高 - int srcWidth = src.getWidth(); - int srcHeight = src.getHeight(); - int logoWidth = logo.getWidth(); - int logoHeight = logo.getHeight(); - - if (srcWidth == 0 || srcHeight == 0) { - return null; - } - - if (logoWidth == 0 || logoHeight == 0) { - return src; - } - - // logo大小为二维码整体大小的1/5 - // float scaleFactor = srcWidth * 1.0f / 5 / logoWidth; - Bitmap bitmap = Bitmap.createBitmap(srcWidth, srcHeight, - Bitmap.Config.ARGB_8888); - try { - Canvas canvas = new Canvas(bitmap); - canvas.drawBitmap(src, 0, 0, null); - // canvas.scale(scaleFactor, scaleFactor, srcWidth / 2, srcHeight / 2); - canvas.drawBitmap(logo, (srcWidth - logoWidth) / 2, - (srcHeight - logoHeight) / 2, null); - - canvas.save(); - canvas.restore(); - } catch (Exception e) { - bitmap = null; - e.getStackTrace(); - } - - return bitmap; - } - public static Bitmap generateQRCodeWithLogo(String content, int widthPix, - int heightPix,int logoW,int logoH, Bitmap logoBm) { - - if (content == null || "".equals(content)) { - return null; - } - Bitmap bitmap = null; - // 配置参数 - Map hints = new HashMap(); - hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); - // 容错级别 - hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); - // 设置空白边距的宽度 - hints.put(EncodeHintType.MARGIN, 0); //default is 4 - - - // 图像数据转换,使用了矩阵转换 - BitMatrix bitMatrix; - try { - bitMatrix = new QRCodeWriter().encode(content, - BarcodeFormat.QR_CODE, widthPix, heightPix, hints); - - int[] pixels = new int[widthPix * heightPix]; - // 下面这里按照二维码的算法,逐个生成二维码的图片, - // 两个for循环是图片横列扫描的结果 - for (int y = 0; y < heightPix; y++) { - for (int x = 0; x < widthPix; x++) { - if (bitMatrix.get(x, y)) { - pixels[y * widthPix + x] = 0xff000000; - } else { - pixels[y * widthPix + x] = 0xffffffff; - } - } - } - - // 生成二维码图片的格式,使用ARGB_8888 - bitmap = Bitmap.createBitmap(widthPix, heightPix, - Bitmap.Config.ARGB_8888); - bitmap.setPixels(pixels, 0, widthPix, 0, 0, widthPix, heightPix); - - if (logoBm != null) { - bitmap = addLogo(bitmap, logoW,logoH,logoBm); - } - // if(!TextUtils.isEmpty(filePath)){ - - - // bitmap.compress(Bitmap.CompressFormat.JPEG, 100, - // new FileOutputStream(filePath));} - } catch (WriterException e) { - // - e.printStackTrace(); - } - return bitmap; - - } - - - public static Bitmap resizeBitmap(Bitmap originalBitmap, int newWidth, int newHeight) { - // 创建一个新的Bitmap对象,指定缩放后的宽度、高度和配置(这里使用与原Bitmap相同的配置) - Bitmap resizedBitmap = Bitmap.createScaledBitmap(originalBitmap, newWidth, newHeight, true); - return resizedBitmap; - } - - - public static String convert(Bitmap bitmap) { - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - // 压缩Bitmap到字节数组中,格式为PNG,质量为100% - bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream); - byte[] byteArray = byteArrayOutputStream.toByteArray(); - // 将字节数组编码为Base64字符串 - String encoded = Base64.encodeToString(byteArray, Base64.DEFAULT); - return encoded; - } - -} diff --git a/uni_modules/xtf-qrcode/utssdk/app-android/Test.java b/uni_modules/xtf-qrcode/utssdk/app-android/Test.java deleted file mode 100644 index 22adeb7..0000000 --- a/uni_modules/xtf-qrcode/utssdk/app-android/Test.java +++ /dev/null @@ -1,7 +0,0 @@ -public class Test{ - public static String test(){ - return "xtf"; - } - - -} \ No newline at end of file diff --git a/uni_modules/xtf-qrcode/utssdk/app-android/config.json b/uni_modules/xtf-qrcode/utssdk/app-android/config.json deleted file mode 100644 index 9ba7638..0000000 --- a/uni_modules/xtf-qrcode/utssdk/app-android/config.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "minSdkVersion": "19", - "dependencies": [ - "com.google.zxing:core:3.4.1", - "com.journeyapps:zxing-android-embedded:4.3.0" - ] -} \ No newline at end of file diff --git a/uni_modules/xtf-qrcode/utssdk/app-android/index.uts b/uni_modules/xtf-qrcode/utssdk/app-android/index.uts deleted file mode 100644 index 5d9fbba..0000000 --- a/uni_modules/xtf-qrcode/utssdk/app-android/index.uts +++ /dev/null @@ -1,45 +0,0 @@ -import BitmapFactory from 'android.graphics.BitmapFactory'; - -export type QrOpt = { - content:string, - logo?:string, - qrSize?:number, - logoW?:number, - logoH?:number, - marign?:number, - callback:(data:string)=>void -} - -export function getQrData (opt:QrOpt):void{ - if(opt.qrSize==null){ - opt.qrSize=300; - } - console.log("--------------") - if(opt.logo==null){ - opt.callback("data:image/jpg;base64,"+QRCodeGenerator.convert(QRCodeGenerator.generateQRCodeWithLogo(opt.content,opt.qrSize!.toInt(),opt.qrSize!.toInt(),(0).toInt(),(0).toInt(),null))); - }else{ - try{ - var logo= UTSAndroid.getResourcePath(opt.logo!); - if(opt.logoW==null){ - opt.logoW=50; - } - if(opt.logoH==null){ - opt.logoW=50; - } - var bitmap= BitmapFactory.decodeFile(logo); - - opt.callback("data:image/jpg;base64,"+QRCodeGenerator.convert(QRCodeGenerator.generateQRCodeWithLogo(opt.content,opt.qrSize!.toInt(),opt.qrSize!.toInt(),opt.logoW!.toInt(),opt.logoH!.toInt(),bitmap))); - - }catch(e:Exception){ - opt.callback("data:image/jpg;base64,"+QRCodeGenerator.convert(QRCodeGenerator.generateQRCodeWithLogo(opt.content,opt.qrSize!.toInt(),opt.qrSize!.toInt(),(0).toInt(),(0).toInt(),null))); - } - - } - - - - - - -} - diff --git a/uni_modules/xtf-qrcode/utssdk/app-ios/config.json b/uni_modules/xtf-qrcode/utssdk/app-ios/config.json deleted file mode 100644 index fa7d16c..0000000 --- a/uni_modules/xtf-qrcode/utssdk/app-ios/config.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "deploymentTarget": "12" - - // implementation 'com.google.zxing:core:3.4.1' - // implementation 'com.journeyapps:zxing-android-embedded:4.3.0' - -} diff --git a/uni_modules/xtf-qrcode/utssdk/app-ios/index.uts b/uni_modules/xtf-qrcode/utssdk/app-ios/index.uts deleted file mode 100644 index a619574..0000000 --- a/uni_modules/xtf-qrcode/utssdk/app-ios/index.uts +++ /dev/null @@ -1,40 +0,0 @@ - -export type QrOpt = { - content:string, - logo?:string, - qrSize?:number, - logoW?:number, - logoH?:number, - marign?:number, - callback:(data:string)=>void - - -} - -export function getQrData (opt:QrOpt):void{ - console.log(opt.content) - if(opt.qrSize==null){ - opt.qrSize=300; - } - - if(opt.logo==null){ - var b=QR.createQrCode(opt.content,opt.qrSize!.toInt()); - console.log(b); - opt.callback("data:image/jpg;base64,"+b) - //return "data:image/jpg;base64,"+b; - }else{ - var l=UTSiOS.getResourcePath(opt.logo!) - if(opt.logoW==null){ - opt.logoW=50; - - } - if(opt.logoH==null){ - opt.logoH=50; - } - var b=QR.createQrCodeWithLogo(opt.content,opt.qrSize!.toInt(),l,opt.logoW!.toInt(),opt.logoH!.toInt()); - console.log(b); - opt.callback("data:image/jpg;base64,"+b) - - } - -} \ No newline at end of file diff --git a/uni_modules/xtf-qrcode/utssdk/app-ios/qr.swift b/uni_modules/xtf-qrcode/utssdk/app-ios/qr.swift deleted file mode 100644 index b7ce805..0000000 --- a/uni_modules/xtf-qrcode/utssdk/app-ios/qr.swift +++ /dev/null @@ -1,92 +0,0 @@ -import CoreImage -import UIKit -import Foundation -import SwiftUICore - -public class QR{ - - - - static func imageToBase64(_ image: UIImage) -> String { - if let imageData = image.jpegData(compressionQuality: 1.0) { - // 使用imageData进行你的操作 - let base64String = imageData.base64EncodedString(options: []) - return base64String - - } - return ""; - } - - static func createQrCode(_ data:String,_ size:Int)->String{ - // 使用示例 - var b:CGFloat=CGFloat(size); - guard let qrCodeImage = QR.generateQRCode(with:data, qrSize: b) - else{ - return ""; - } - let q = QR.imageToBase64(qrCodeImage) - return q - } - - - static func createQrCodeWithLogo(_ data:String,_ size:Int,_ logo: String,_ logoW:Int,_ logoH:Int)->String{ - // 使用示例 - var b:CGFloat=CGFloat(size); - var w:CGFloat=CGFloat(logoW); - var h:CGFloat=CGFloat(logoH); - var logoSize:CGSize=CGSize(width: w, height: h) - guard let qrCodeImage = QR.generateQRCode(with:data,logoName:logo, logoSize:logoSize, qrSize: b) - else{ - return ""; - } - let q = QR.imageToBase64(qrCodeImage) - return q - } - // 生成二维码图像,并可选地添加logo - static func generateQRCode(with content: String, logoName: String? = nil, logoSize: CGSize = CGSize(width: 50, height: 50), qrSize: CGFloat = 200) -> UIImage? { - // 1. 生成二维码 - guard let qrFilter = CIFilter(name: "CIQRCodeGenerator") else { return nil } - let data = content.data(using: .utf8) - qrFilter.setValue(data, forKey: "inputMessage") - qrFilter.setValue("H", forKey: "inputCorrectionLevel") // 高纠错级别 - guard let qrImage = qrFilter.outputImage else { return nil } - - // 2. 调整二维码尺寸 - let scaleTransform = CGAffineTransform(scaleX: qrSize / qrImage.extent.size.width, y: qrSize / qrImage.extent.size.height) - let scaledQrImage = qrImage.transformed(by: scaleTransform) - - // 3. 创建UIImage对象 - guard let qrUIImage:UIImage? = UIImage(ciImage: scaledQrImage) else { return nil } - - - // if let image: UIImage? = someFunctionThatReturnsUIImage() { - // // 这里image已经被解包,并且是非空的 - // } else { - // // 处理image为nil的情况 - // } - // 4. 添加logo(如果有) - if let logoName = logoName, let logoImage = UIImage(named: logoName) { - let logoFrame = CGRect(x: (qrUIImage!.size.width - logoSize.width) / 2, - y: (qrUIImage!.size.height - logoSize.height) / 2, - width: logoSize.width, - height: logoSize.height) - - UIGraphicsBeginImageContextWithOptions(qrUIImage!.size, false, 0.0) - qrUIImage?.draw(in: CGRect(origin: .zero, size: qrUIImage!.size)) - logoImage.draw(in: logoFrame) - let finalImage = UIGraphicsGetImageFromCurrentImageContext() - UIGraphicsEndImageContext() - - return finalImage - } - - // 如果没有logo,直接返回二维码图像 - return qrUIImage - } - - - - - - -} \ No newline at end of file diff --git a/uni_modules/xtf-qrcode/utssdk/interface.uts b/uni_modules/xtf-qrcode/utssdk/interface.uts deleted file mode 100644 index 8f4ae87..0000000 --- a/uni_modules/xtf-qrcode/utssdk/interface.uts +++ /dev/null @@ -1,47 +0,0 @@ -/** - * interface.uts - * uts插件接口定义文件,按规范定义接口文件可以在HBuilderX中更好的做到语法提示 - */ - -/** - * myApi 异步函数的参数,在type里定义函数需要的参数以及api成功、失败的相关回调函数。 - */ -export type MyApiOptions = { - paramA : boolean - success ?: (res : MyApiResult) => void - fail ?: (res : MyApiFail) => void - complete ?: (res : any) => void -} - -/** - * 函数返回结果 - * 可以是void, 基本数据类型,自定义type, 或者其他类型。 - * [可选实现] - */ -export type MyApiResult = { - fieldA : number, - fieldB : boolean, - fieldC : string -} - -/** - * 错误码 - * 根据uni错误码规范要求,建议错误码以90开头,以下是错误码示例: - * - 9010001 错误信息1 - * - 9010002 错误信息2 - */ -export type MyApiErrorCode = 9010001 | 9010002; -/** - * myApi 的错误回调参数 - */ -export interface MyApiFail extends IUniError { - errCode : MyApiErrorCode -}; - -/* 异步函数定义 */ -export type MyApi = (options : MyApiOptions) => void - -/* 同步函数定义 */ -export type MyApiSync = (paramA : boolean) => MyApiResult - - diff --git a/uni_modules/xtf-qrcode/utssdk/unierror.uts b/uni_modules/xtf-qrcode/utssdk/unierror.uts deleted file mode 100644 index c20aca6..0000000 --- a/uni_modules/xtf-qrcode/utssdk/unierror.uts +++ /dev/null @@ -1,39 +0,0 @@ -/* 此规范为 uni 规范,可以按照自己的需要选择是否实现 */ -import { MyApiErrorCode, MyApiFail } from "./interface.uts" -/** - * 错误主题 - * 注意:错误主题一般为插件名称,每个组件不同,需要使用时请更改。 - * [可选实现] - */ -export const UniErrorSubject = 'uts-api'; - - -/** - * 错误信息 - * @UniError - * [可选实现] - */ -export const MyAPIErrors : Map = new Map([ - /** - * 错误码及对应的错误信息 - */ - [9010001, 'custom error mseeage1'], - [9010002, 'custom error mseeage2'], -]); - - -/** - * 错误对象实现 - */ -export class MyApiFailImpl extends UniError implements MyApiFail { - - /** - * 错误对象构造函数 - */ - constructor(errCode : MyApiErrorCode) { - super(); - this.errSubject = UniErrorSubject; - this.errCode = errCode; - this.errMsg = MyAPIErrors.get(errCode) ?? ""; - } -} diff --git a/uni_modules/xtf-qrcode/utssdk/web.zip b/uni_modules/xtf-qrcode/utssdk/web.zip deleted file mode 100644 index 899c48b..0000000 Binary files a/uni_modules/xtf-qrcode/utssdk/web.zip and /dev/null differ diff --git a/uni_modules/xtf-qrcode/utssdk/web/index.uts b/uni_modules/xtf-qrcode/utssdk/web/index.uts deleted file mode 100644 index 77059d4..0000000 --- a/uni_modules/xtf-qrcode/utssdk/web/index.uts +++ /dev/null @@ -1,97 +0,0 @@ - -import { QRCode } from './qrcode.min.js'; - -export type QrOpt = { - content:string, - logo?:string, - qrSize?:number, - logoW?:number, - logoH?:number, - marign?:number, - callback:(data:string)=>void -} - -export const getQrData = async function (opt:QrOpt){ - console.log(opt.content) - if(opt.qrSize==null){ - opt.qrSize=300; - } - - if(opt.marign==null){ - opt.marign=1; - } - // 要生成的二维码内容 - // var qrContent = "https://www.example.com"; - - //使用QRCode.toDataURL()方法生成base64字符串 - // QRCode.toDataURL(opt.content, { - // //errorCorrectionLevel: QRCode.CorrectLevel.H, // 容错级别 - // margin: 1, // 边距 - // width: opt.qrSize!, // 二维码宽度 - // height: opt.qrSize!, // 二维码高度 - // color: { - // dark: "#000000", // 前景色(二维码颜色) - // light: "#ffffff" // 背景色(空白区域颜色) - // } - // }).then(function(base64) { - // // 在这里,base64是包含二维码图片的base64字符串 - // // console.log(base64); - // opt.callback(base64); - // // return base64; - // // 你可以将base64字符串设置为img元素的src属性来显示二维码 - // // var img = document.createElement('img'); - // // img.src = base64; - // // document.body.appendChild(img); - - // // 你也可以将base64字符串用于其他目的,比如下载或传输 - // }).catch(function(error) { - // console.error("生成二维码时出错:", error); - // }); - - //return ""; - - - const qrcodeCanvas = document.createElement('canvas'); - qrcodeCanvas.width = opt.qrSize!; - qrcodeCanvas.height = opt.qrSize!; - - // 使用QRCode对象生成二维码 - await QRCode.toCanvas(qrcodeCanvas, opt.content, { width: opt.qrSize!,height: opt.qrSize!,margin: opt.marign!}, (error) => { - if (error) console.error(error); - }); - if(opt.logo==null){ - opt.callback(qrcodeCanvas.toDataURL('image/png')) - return; - } - - // 获取logo图片 - const logoImage = new Image(); - logoImage.src = opt.logo!; // 替换为你的logo图片路径 - logoImage.onload = () => { - // 创建一个用于合成带有logo的二维码的canvas元素 - const logoQRCodeCanvas = document.createElement('canvas'); - logoQRCodeCanvas.width = qrcodeCanvas.width; - logoQRCodeCanvas.height = qrcodeCanvas.height; - const ctx = logoQRCodeCanvas.getContext('2d'); - - // 将基本的二维码绘制到新的canvas上 - ctx.drawImage(qrcodeCanvas, 0, 0); - - // 计算logo的大小和位置 - const logoSize = opt.logoW!; // logo的显示大小 - const logoX = (logoQRCodeCanvas.width - opt.logoW!) / 2; - const logoY = (logoQRCodeCanvas.height - opt.logoH!) / 2; - - // 在二维码上绘制logo - ctx.drawImage(logoImage, logoX, logoY, logoSize, opt.logoH); - - // 将带有logo的二维码canvas转换为base64图片 - const base64Image = logoQRCodeCanvas.toDataURL('image/png'); - - // 将base64图片存储到组件的数据中 - // this.qrcodeWithLogo = base64Image; - opt.callback(base64Image) - }; - - -} \ No newline at end of file diff --git a/uni_modules/xtf-qrcode/utssdk/web/qrcode.min.js b/uni_modules/xtf-qrcode/utssdk/web/qrcode.min.js deleted file mode 100644 index b147837..0000000 --- a/uni_modules/xtf-qrcode/utssdk/web/qrcode.min.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Skipped minification because the original files appears to be already minified. - * Original file: /npm/qrcode@1.5.1/build/qrcode.js - * - * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files - */ -export var QRCode=function(t){"use strict";var r,e=function(){return"function"==typeof Promise&&Promise.prototype&&Promise.prototype.then},n=[0,26,44,70,100,134,172,196,242,292,346,404,466,532,581,655,733,815,901,991,1085,1156,1258,1364,1474,1588,1706,1828,1921,2051,2185,2323,2465,2611,2761,2876,3034,3196,3362,3532,3706],o=function(t){if(!t)throw new Error('"version" cannot be null or undefined');if(t<1||t>40)throw new Error('"version" should be in range from 1 to 40');return 4*t+17},a=function(t){return n[t]},i=function(t){for(var r=0;0!==t;)r++,t>>>=1;return r},u=function(t){if("function"!=typeof t)throw new Error('"toSJISFunc" is not a valid function.');r=t},s=function(){return void 0!==r},f=function(t){return r(t)};function h(t,r){return t(r={exports:{}},r.exports),r.exports}var c=h((function(t,r){r.L={bit:1},r.M={bit:0},r.Q={bit:3},r.H={bit:2},r.isValid=function(t){return t&&void 0!==t.bit&&t.bit>=0&&t.bit<4},r.from=function(t,e){if(r.isValid(t))return t;try{return function(t){if("string"!=typeof t)throw new Error("Param is not a string");switch(t.toLowerCase()){case"l":case"low":return r.L;case"m":case"medium":return r.M;case"q":case"quartile":return r.Q;case"h":case"high":return r.H;default:throw new Error("Unknown EC Level: "+t)}}(t)}catch(t){return e}}}));function g(){this.buffer=[],this.length=0}c.L,c.M,c.Q,c.H,c.isValid,g.prototype={get:function(t){var r=Math.floor(t/8);return 1==(this.buffer[r]>>>7-t%8&1)},put:function(t,r){for(var e=0;e>>r-e-1&1))},getLengthInBits:function(){return this.length},putBit:function(t){var r=Math.floor(this.length/8);this.buffer.length<=r&&this.buffer.push(0),t&&(this.buffer[r]|=128>>>this.length%8),this.length++}};var d=g;function l(t){if(!t||t<1)throw new Error("BitMatrix size must be defined and greater than 0");this.size=t,this.data=new Uint8Array(t*t),this.reservedBit=new Uint8Array(t*t)}l.prototype.set=function(t,r,e,n){var o=t*this.size+r;this.data[o]=e,n&&(this.reservedBit[o]=!0)},l.prototype.get=function(t,r){return this.data[t*this.size+r]},l.prototype.xor=function(t,r,e){this.data[t*this.size+r]^=e},l.prototype.isReserved=function(t,r){return this.reservedBit[t*this.size+r]};var v=l,p=h((function(t,r){var e=o;r.getRowColCoords=function(t){if(1===t)return[];for(var r=Math.floor(t/7)+2,n=e(t),o=145===n?26:2*Math.ceil((n-13)/(2*r-2)),a=[n-7],i=1;i=0&&t<=7},r.from=function(t){return r.isValid(t)?parseInt(t,10):void 0},r.getPenaltyN1=function(t){for(var r=t.size,n=0,o=0,a=0,i=null,u=null,s=0;s=5&&(n+=e+(o-5)),i=h,o=1),(h=t.get(f,s))===u?a++:(a>=5&&(n+=e+(a-5)),u=h,a=1)}o>=5&&(n+=e+(o-5)),a>=5&&(n+=e+(a-5))}return n},r.getPenaltyN2=function(t){for(var r=t.size,e=0,o=0;o=10&&(1488===n||93===n)&&e++,a=a<<1&2047|t.get(u,i),u>=10&&(1488===a||93===a)&&e++}return e*o},r.getPenaltyN4=function(t){for(var r=0,e=t.data.length,n=0;n=0;){for(var n=e[0],o=0;o0){var o=new Uint8Array(this.degree);return o.set(e,n),o}return e};var L=T,b=function(t){return!isNaN(t)&&t>=1&&t<=40},U="(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+",x="(?:(?![A-Z0-9 $%*+\\-./:]|"+(U=U.replace(/u/g,"\\u"))+")(?:.|[\r\n]))+",k=new RegExp(U,"g"),F=new RegExp("[^A-Z0-9 $%*+\\-./:]+","g"),S=new RegExp(x,"g"),D=new RegExp("[0-9]+","g"),Y=new RegExp("[A-Z $%*+\\-./:]+","g"),_=new RegExp("^"+U+"$"),z=new RegExp("^[0-9]+$"),H=new RegExp("^[A-Z0-9 $%*+\\-./:]+$"),J={KANJI:k,BYTE_KANJI:F,BYTE:S,NUMERIC:D,ALPHANUMERIC:Y,testKanji:function(t){return _.test(t)},testNumeric:function(t){return z.test(t)},testAlphanumeric:function(t){return H.test(t)}},K=h((function(t,r){r.NUMERIC={id:"Numeric",bit:1,ccBits:[10,12,14]},r.ALPHANUMERIC={id:"Alphanumeric",bit:2,ccBits:[9,11,13]},r.BYTE={id:"Byte",bit:4,ccBits:[8,16,16]},r.KANJI={id:"Kanji",bit:8,ccBits:[8,10,12]},r.MIXED={bit:-1},r.getCharCountIndicator=function(t,r){if(!t.ccBits)throw new Error("Invalid mode: "+t);if(!b(r))throw new Error("Invalid version: "+r);return r>=1&&r<10?t.ccBits[0]:r<27?t.ccBits[1]:t.ccBits[2]},r.getBestModeForData=function(t){return J.testNumeric(t)?r.NUMERIC:J.testAlphanumeric(t)?r.ALPHANUMERIC:J.testKanji(t)?r.KANJI:r.BYTE},r.toString=function(t){if(t&&t.id)return t.id;throw new Error("Invalid mode")},r.isValid=function(t){return t&&t.bit&&t.ccBits},r.from=function(t,e){if(r.isValid(t))return t;try{return function(t){if("string"!=typeof t)throw new Error("Param is not a string");switch(t.toLowerCase()){case"numeric":return r.NUMERIC;case"alphanumeric":return r.ALPHANUMERIC;case"kanji":return r.KANJI;case"byte":return r.BYTE;default:throw new Error("Unknown mode: "+t)}}(t)}catch(t){return e}}}));K.NUMERIC,K.ALPHANUMERIC,K.BYTE,K.KANJI,K.MIXED,K.getCharCountIndicator,K.getBestModeForData,K.isValid;var O=h((function(t,r){var e=i(7973);function n(t,r){return K.getCharCountIndicator(t,r)+4}function o(t,r){var e=0;return t.forEach((function(t){var o=n(t.mode,r);e+=o+t.getBitsLength()})),e}r.from=function(t,r){return b(t)?parseInt(t,10):r},r.getCapacity=function(t,r,e){if(!b(t))throw new Error("Invalid QR Code version");void 0===e&&(e=K.BYTE);var o=8*(a(t)-M(t,r));if(e===K.MIXED)return o;var i=o-n(e,t);switch(e){case K.NUMERIC:return Math.floor(i/10*3);case K.ALPHANUMERIC:return Math.floor(i/11*2);case K.KANJI:return Math.floor(i/13);case K.BYTE:default:return Math.floor(i/8)}},r.getBestVersionForData=function(t,e){var n,a=c.from(e,c.M);if(Array.isArray(t)){if(t.length>1)return function(t,e){for(var n=1;n<=40;n++){if(o(t,n)<=r.getCapacity(n,e,K.MIXED))return n}}(t,a);if(0===t.length)return 1;n=t[0]}else n=t;return function(t,e,n){for(var o=1;o<=40;o++)if(e<=r.getCapacity(o,n,t))return o}(n.mode,n.getLength(),a)},r.getEncodedBits=function(t){if(!b(t)||t<7)throw new Error("Invalid QR Code version");for(var r=t<<12;i(r)-e>=0;)r^=7973<=0;)n^=1335<0&&(e=this.data.substr(r),n=parseInt(e,10),t.put(n,3*o+1))};var j=q,$=["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"," ","$","%","*","+","-",".","/",":"];function X(t){this.mode=K.ALPHANUMERIC,this.data=t}X.getBitsLength=function(t){return 11*Math.floor(t/2)+t%2*6},X.prototype.getLength=function(){return this.data.length},X.prototype.getBitsLength=function(){return X.getBitsLength(this.data.length)},X.prototype.write=function(t){var r;for(r=0;r+2<=this.data.length;r+=2){var e=45*$.indexOf(this.data[r]);e+=$.indexOf(this.data[r+1]),t.put(e,11)}this.data.length%2&&t.put($.indexOf(this.data[r]),6)};var Z=X;function W(t){this.mode=K.BYTE,"string"==typeof t&&(t=function(t){for(var r=[],e=t.length,n=0;n=55296&&o<=56319&&e>n+1){var a=t.charCodeAt(n+1);a>=56320&&a<=57343&&(o=1024*(o-55296)+a-56320+65536,n+=1)}o<128?r.push(o):o<2048?(r.push(o>>6|192),r.push(63&o|128)):o<55296||o>=57344&&o<65536?(r.push(o>>12|224),r.push(o>>6&63|128),r.push(63&o|128)):o>=65536&&o<=1114111?(r.push(o>>18|240),r.push(o>>12&63|128),r.push(o>>6&63|128),r.push(63&o|128)):r.push(239,191,189)}return new Uint8Array(r).buffer}(t)),this.data=new Uint8Array(t)}W.getBitsLength=function(t){return 8*t},W.prototype.getLength=function(){return this.data.length},W.prototype.getBitsLength=function(){return W.getBitsLength(this.data.length)},W.prototype.write=function(t){for(var r=0,e=this.data.length;r=33088&&e<=40956)e-=33088;else{if(!(e>=57408&&e<=60351))throw new Error("Invalid SJIS character: "+this.data[r]+"\nMake sure your charset is UTF-8");e-=49472}e=192*(e>>>8&255)+(255&e),t.put(e,13)}};var rt=tt,et=h((function(t){var r={single_source_shortest_paths:function(t,e,n){var o={},a={};a[e]=0;var i,u,s,f,h,c,g,d=r.PriorityQueue.make();for(d.push(e,0);!d.empty();)for(s in u=(i=d.pop()).value,f=i.cost,h=t[u]||{})h.hasOwnProperty(s)&&(c=f+h[s],g=a[s],(void 0===a[s]||g>c)&&(a[s]=c,d.push(s,c),o[s]=u));if(void 0!==n&&void 0===a[n]){var l=["Could not find a path from ",e," to ",n,"."].join("");throw new Error(l)}return o},extract_shortest_path_from_predecessor_list:function(t,r){for(var e=[],n=r;n;)e.push(n),n=t[n];return e.reverse(),e},find_path:function(t,e,n){var o=r.single_source_shortest_paths(t,e,n);return r.extract_shortest_path_from_predecessor_list(o,n)},PriorityQueue:{make:function(t){var e,n=r.PriorityQueue,o={};for(e in t=t||{},n)n.hasOwnProperty(e)&&(o[e]=n[e]);return o.queue=[],o.sorter=t.sorter||n.default_sorter,o},default_sorter:function(t,r){return t.cost-r.cost},push:function(t,r){var e={value:t,cost:r};this.queue.push(e),this.queue.sort(this.sorter)},pop:function(){return this.queue.shift()},empty:function(){return 0===this.queue.length}}};t.exports=r})),nt=h((function(t,r){function e(t){return unescape(encodeURIComponent(t)).length}function n(t,r,e){for(var n,o=[];null!==(n=t.exec(e));)o.push({data:n[0],index:n.index,mode:r,length:n[0].length});return o}function o(t){var r,e,o=n(J.NUMERIC,K.NUMERIC,t),a=n(J.ALPHANUMERIC,K.ALPHANUMERIC,t);return s()?(r=n(J.BYTE,K.BYTE,t),e=n(J.KANJI,K.KANJI,t)):(r=n(J.BYTE_KANJI,K.BYTE,t),e=[]),o.concat(a,r,e).sort((function(t,r){return t.index-r.index})).map((function(t){return{data:t.data,mode:t.mode,length:t.length}}))}function a(t,r){switch(r){case K.NUMERIC:return j.getBitsLength(t);case K.ALPHANUMERIC:return Z.getBitsLength(t);case K.KANJI:return rt.getBitsLength(t);case K.BYTE:return G.getBitsLength(t)}}function i(t,r){var e,n=K.getBestModeForData(t);if((e=K.from(r,n))!==K.BYTE&&e.bit=0?t[t.length-1]:null;return e&&e.mode===r.mode?(t[t.length-1].data+=r.data,t):(t.push(r),t)}),[])}(s))},r.rawSplit=function(t){return r.fromArray(o(t))}}));function ot(t,r,e){var n,o,a=t.size,i=V(r,e);for(n=0;n<15;n++)o=1==(i>>n&1),n<6?t.set(n,8,o,!0):n<8?t.set(n+1,8,o,!0):t.set(a-15+n,8,o,!0),n<8?t.set(8,a-n-1,o,!0):n<9?t.set(8,15-n-1+1,o,!0):t.set(8,15-n-1,o,!0);t.set(a-8,8,1,!0)}function at(t,r,e){var n=new d;e.forEach((function(r){n.put(r.mode.bit,4),n.put(r.getLength(),K.getCharCountIndicator(r.mode,t)),r.write(n)}));var o=8*(a(t)-M(t,r));for(n.getLengthInBits()+4<=o&&n.put(0,4);n.getLengthInBits()%8!=0;)n.putBit(0);for(var i=(o-n.getLengthInBits())/8,u=0;u=0&&u<=6&&(0===s||6===s)||s>=0&&s<=6&&(0===u||6===u)||u>=2&&u<=4&&s>=2&&s<=4?t.set(a+u,i+s,!0,!0):t.set(a+u,i+s,!1,!0))}(c,r),function(t){for(var r=t.size,e=8;e=7&&function(t,r){for(var e,n,o,a=t.size,i=O.getEncodedBits(r),u=0;u<18;u++)e=Math.floor(u/3),n=u%3+a-8-3,o=1==(i>>u&1),t.set(e,n,o,!0),t.set(n,e,o,!0)}(c,r),function(t,r){for(var e=t.size,n=-1,o=e-1,a=7,i=0,u=e-1;u>0;u-=2)for(6===u&&u--;;){for(var s=0;s<2;s++)if(!t.isReserved(o,u-s)){var f=!1;i>>a&1)),t.set(o,u-s,f),-1===--a&&(i++,a=7)}if((o+=n)<0||e<=o){o-=n,n=-n;break}}}(c,f),isNaN(n)&&(n=E.getBestMask(c,ot.bind(null,c,e))),E.applyMask(n,c),ot(c,e,n),{modules:c,version:r,errorCorrectionLevel:e,maskPattern:n,segments:a}}nt.fromArray,nt.fromString,nt.rawSplit;var ut=function(t,r){if(void 0===t||""===t)throw new Error("No input text");var e,n,o=c.M;return void 0!==r&&(o=c.from(r.errorCorrectionLevel,c.M),e=O.from(r.version),n=E.from(r.maskPattern),r.toSJISFunc&&u(r.toSJISFunc)),it(t,e,o,n)},st=h((function(t,r){function e(t){if("number"==typeof t&&(t=t.toString()),"string"!=typeof t)throw new Error("Color should be defined as hex string");var r=t.slice().replace("#","").split("");if(r.length<3||5===r.length||r.length>8)throw new Error("Invalid hex color: "+t);3!==r.length&&4!==r.length||(r=Array.prototype.concat.apply([],r.map((function(t){return[t,t]})))),6===r.length&&r.push("F","F");var e=parseInt(r.join(""),16);return{r:e>>24&255,g:e>>16&255,b:e>>8&255,a:255&e,hex:"#"+r.slice(0,6).join("")}}r.getOptions=function(t){t||(t={}),t.color||(t.color={});var r=void 0===t.margin||null===t.margin||t.margin<0?4:t.margin,n=t.width&&t.width>=21?t.width:void 0,o=t.scale||4;return{width:n,scale:n?4:o,margin:r,color:{dark:e(t.color.dark||"#000000ff"),light:e(t.color.light||"#ffffffff")},type:t.type,rendererOpts:t.rendererOpts||{}}},r.getScale=function(t,r){return r.width&&r.width>=t+2*r.margin?r.width/(t+2*r.margin):r.scale},r.getImageWidth=function(t,e){var n=r.getScale(t,e);return Math.floor((t+2*e.margin)*n)},r.qrToImageData=function(t,e,n){for(var o=e.modules.size,a=e.modules.data,i=r.getScale(o,n),u=Math.floor((o+2*n.margin)*i),s=n.margin*i,f=[n.color.light,n.color.dark],h=0;h=s&&c>=s&&h':"",s="0&&s>0&&t[u-1]||(n+=a?ct("M",s+e,.5+f+e):ct("m",o,0),o=0,a=!1),s+1',f='viewBox="0 0 '+i+" "+i+'"',h=''+u+s+"\n";return"function"==typeof e&&e(null,h),h};function dt(t,r,n,o,a){var i=[].slice.call(arguments,1),u=i.length,s="function"==typeof i[u-1];if(!s&&!e())throw new Error("Callback required as last argument");if(!s){if(u<1)throw new Error("Too few arguments provided");return 1===u?(n=r,r=o=void 0):2!==u||r.getContext||(o=n,n=r,r=void 0),new Promise((function(e,a){try{var i=ut(n,o);e(t(i,r,o))}catch(t){a(t)}}))}if(u<2)throw new Error("Too few arguments provided");2===u?(a=n,n=r,r=o=void 0):3===u&&(r.getContext&&void 0===a?(a=o,o=void 0):(a=o,o=n,n=r,r=void 0));try{var f=ut(n,o);a(null,t(f,r,o))}catch(t){a(t)}}var lt=ut,vt=dt.bind(null,ft.render),pt=dt.bind(null,ft.renderToDataURL),wt=dt.bind(null,(function(t,r,e){return gt(t,e)})),mt={create:lt,toCanvas:vt,toDataURL:pt,toString:wt};return t.create=lt,t.default=mt,t.toCanvas=vt,t.toDataURL=pt,t.toString=wt,Object.defineProperty(t,"__esModule",{value:!0}),t}({}); - - - - \ No newline at end of file diff --git a/uni_modules/xwq-mlkit-scan-code/changelog.md b/uni_modules/xwq-mlkit-scan-code/changelog.md deleted file mode 100644 index 009ec0c..0000000 --- a/uni_modules/xwq-mlkit-scan-code/changelog.md +++ /dev/null @@ -1,252 +0,0 @@ -## 1.15.0(2026-03-08) -补充文档说明 -## 1.14.9(2026-01-27) -* 识别结果回调参数增加识别码类型字段scanCodeType返回 -## 1.14.8(2026-01-21) -* 更新安卓端部分依赖版本到1.4,解决上架Google商店要求16k导致上架失败的问题 -## 1.14.7(2026-01-13) -* 优化IOS端关闭扫码页逻辑 -## 1.14.6(2026-01-12) -* iOS端识别不到二维码Toast弹窗支持根据内容自适应 -## 1.14.5(2026-01-12) -* 相册图片识别-增加自定义未识别到二维码提示内容 -## 1.14.4(2026-01-04) -* IOS端支持配置直接返回数据(包括多个码结果) -## 1.14.3(2025-12-31) -* 安卓端支持配置直接返回数据(包括多个码结果) -## 1.14.2(2025-12-30) -* IOS端调整对焦模式为优先自动对焦 -* 已知问题优化 -## 1.14.1(2025-12-22) -* 修复uniapp项目云打包报错的问题 -## 1.14.0(2025-12-21) -### 重要更新 -* 将参数中的扫码格式设置类型由number调整为string,为了更灵活的配置多种格式扫码 -* 连续扫码场景支持间隔时间动态控制,参照用例 -* 连续扫码场景增加暂停扫码控制,适配更多的业务场景 -* 安卓端修复在连续扫码中可能出现回调两次的问题 -## 1.13.1(2025-12-19) -* 消除控制台报解析器已关闭的错误 -* 补充文档说明 -## 1.13.0(2025-12-18) -* 苹果端针对iPhone15及以上机型,需要近距离扫码特定场景增加参数配置 -## 1.12.9(2025-12-17) -* 修复IOS端偶发性回调两次的问题 -* IOS端增加对页面多次调用的拦截操作 -## 1.12.8(2025-12-17) -* 修复安卓端相册识别后数据类型转换错误的问题 -## 1.12.7(2025-12-17) -* IOS端补充product类型条码的返回字段,与安卓保持一致 -## 1.12.6(2025-12-17) -* 修复部分条码返回值不准确的问题 -## 1.12.5(2025-12-15) -* 移除安卓端的调试信息 -## 1.12.4(2025-12-15) -* 安卓端修复计算值丢失精度的问题 -## 1.12.3(2025-12-15) -* 适配小米澎湃系统识别多码时预览图不全屏问题 -## 1.12.2(2025-12-15) -* 针对安卓小米机型调试 -## 1.12.1(2025-12-15) -* 适配安卓小米澎湃系统某些机型识别到多个二维码,预览图没有覆盖屏幕的问题 -## 1.12.0(2025-12-15) -* 针对安卓小米澎湃系统调试 -## 1.11.9(2025-12-15) -* 增加调试信息 -## 1.11.8(2025-12-15) -* 安卓端针对小米机型调试 -## 1.11.7(2025-12-14) -* 增加调试log -## 1.11.6(2025-12-14) -* 安卓端优化识别到多个二维码结果,预览图没有铺满屏幕的情况 -* 增加识别到多个二维码结果,底部提示文案的内容、颜色、字号大小自定义配置 -## 1.11.5(2025-12-10) -* 针对iPhone15优化测试 -## 1.11.4(2025-12-09) -* 安卓端优化中间区域扫码模式,四拐角样式绘制适配屏幕大小 -## 1.11.3(2025-12-09) -* 修复IOS端云打包错误的问题 -## 1.11.2(2025-12-09) -* IOS端增加log打印测试 -## 1.11.1(2025-12-08) -* IOS端增加超广角对焦模式触发主动对焦处理 -* 安卓端优化多码识别结果标记处理 -## 1.11.0(2025-12-06) -* 修改安卓端扫码模式默认为全屏模式 -## 1.10.9(2025-12-04) -* IOS端优化,解决某些机型识别成功后扫码页面未完全关闭的问题 -## 1.10.8(2025-12-04) -* 修复安卓端聚焦模糊的问题 -* 优化安卓端条码的识别效率 -## 1.10.7(2025-11-26) -* 安卓端sdk支持最低版本改为默认为21 -## 1.10.6(2025-11-26) -* 安卓端增加多点自动对焦,提升识别效率 -## 1.10.5(2025-11-24) -* 优化安卓端单码识别速度 -* IOS端新增侧滑关闭扫码页功能 -## 1.10.4(2025-11-23) -* 优化IOS端多码识别 -## 1.10.3(2025-11-21) -* 补充鸿蒙端字段声明 -## 1.10.2(2025-11-18) -* 优化iOS端近距离扫码 -## 1.10.1(2025-11-18) -* IOS端增加log信息打印 -## 1.10.0(2025-11-17) -* 修复安卓端相册二维码识别问题 -## 1.9.9(2025-11-15) -* 优化IOS端多码识别 -## 1.9.8(2025-11-15) -* 优化IOS端近距离无法识别条码的问题 -* IOS端新增scanbox高度自定义配置 -## 1.9.7(2025-11-13) -* 安卓端支持设置scanbox模式扫码框的高度自定义配置 -## 1.9.6(2025-11-12) -* 完善IOS端scanbox模式扫码逻辑 -## 1.9.5(2025-11-11) -* 补充IOS端scanbox扫码模式UI -## 1.9.4(2025-11-11) -* 优化入参处理逻辑 -* 补充中间扫码模式文档说明 -## 1.9.3(2025-11-08) -* IOS端支持扫码格式设置 -* IOS端细节优化 -## 1.9.2(2025-11-08) -* 细节优化 -## 1.9.1(2025-10-26) -* 兼容鸿蒙端扫码 -* 注意:鸿蒙使用的是官方默认扫码界面,不能自定义界面内容,只能单码识别,不支持连续扫码 -## 1.9.0(2025-10-25) -* 增加连续扫码场景,toast提示内容自定义配置 -## 1.8.9(2025-10-24) -*升级安卓谷歌扫码依赖到17.3.0版本 -*最低支持版本提到26 -## 1.8.8(2025-09-24) -IOS端补充主动关闭扫码页面的方法 -## 1.8.7(2025-09-23) -修复uniapp项目打包失败的问题 -## 1.8.6(2025-09-22) -优化主动关闭扫码页方法判断,兼容uniapp端V2项目 -## 1.8.5(2025-09-19) -安卓端增加主动关闭扫码页的方法 -## 1.8.4(2025-09-19) -移除无用代码 -## 1.8.3(2025-09-18) -调整web目录文件后缀 -## 1.8.2(2025-09-18) -新增web平台目录 -## 1.8.1(2025-08-06) -更新安卓端依赖到最新版本 -## 1.8.0(2025-05-24) -安卓端 -fix: 修复由1.7.9版本引起的识别多个二维码后,左上角叉不能关闭的bug - -Feat-重要更新: 1. 安卓新增跟随IOS界面样式配置选项 - - 2. 新增二维码识别中自动缩放相机功能配置 -## 1.7.9(2025-05-22) -修复安卓端灯光切换的需要点两次的bug -## 1.7.8(2025-05-22) -重要:安卓端支持手动聚焦缩放功能 -## 1.7.7(2025-05-21) -调整灯光文案自定义字段,由原来的一个变为两个,可参考用例 -## 1.7.6(2025-05-21) -适配新的二维码制式 -## 1.7.5(2025-05-13) -移除无用代码 -## 1.7.4(2025-05-10) -feat(重要):IOS端增加手动对焦、自动曝光功能 -## 1.7.3(2025-04-29) -调整文案宽度自适应 -## 1.7.2(2025-04-28) -适配文案动态修改 -## 1.7.1(2025-04-28) -增加相册、手电筒文案自定义 -## 1.7.0(2025-04-23) -1.IOS端增加灯光功能 -2.适配灯光功能动态配置 -## 1.6.5(2025-04-22) -修复关闭扫码页,顶部出现扫描线条的bug -## 1.6.4(2025-04-22) -1.IOS端增加相册入口动态配置 -2.IOS端在连续扫码情况下,增加toast提示配置 -## 1.6.3(2025-04-21) -1.修复IOS无法关闭页面的bug -2.IOS端增加底部文案动态配置 -## 1.6.2(2025-04-21) -修复IOS关闭扫码页失败的问题 -## 1.6.1(2025-04-21) -平板设备增加打印信息 -## 1.6.0(2025-04-21) -安卓 端增加测试log打印 -## 1.5.9(2025-04-21) -IOS端增加识别成功音效 -## 1.5.8(2025-04-20) -重要:IOS端增加多码识别 -## 1.5.7(2025-04-13) -1、增加用户取消扫码回调方法 -2、移除平台目录下的类型声明,统一使用interface文件,升级后需注意调整代码 -## 1.5.6(2025-04-10) -IOS端修复草料二维码识别失败的问题 -## 1.5.5(2025-03-22) -iOS端启动扫码预览逻辑优化 -## 1.5.4(2025-03-15) -ios更新:增加相册二维码识别 -## 1.5.3(2025-03-14) -开启源码授权 -## 1.5.2(2025-02-27) -ios端增加连续扫码 -## 1.5.1(2025-02-25) -修复iOS扫码窗口关闭,返回按钮未移除的问题 -## 1.5.0(2025-02-24) -增加iOS端的支持 -## 1.4.0(2025-02-19) -增加连续扫码识别成功toast提示 -## 1.3.9(2025-02-11) -修复识别多个二维码成功后,摄像头预览未正常关闭的问题 -## 1.3.8(2025-01-14) -适配邮件二维码识别 -## 1.3.7(2025-01-10) -增加ISBN二维码识别 -## 1.3.6(2024-12-30) -开启摄像头信息打印 -## 1.3.5(2024-12-18) -细节优化 -## 1.3.4(2024-12-17) -增加相册、灯光显示动态控制 -## 1.3.3(2024-12-17) -针对不同机型优化摄像头打开模式 -## 1.3.2(2024-12-16) -增加前后摄像头切换功能 -## 1.3.1(2024-12-16) -解决开启连续扫码,回调函数只触发一次的问题 -## 1.3(2024-12-14) -增加连续扫码参数配置 -## 1.2.5(2024-10-28) -移除无用代码 -## 1.2.4(2024-10-28) -修复由工具4.31版本引起的颜色设置失效问题,注意:调整了多色的传值类型,可参照下列文档说明 -## 1.2.3(2024-10-27) -修复工具4.31引起的OptionType未引入的错误 -## 1.2.2(2024-10-25) -移除调试代码 -## 1.2.1(2024-10-25) -优化图像解析分辨率逻辑 -## 1.2.0(2024-10-19) -1.优化识别到二维码标记的UI样式 -2.增加超时未识别到二维码回调error函数 -3.二维码解析细节优化 -## 1.1.1(2024-10-07) -增加物料二维码内容正常读取返回 -## 1.1.0(2024-09-29) -适配uniapp项目扫码 -## 1.0.3(2024-08-13) -更新使用文档 -## 1.0.2(2024-08-13) -优化 -## 1.0.1(2024-04-18) -1.增加返回参数类型 -2.修改返回值的格式 -## 1.0.0(2024-04-10) -初始化 diff --git a/uni_modules/xwq-mlkit-scan-code/encrypt b/uni_modules/xwq-mlkit-scan-code/encrypt deleted file mode 100644 index f1f6e24..0000000 --- a/uni_modules/xwq-mlkit-scan-code/encrypt +++ /dev/null @@ -1 +0,0 @@ -^ <̥H1D@E^*s٠N"T>in%%nz*Je(JK[c%[xBZqϧo[Ko>; ? ykWe؁|S Ԁζ #.R_/6hLQ}(-E \ No newline at end of file diff --git a/uni_modules/xwq-mlkit-scan-code/package.json b/uni_modules/xwq-mlkit-scan-code/package.json deleted file mode 100644 index 0a2926f..0000000 --- a/uni_modules/xwq-mlkit-scan-code/package.json +++ /dev/null @@ -1,120 +0,0 @@ -{ - "id": "xwq-mlkit-scan-code", - "displayName": "(兼容IOS、安卓、鸿蒙)二维码、条码识别,mlkit扫码插件(毫秒级识别效率,支持多码识别,连续扫码)", - "version": "1.15.0", - "description": "扫码插件,支持识别二维码、条码、多个二维码,连续扫码、相册图片识别、手动聚焦缩放功能、相机自动缩放", - "keywords": [ - "扫码", - "", - "条码", - "", - "二维码", - "", - "谷歌扫码", - "连续扫码" -], - "repository": "", - "engines": { - "HBuilderX": "^4.57", - "uni-app": "^4.66", - "uni-app-x": "^4.66" - }, - "dcloudext": { - "type": "uts", - "sale": { - "regular": { - "price": "50.00" - }, - "sourcecode": { - "price": "398.00" - } - }, - "contact": { - "qq": "" - }, - "declaration": { - "ads": "无", - "data": "无", - "permissions": "相机、相册" - }, - "npmurl": "", - "darkmode": "x", - "i18n": "x", - "widescreen": "x" - }, - "uni_modules": { - "dependencies": [], - "encrypt": [], - "platforms": { - "cloud": { - "tcb": "√", - "aliyun": "√", - "alipay": "√" - }, - "client": { - "uni-app": { - "vue": { - "vue2": "√", - "vue3": "√" - }, - "web": { - "safari": "-", - "chrome": "-" - }, - "app": { - "vue": "-", - "nvue": "-", - "android": { - "extVersion": "", - "minVersion": "21" - }, - "ios": { - "extVersion": "", - "minVersion": "15" - }, - "harmony": "-" - }, - "mp": { - "weixin": "-", - "alipay": "-", - "toutiao": "-", - "baidu": "-", - "kuaishou": "-", - "jd": "-", - "harmony": "-", - "qq": "-", - "lark": "-", - "xhs": "-" - }, - "quickapp": { - "huawei": "-", - "union": "-" - } - }, - "uni-app-x": { - "web": { - "safari": "-", - "chrome": "-" - }, - "app": { - "android": { - "extVersion": "", - "minVersion": "21" - }, - "ios": { - "extVersion": "", - "minVersion": "15" - }, - "harmony": { - "extVersion": "", - "minVersion": "11" - } - }, - "mp": { - "weixin": "-" - } - } - } - } - } -} \ No newline at end of file diff --git a/uni_modules/xwq-mlkit-scan-code/readme.md b/uni_modules/xwq-mlkit-scan-code/readme.md deleted file mode 100644 index 0b9d863..0000000 --- a/uni_modules/xwq-mlkit-scan-code/readme.md +++ /dev/null @@ -1,373 +0,0 @@ -# 插件使用说明文档 - -注意! - -插件需要打自定义基座运行! - -插件需要打自定义基座运行! - -插件需要打自定义基座运行! - -#### 插件说明 -``` -本插件是封装了谷歌mlkit条码识别功能,支持多种条码类型扫码, -识别速度和准确率杠杠的,可以支持多个二维码识别,识别成功会有提示音和震动效果,类似wx扫码。 -``` - -IOS端注意!,不支持摄像头切换,用法参考后面的用例(扫码插件支持的ios版本是>=15.5) - -鸿蒙端注意:鸿蒙使用的是官方默认扫码界面UI,不支持自定义界面内容,只能单码识别,不支持连续扫码 - -#### 扫码类型:支持文本、链接、电话、邮件、WIFI等通用类型条码 -``` -type CodeType = 'text'| 'url'| 'wifi'| 'phone'| 'sms' -| 'email' -| 'contact' -| 'geo' -| 'calendar' -| 'driverLicense' -| 'isbn' -| 'product'; -``` -#### 支持扫码格式列表,默认支持全部格式,可以设置单个或多个扫码格式类型,不设置默认是0,支持全部扫码格式 ------------------- - -* 1----->FORMAT_CODE_128 -* 2----->FORMAT_CODE_39 -* 4----->FORMAT_CODE_93 -* 8----->FORMAT_CODABAR -* 32---->FORMAT_EAN_13 -* 64---->FORMAT_EAN_8) -* 128--> FORMAT_ITF) 二维码 -* 256--> FORMAT_QR_CODE 二维码 -* 512--->FORMAT_UPC_A -* 1024-->FORMAT_UPC_E -* 2048-->FORMAT_PDF417 -* 16---->FORMAT_DATA_MATRIX -* 4096-->FORMAT_AZTEC - --------------- -* 参数说明 - -| 属性 | 类型 | 默认值 | 必填 | 描述 | -|-- |-- |-- |-- |-- | -|cameraType |string |BACK |N |开启前置摄像头,不设置默认使用后置摄像头,当设备只有一个摄像头,该设置无效,会自动取可用列表的摄像头 | -|continuous |boolean |false |N |设为true即可开启连续扫码,默认不开启 | -|continuousDelay |number |800 |N |连续扫码场景,间隔时间 | -|autoZoom |boolean |false |N |开启相机自动缩放,默认不开启,只限非连续扫码模式下使用 | -|styleFollowIos |boolean |true |N |页面样式是否跟随IOS端,默认true全屏模式 | -|showLamplight |boolean |true |N |隐藏/显示灯光操作,默认显示 | -|showPhotoAlbum |boolean |true |N |隐藏/显示相册操作,默认显示 | -|scanBox |boolean |false |N |中间区域扫码模式,默认关闭,(注意:如果开启此模式,styleFollowIos必须配置且为false) | -|scanBoxTitle |string |'将码放入取景框,即可自动扫描' |N |中间区域扫码模式标题,只有scanBox为true生效 | -|scanBoxTitleColor |string |'#ffffff' |N |中间区域扫码模式标题颜色,只有scanBox为true生效 | -|scanBoxTitleSize |number |16 |N |中间区域扫码模式标题大小,只有scanBox为true生效 | -|scanBoxHeight |number |540 |N |中间区域扫码框的高度,只有scanBox为true生效 | -|formatsVal |string |'0' |N |设置扫码的制式,默认为'0',支持全部制式 | -|markeTitle |string |'#ffffff' |N |设置扫码页底部识别中的提示文字 | -|showToast |boolean |false |N |二维码识别成功显示toast(只针对连续扫码生效) | -|showToastText |string |'自定义扫码成功提示' |N |设置连续扫码场景成功提示语 | -|lightOnText |string |'灯光打开' |N |自定义打开灯光文案 | -|lightOffText |string |'灯光关闭' |N |自定义关闭灯光文案 | -|photoText |string |'自定义相册文字' |N |相册底部文案(只针对安卓不跟随IOS端界面样式有效) | -|moreQrCodeSelectText |string |'识别到多个二维码,请选择一个打开' |N |多个二维码选择提示文案 | -|moreQrCodeSelectTextColor |string |'#ffffff' |N |多个二维码选择提示文案颜色 | -|moreQrCodeSelectTextSize |number |16 |N |多个二维码选择提示文案大小 | -|outputAllCodeData |boolean |false |N |开启后,直接返回扫码数据,获取返回值内容需要取optionArr字段,默认关闭(只针对全屏扫码且非连续扫码有效) | -|customFailToatText|string|未识别到二维码|N|未识别到二维码时提示内容| - -#### 识别成功回调参数说明 -```html -CallbackValType:{ - type --- 识别码内容类型 例如文本-text 链接-url 商品-product - option ----{ - textVal?:string ------- 文本值 - url?:string --------- 链接 - phone?:string -------- 手机号 - proNumber?:string ----- 商品编号 - } - optionArr ---- 当初始化配置outputAllCodeData设置为true时,该字段才有值,内容字段和option字段一致 - scanCodeType ----- 识别码为二维码/条形码 1- 二维码 2- 条形码 0- 未知 (当outputAllCodeData设置为true时,该字段会包含在optionArr的每个子项中) -} -``` - ------------- -#### 页面调用插件方式 - - - -* uniapp的使用方式 - -```html - - - - -``` - -* uniappX的使用方式 - -```html - - - - -``` - -### IOS端UniappX项目中使用 -```html - - - - -``` - - -### 在鸿蒙端使用用例(注意:鸿蒙使用的是官方默认扫码界面,不能自定义界面内容,只能单码识别,不支持连续扫码) -```html - - -