harmony_flutter_qrcode(生成二维码)
 作者:flfljh
- 2024-12-19  湖南
 本文字数:2389 字
阅读完需:约 8 分钟
一.MethodChannel
1.flutter 端代码
创建 MethodChannel
接收 ohos 端传递过来的状态值
 class RecognitionManager {  static const MethodChannel _channel =      const MethodChannel('recognition_qrcode');
  static Future<String> get platformVersion async {    final String version = await _channel.invokeMethod('getPlatformVersion');    return version;  }
  static Future<void> setConfig({    String? icon,    double? iconWidth = 30,    double? iconHeight = 30,    double? cancelTitleFontSize = 16,    String? cancelTitle = "取消",  }) async {    Map<String, dynamic> map = {      "iconWidth": iconWidth ?? 30,      "iconHeight": iconHeight ?? 30,      "cancelTitleFontSize": cancelTitleFontSize ?? 16,      "cancelTitle": cancelTitle ?? "取消",    };    try {      if (icon != null) {        ByteData byteData = await rootBundle.load(icon);        ByteBuffer buffer = byteData.buffer;
        map["icon"] = Uint8List.view(buffer);      }    } catch (e) {      print("RecognitionQrcode.config: Failed to get image");    }    await _channel.invokeMethod("setConfig", map);  }
  // base64 || url || file path  static Future<RecognitionResult> recognition(dynamic img) async {    var res = await _channel.invokeMethod('recognitionQrcode', img);    RecognitionResult result = RecognitionResult(      code: res["code"],      value: res["value"],    );    return result;  }}
复制代码
 2.ohos 端代码
继承 FlutterPlugin 实现 onAttachedToEngine 方法
创建 MethodChannel 实例 device_util
setMethodCallHandler
通过 result 回传参数
 private methodChannel: MethodChannel | null = null;  private applicationContext: Context | null = null;  private ability: UIAbility | null = null;  private config: Map<string, ESObject> = new Map();
  onAttachedToEngine(binding: FlutterPluginBinding): void {    this.applicationContext = binding.getApplicationContext();    this.methodChannel = new MethodChannel(binding.getBinaryMessenger(), CHANNEL_NAME);    this.methodChannel.setMethodCallHandler(this);  }
  onDetachedFromEngine(binding: FlutterPluginBinding): void {    this.applicationContext = null;    this.methodChannel?.setMethodCallHandler(null);    this.methodChannel = null;  }
  async onMethodCall(call: MethodCall, result: MethodResult) {    if (call.method === "getPlatformVersion") {      Log.d(TAG, deviceInfo.osFullName)      result.success("Ohos " + deviceInfo.sdkApiVersion);    } else if (call.method === 'setConfig') {      this.config = call.args;      if(call.args.get('icon')) {        const image: Uint8Array = call.args.get('icon');        const url: string | null = this.saveCacheDir(image.buffer);        this.config.set('icon', url)      }
      Log.d(TAG, JSON.stringify(call.args))      result.success(null);    } else if (call.method === 'recognitionQrcode') {      let url: string | null = call.args;      if(url?.includes('http') || url?.includes('https')) {        url = await this.downloadHttpImage(call.args);      } else if(!url?.includes('/data/') && this.base64Decode(this.base64Encode(url as string)) == url) {        url = this.saveCacheDir(buffer.from(url, 'base64').buffer)      }
      if(!url) return;
      // 定义识码参数inputImage,其中uri为picker选择图片      let inputImage: detectBarcode.InputImage = { uri: url }      // 定义识码参数options      let options: scanBarcode.ScanOptions = {        scanTypes: [scanCore.ScanType.ALL],        enableMultiMode: true,        enableAlbum: true      }
      // 调用图片识码接口      this.decodeImage(inputImage, options, result)    } else {      result.notImplemented()    }  }
复制代码
 通过 @ohos 原生库生成二维码
 base64Encode(value: string) {    let base64Helper = new util.Base64Helper();    let texEncoder = util.TextEncoder.create("utf-8");    return base64Helper.encodeToStringSync(texEncoder.encodeInto(value));  }
  base64Decode(value: string) {    let base64Helper = new util.Base64Helper();    let texEncoder = util.TextDecoder.create("utf-8");    return texEncoder.decodeWithStream(base64Helper.decodeSync(value));  }
  decodeImage(inputImage: detectBarcode.InputImage, options: scanBarcode.ScanOptions, result: MethodResult) {    detectBarcode.decode(inputImage, options).then((r: Array<scanBarcode.ScanResult>) => {      Log.d(TAG, JSON.stringify(r));      if (r.length > 1) {        this.openAbility(r, inputImage.uri, result)      } else if (r.length === 1) {        result.success({          code: "0",          value: r[0].originalValue,          result: r  // 暴露给flutter让用户处理        });      } else {        result.error("-1", "Image parsing failed", null);      }
    }).catch((failResult: BusinessError) => {      Log.d(TAG, JSON.stringify(failResult));      result.error("-1", "Image parsing failed", null);    });  }
复制代码
 划线
评论
复制
发布于: 刚刚阅读数: 5
flfljh
关注
还未添加个人签名 2024-10-29 加入
还未添加个人简介







    


评论