目录

分享图片到应用显示“您选择的文件不支持分享”

问题现象

调用分享弹出应用选择,选择任一应用均提示“您选择的文件不支持分享”,请问是什么原因?

问题效果预览:

背景知识

问题定位

构造分享数据,添加一条分享记录。

let uiContext: UIContext = this.getUIContext();
let context: common.UIAbilityContext = uiContext.getHostContext() as common.UIAbilityContext;
let thumbnail = await context.resourceManager.getRawFileContent('picture.png');
// 构造ShareData,需配置一条有效数据信息
let shareData: systemShare.SharedData = new systemShare.SharedData({
  utd: utd.UniformDataType.HYPERLINK,
  uri: 'xxx',
  title: '测试',
  thumbnail: thumbnail
});

此分享数据无法分享到应用,复现问题,复现场景。

再将SharedData中参数uri换成content。

let uiContext: UIContext = this.getUIContext();
let context: common.UIAbilityContext = uiContext.getHostContext() as common.UIAbilityContext;
let thumbnail = await context.resourceManager.getRawFileContent('picture.png');
// 构造ShareData,需配置一条有效数据信息
let shareData: systemShare.SharedData = new systemShare.SharedData({
  utd: utd.UniformDataType.HYPERLINK,
  content: 'xxx',
  title: '测试',
  thumbnail: thumbnail
});

此时选择任一应用可以进行分享(此示例选择备忘录),分享成功如图。

分析结论

content和uri二者至少有一个不为空。

修改建议

如果是链接(包含App Linking)、文本类型的内容,SharedRecord中参数可设置为content。

import { systemShare } from '@kit.ShareKit';
import { uniformTypeDescriptor as utd } from '@kit.ArkData';
import { common } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';

@Entry
@Component
struct SharePage {
  private async share() {
    let uiContext: UIContext = this.getUIContext();
    let context: common.UIAbilityContext = uiContext.getHostContext() as common.UIAbilityContext;
    let thumbail = await context.resourceManager.getRawFileContent('img.png');
    // 构造ShareData,需配置一条有效数据信息
    let shareData: systemShare.SharedData = new systemShare.SharedData({
      utd: utd.UniformDataType.HYPERLINK,
      // 实际内容根据开发者自行配置
      content: 'xxx.xxx.com',
      title: '测试',
      thumbnail: thumbail
    });

    let controller: systemShare.ShareController = new systemShare.ShareController(shareData);
    controller.show(context, {
      selectionMode: systemShare.SelectionMode.SINGLE,
      previewMode: systemShare.SharePreviewMode.DETAIL,
    }).then(() => {
      console.info('ShareController show success.');
    }).catch((error: BusinessError) => {
      console.error(`ShareController show error. code: ${error.code}, message: ${error.message}`);
    });
  }

  build() {
    Row() {
      Text('分享')
      Button('分享')
        .onClick(() => {
          this.share();
        })
    }
    .width('100%')
    .margin({ top: 12 })
    .padding({ left: 20, right: 20 })
    .justifyContent(FlexAlign.SpaceBetween)
  }
}

常见FAQ

Q:系统分享是否支持分享在线图片?

A:系统分享不支持分享在线图片,可以先将在线图片保存到本地后再分享。

Q:缩略图thumbnail有什么限制,为什么设置无效?

A:thumbnail限制图片大小:32KB以下。过大的图片可能导致want数据超限无法拉起分享,可使用ImagePacker.packing压缩图片质量。另外,当前规格2in1设备不支持缩略图。

Q:使用systemShare.getSharedData(want)获取分享的数据,报错1003703001,如何解决?

A:数据记录数量超过限制,可以不通过getSharedData接口获取分享数据,直接从want.uri属性,即分享的链接中,解析出分享的数据。

Q:API17的SDK版本下,在App中添加隔空抓取分享的功能,按照隔空传送API文档进行开发提示报错:Argument of type '"gesturesShare"' is not assignable to parameter of type '"knockShare"。这是什么原因?

A:隔空传送能力为HarmonyOS6.0版本新增特性,三方应用接入该能力需升级至HarmonyOS6.0版本。

Q:content和uri已确认完成配置,仍然提示文件不支持分享,还有可能是什么原因?

A:确认分享文件存在,请排查分享文件的路径或者权限。