HarmonyOS 鸿蒙Next 如何将DocumentScanner文档扫描后拿到的结果uri,保存到Documents目录下?

发布于 1周前 作者 h691938207 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 如何将DocumentScanner文档扫描后拿到的结果uri,保存到Documents目录下?

使用DocumentScanner文档扫描Kit,扫描后拿到以下结果uri,但这个uri访问不到,请问如何将扫描的结果保存到Documents目录下?

代码使用的示例:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/vision-documentscanner-V5

使用VisionKit中的DocumentScanner扫描文件,获取到扫描结果,并将结果保存至Documents目录

2 回复

import { DocType, DocumentScanner, DocumentScannerConfig, SaveOption, EditTab, FilterId, ShootingMode } from "[@kit](/user/kit).VisionKit"

import hilog from '[@ohos](/user/ohos).hilog'

import { fileIo, fileUri } from '[@kit](/user/kit).CoreFileKit'

import { image } from '[@kit](/user/kit).ImageKit'

import { BusinessError } from '[@kit](/user/kit).BasicServicesKit'

const TAG: string = 'DocDemoPage' //文档扫描页,用于加载uiExtensionAbility

[@Entry](/user/Entry)({ routeName: 'DocDemoPage' })

[@Component](/user/Component)

struct DocDemoPage {

  [@State](/user/State) docImageUris: string[] = []

  private docScanConfig = new DocumentScannerConfig()

  aboutToAppear() {

    this.docScanConfig.supportType = [DocType.DOC] //是否支持从图库进行选图

    this.docScanConfig.isGallerySupported = true

    this.docScanConfig.editTabs = []

    this.docScanConfig.maxShotCount = 3

    this.docScanConfig.defaultFilterId = FilterId.ORIGINAL

    this.docScanConfig.defaultShootingMode = ShootingMode.MANUAL

    this.docScanConfig.isShareable = true

    this.docScanConfig.originalUris = []

    this.docScanConfig.saveOptions = [SaveOption.PDF]

  }

  build() {

    Column() {

      DocumentScanner({

        scannerConfig: this.docScanConfig,

        onResult: (code: number, saveType: SaveOption, uris: string[]) => {

          hilog.info(0x0001, TAG, `result code: ${code}, save: ${saveType}`)

          if (code === -1) {

            // promptAction.showToast({message: '失败'})

          }

          uris.forEach(uriString => {

            hilog.info(0x0001, TAG, `uri: ${uriString}`)

          })

          this.docImageUris = uris

          let filePath = uris[0]

          console.info(filePath)

          try {

            let myFile1 = fileIo.openSync(filePath, fileIo.OpenMode.READ_ONLY)

            let context = getContext(this);

            let pathDir = context.filesDir + '/card.jpeg';

            console.info(pathDir)

            // 照片都拷贝进应用沙箱

            fileIo.copyFileSync(myFile1.fd, pathDir);

            fileIo.copyFile(myFile1.fd, pathDir).then(() => {

              console.info("copyFile succeed");

              // 转换成可显示的类型

              let imageSourceApi = image.createImageSource(pathDir);

              class tmp {

                height: number = 100;

                width: number = 100

              }

              let options: Record<string, number | boolean | tmp> = {

                'alphaType': 0, // 透明度

                'editable': false, // 是否可编辑

                'pixelFormat': 3, // 像素格式

                'scaleMode': 1, // 缩略值

                'size': { height: 100, width: 100 }

              } // 创建图片大小

              imageSourceApi.createPixelMap(options).then((pixelMap: PixelMap) => {

                if (pixelMap != undefined) {

                  pixelMap.getImageInfo().then( (info : image.ImageInfo) => {

                    console.info('info.width = ' + info.size.width);

                    console.info('info.height = ' + info.size.height);

                  }).catch((err : BusinessError) => {

                    console.error("Failed to obtain the image pixel map information.And the error is: " + err);

                  });

                } else {

                  console.info("失败");

                }

              })

            }).catch((err: BusinessError) => {

              console.error("copyFile failed with error:" + err);

            });

          } catch (e) {

            // CommonUtils.showSingleDialog(JSON.stringify(e))

          }

        }

      })

        .size({ width: '100%', height: '100%' })

    }

  }

}

在HarmonyOS鸿蒙Next系统中,将DocumentScanner文档扫描后获取的结果URI保存到Documents目录下,可以通过以下步骤实现:

  1. 获取扫描结果URI:首先,通过DocumentScanner API完成文档扫描并获取扫描结果的URI。这个URI通常指向一个临时存储位置,其中包含了扫描后的图像数据。

  2. 访问Documents目录:接下来,使用SAF(Storage Access Framework)或系统提供的API来访问设备的Documents目录。确保你的应用已获取必要的存储权限。

  3. 创建文件并复制数据:在Documents目录下创建一个新的文件,用于存储扫描结果。然后,使用文件I/O操作(如FileInputStream和FileOutputStream)将扫描结果URI指向的数据复制到新创建的文件中。

  4. 保存文件路径:最后,保存新创建文件的路径,以便后续使用。

请注意,在操作过程中要确保正确处理异常和释放资源,以避免内存泄漏或文件损坏。

此外,由于不同设备和HarmonyOS版本的差异,某些API或行为可能有所不同。如果在实际开发中遇到问题,建议参考最新的HarmonyOS开发文档或官方示例代码。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部