鸿蒙版保存图片功能实现

128 阅读1分钟

保存图片

 /// 拍照并保存到相册
  Future<void> _takePhoto() async {
    print("[拍照] 开始拍照并保存");
    // 检查相机初始化状态
    if (_cameraController == null || !_cameraController!.value.isInitialized) {
      print('[拍照] 相机未初始化,无法拍照');
      return;
    }

    try {
      // 拍摄照片
      print("[拍照] 正在拍摄...");
      final XFile photo = await _cameraController!.takePicture();
      print("[拍照] 拍摄成功: ${photo.path}");

      // 保存到应用目录
      final directory = await getApplicationDocumentsDirectory();
      final String fileName = path.basename(photo.path);
      final String filePath = path.join(directory.path, fileName);
      await photo.saveTo(filePath);
      print('[拍照] 照片保存到应用目录成功: $filePath');

      // 保存到相册
      try {
        print("[拍照] 开始保存到相册...");

        // 根据平台选择合适的保存方法
        final result = await ImageGallerySaver.saveFile(filePath);
        final bool success = result['isSuccess'] ?? false;
        print("[拍照] 保存到相册结果: $success, 详情: $result");

        if (mounted) {
          ScaffoldMessenger.of(context).showSnackBar(
            SnackBar(
              content: Text(success ? '照片已保存到相册' : '照片已保存到应用目录'),
              duration: const Duration(seconds: 2),
            ),
          );
        }
      } catch (e) {
        print('[拍照] 保存照片到相册失败: $e');
        if (mounted) {
          ScaffoldMessenger.of(context).showSnackBar(
            SnackBar(content: Text('照片已保存到应用,但未能保存到相册: $e')),
          );
        }
      }
    } catch (e) {
      print('[拍照] 拍照错误: $e');
      if (mounted) {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text('拍照失败: $e')),
        );
      }
    }
  }

  _saveLocalImage() async {
    print("[本地图像] 开始保存本地图像");
    try {
      RenderRepaintBoundary boundary = _globalKey.currentContext!
          .findRenderObject() as RenderRepaintBoundary;
      print("[本地图像] 获取到 RenderRepaintBoundary 对象");

      ui.Image image = await boundary.toImage();
      print("[本地图像] 转换为 Image 对象成功");

      ByteData? byteData =
          await (image.toByteData(format: ui.ImageByteFormat.png));
      print("[本地图像] 获取 ByteData 成功,大小: ${byteData?.lengthInBytes ?? 0} 字节");

      if (byteData != null) {
        print("[本地图像] 准备调用 ImageGallerySaver.saveImage");
        final result =
            await ImageGallerySaver.saveImage(byteData.buffer.asUint8List());
        print("[本地图像] 保存结果: $result");
        Utils.toast(result.toString());
      } else {
        print("[本地图像] 错误: ByteData 为空");
        Utils.toast("保存失败: 无法获取图像数据");
      }
    } catch (e) {
      print("[本地图像] 保存过程中发生错误: $e");
      Utils.toast("保存失败: $e");
    }
  }

bool isHarmonyOS() {
  try {
    // 尝试检测鸿蒙特有的环境变量或操作系统标识
    const String os = String.fromEnvironment('OPERATING_SYSTEM');
    if (os.toLowerCase().contains('harmony') || os.toLowerCase() == 'ohos') {
      return true;
    }

    // 鸿蒙系统可能会被识别为Android
    if (Platform.isAndroid) {
      // 可以通过特定的构建配置、特性检测或设备型号判断
      // 这里作为简单示例,我们通过构建配置来检测
      const bool isHarmony = bool.fromEnvironment('IS_HARMONY_OS');
      return isHarmony;
    }
    return false;
  } catch (e) {
    print('平台检测错误: $e');
    // 如果出错,保守地假设不是鸿蒙系统
    return false;
  }
}

bool isHarmonyOS() {
   const String isHarmony = TargetPlatform.ohos;
   
    if (os.toLowerCase().contains('harmony') || os.toLowerCase() == 'ohos') {
      return true;
    }

}