HarmonyOS 关于uniapp掉HarmonyOS原生预览失败的原因?

在uniapp中调用filePreview.openPreview预览失败 ,如何解决?

代码如下:

export function openFilePreview(item: object) {
  let uiContext = getContext() as common.UIAbilityContext;
  let displayInfo: filePreview.DisplayInfo = {
    x: 100,
    y: 100,
    width: 800,
    height: 800
  };
  let fileInfo: filePreview.PreviewInfo = {
    title: item['name'],
    uri: item['url'],
    mimeType: 'image/jpeg、image/png、image/gif、image/webp'
  };
  filePreview.openPreview(uiContext, fileInfo, displayInfo).then(() => {
    console.info('Succeeded in opening preview');
  }).catch((err: BusinessError) => {
    console.error(`Failed to open preview, err.code = ${err.code}, err.message = ${err.message}`);
  });
}
阅读 534
1 个回答

pdf预览依赖UI组件,目前我这边只能从uniapp跳转到原生页面预览pdf,然后再跳转回来。

// #ifdef APP-HARMONY
import router from "@ohos.router";

// #endif
export default {
  methods: {
    previewPdf() {
      uni.downloadFile({
        url: 'xxx.pdf',
        success: (res) => {
          router.pushUrl({
            url: 'pages/Pdf',
            params: {
              filePath: res.tempFilePath
            }
          })
        }
      })
    }
  }
}
// 原生页面
import { pdfService, PdfView, pdfViewManager } from '@kit.PDFKit';
import { router } from '@kit.ArkUI';
import { fileIo as fs } from '@kit.CoreFileKit';

@Entry
@Component
struct PDFView {
  private controller: pdfViewManager.PdfController = new pdfViewManager.PdfController();

  aboutToAppear(): void {
    let params = router.getParams() as Record<string, string | object>;
    const pdfFilePath = params['filePath'] as string;
    let context = getContext(this);
    let filePath = context.cacheDir + '/temp.pdf'
    let pdfFile = fs.openSync(pdfFilePath, fs.OpenMode.READ_ONLY);
    let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
    fs.copyFileSync(pdfFile.fd, file.fd);
    this.controller.loadDocument(filePath);
    fs.closeSync(pdfFile.fd);
    fs.closeSync(file.fd);
  }

  @Builder
  Back() {
    Button("返回")
      .width(100)
      .fontSize(20)
      .padding({ left: 30, top: 8 })
      .margin({ left: 10, top: 20 })
      .onClick(() => {
        router.back()
      })
  }

  build() {
    Row() {
      PdfView({
        controller: this.controller,
        pageFit: pdfService.PageFit.FIT_WIDTH,
        showScroll: true
      })
        .id('pdfview_app_view')
        .layoutWeight(1)
        .overlay(this.Back(), {
          align: Alignment.TopStart
        });
    }
    .width('100%')
    .height('90%')
    .margin({ top: 40 })
  }
}

目前uni-app还不支持扩展组件使用UI相关的,后续应该会支持。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进