讨论广场 问答详情
systemShare无法拉起共享面板
赵波74 2026-02-02 19:49:08
1829 评论 分享
鸿蒙6.0实战踩坑鸿蒙6.0鸿蒙

日志打印拉起成功,但是看不到共享面板。mate 80仿真器/真机都是这样。

代码:

private async handleDataShare(items: FloraData[]): Promise<void> {
  if (items.length === 0) return;
  try {
    //const context = getContext(this) as common.UIAbilityContext;
    const uiContext: UIContext = this.getUIContext();
    const contextFaker: Context = uiContext.getHostContext() as Context;
    const tempFiles: string[] = [];

    // 1. 下载图片到本地缓存 (系统分享需要本地路径或 Uri)
    for (const item of items) {
      const url = `${BASE_URL}${item.filePath}${item.fileName}`;
      const fileName = `share_${Date.now()}.jpg`;
      const filePath = `${contextFaker.tempDir}/${fileName}`;
      await this.downloadImage(url, filePath);
      tempFiles.push(`file://` + filePath);
    }

    // 2. 循环添加多张图片
    let utdTypeId = utd.getUniformDataTypeByFilenameExtension('.jpg', utd.UniformDataType.IMAGE);
    const shareData = new systemShare.SharedData({
      utd: utdTypeId,
      uri: fileUri.getUriFromPath(tempFiles[0])
    });
    for (let i = 1; i < tempFiles.length; i++) {
      shareData.addRecord({
        utd: utdTypeId,
        uri: fileUri.getUriFromPath(tempFiles[i])
      });
    }

    console.info("ShareData Records: " + JSON.stringify(shareData.getRecords()));
    // 3. 配置分享面板
    let controller = new systemShare.ShareController(shareData);
    const context: common.UIAbilityContext = uiContext.getHostContext() as common.UIAbilityContext;
    try {
      controller.show(context,{
        selectionMode: systemShare.SelectionMode.BATCH,
        previewMode: systemShare.SharePreviewMode.DEFAULT
      }).then(() => {
        console.log('ShareController show success.');
      });
    } catch (err) {
      console.error(`同步调用错误: ${JSON.stringify(err)}`);
    }

    // 4. 清理逻辑(可选:在分享结束后退出多选模式)
    //this.exitSelectMode();

  } catch (error) {
    console.error(`Share failed: ${JSON.stringify(error)}`);
  }
}

private async downloadImage(url: string, savePath: string): Promise<void> {
  let httpRequest = http.createHttp();
  try {
    const response = await httpRequest.request(url, {
      method: http.RequestMethod.GET,
      expectDataType: http.HttpDataType.ARRAY_BUFFER,
      connectTimeout: 10000,
      readTimeout: 10000
    });

    if (response.responseCode === http.ResponseCode.OK) {
      let file: fs.File = fs.openSync(savePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE | fs.OpenMode.TRUNC);
      fs.writeSync(file.fd, response.result as ArrayBuffer);
      fs.fsyncSync(file.fd);
      fs.closeSync(file);
      console.info(`图片下载成功并保存至: ${savePath}`);
    } else {
      throw new Error(`下载失败,响应码: ${response.responseCode}`);
    }
  } catch (err) {
    let error = err as BusinessError;
    console.error(`downloadImage Error: ${error.code} ${error.message}`);
    //throw error;
  } finally {
    httpRequest.destroy();
  }
}

日志打印结果:

02-02 19:29:44.030   30562-30562   A03d00/JSAPP                    com.orchi...alendar2  I     图片下载成功并保存至: /data/storage/el2/base/haps/entry/temp/share_1770031783922.jpg
02-02 19:29:44.041   30562-30562   A03d00/JSAPP                    com.orchi...alendar2  I     ShareData Records: [{"utd":"general.jpeg","uri":"file:///data/storage/el2/base/haps/entry/temp/share_1770031783922.jpg"}]
02-02 19:29:44.389   30562-30562   A03d00/JSAPP                    com.orchi...alendar2  I     ShareController show success.
1829 评论 分享
写回答
全部评论(1)

您好,问题描述中的代码不全无法完整复现,但是根据部分代码我这边做了部分修改没有能够复现问题,设备也可以正常拉起共享面板,您这边是否能够提供一下以下信息方便我们这边进行复现定位:

1. 能够复现问题的完整代码

2. 样机型号代码及对应软件版本号:设置——关于本机

本地验证代码如下:

import { common } from '@kit.AbilityKit';
import  { fileUri, picker } from '@kit.CoreFileKit';
import { systemShare } from '@kit.ShareKit';
import { uniformTypeDescriptor as utd } from '@kit.ArkData';
@Entry
@Component
struct Index {
  @State message: string = 'hello World';

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(()=>{
            try {
              const uiContext: UIContext = this.getUIContext();
              const contextFaker: Context = uiContext.getHostContext() as Context;
              const tempFiles: string[] = [];
              let utdTypeId = utd.getUniformDataTypeByFilenameExtension('.png', utd.UniformDataType.IMAGE);
              let shareData: systemShare.SharedData = new systemShare.SharedData({
                utd: utdTypeId,
                uri: fileUri.getUriFromPath(contextFaker.filesDir + '/image2.png'),
              });
              let controller = new systemShare.ShareController(shareData);
              const context: common.UIAbilityContext = uiContext.getHostContext() as common.UIAbilityContext;
              try {
                controller.show(context,{
                  selectionMode: systemShare.SelectionMode.BATCH,
                  previewMode: systemShare.SharePreviewMode.DEFAULT
                }).then(() => {
                  console.log('ShareController show success.');
                });
              } catch (err) {
                console.error(`同步调用错误: ${JSON.stringify(err)}`);
              }

            } catch (error) {
              console.error(`Share failed: ${JSON.stringify(error)}`);
            }
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}

 

2026-03-03 17:18:16