鸿蒙学习实战之路-Share Kit系列(8/17)-获取分享结果与状态监听

最近好多朋友问我:“西兰花啊,我想知道用户分享到哪里了,分享成功还是失败,但不知道代码怎么写?” 害,这问题可问对人了!

今天这篇,我就手把手带你实现获取分享结果功能,从零到一,全程不超过 5 分钟(不含调试时间)~


分享结果是啥?

分享结果就是用户完成分享后,系统返回给你的信息,包括:

  • 分享状态:成功、失败、取消
  • 分享目标:分享到的应用或设备
  • 分享渠道:系统操作名称或应用组件标识

有了这些信息,你就能知道用户分享到哪里了,分享是否成功,然后根据结果做相应的处理。


如何监听分享完成事件?

Share Kit 提供了 on 方法,可以监听分享完成事件。

完整代码示例

import { common } from '@kit.AbilityKit';
import { systemShare } from '@kit.ShareKit';

// 步骤1:构造分享数据
let shareData: systemShare.SharedData = new systemShare.SharedData({
  utd: 'general.text',
  uri: 'file://.../xxx.txt',
  title: '分享文本',
  preview: 'file://.../preview.jpg',
  description: '这是一段分享文本'
});

// 步骤2:构建分享控制器
let controller: systemShare.ShareController = new systemShare.ShareController(shareData);

// 步骤3:注册分享完成事件监听
controller.on('shareCompleted', (result: systemShare.ShareResult) => {
  console.log(`分享完成,结果:${result}`);
});

// 步骤4:显示分享面板
let uiContext: UIContext = this.getUIContext();
let context: common.UIAbilityContext = uiContext.getHostContext() as common.UIAbilityContext;

controller.show(context, {
  previewMode: systemShare.SharePreviewMode.DEFAULT,
  selectionMode: systemShare.SelectionMode.SINGLE
});

ShareResult 参数详解

ShareResult 是分享结果的描述信息,包含以下参数:

参数 类型 说明
resultCode number 分享结果的代码,0 表示成功,非 0 表示失败
resultMessage string 分享结果的消息,比如"分享成功"、“分享失败”
target string 分享目标的标识,比如应用包名或设备 ID

🥦 西兰花小贴士
resultCode 的值可以用来判断分享是否成功,0 表示成功,非 0 表示失败。你可以根据不同的 resultCode 做不同的处理。


在实际项目中怎么用?

上面的代码是基础实现,但在实际项目中,你可能会这样用:

示例:监听分享结果并提示用户

import { common } from '@kit.AbilityKit';
import { systemShare } from '@kit.ShareKit';
import { promptAction } from '@kit.ArkUI';

@Entry
@Component
struct ShareResultPage {
  // 分享文本
  shareText: string = '这是一段分享文本';

  // 分享文本并监听结果
  onShareTextWithResult() {
    // 构造分享数据
    let shareData: systemShare.SharedData = new systemShare.SharedData({
      utd: 'general.text',
      uri: 'file://.../xxx.txt',
      title: '分享文本',
      description: this.shareText
    });

    // 构建分享控制器
    let controller: systemShare.ShareController = new systemShare.ShareController(shareData);

    // 注册分享完成事件监听
    controller.on('shareCompleted', (result: systemShare.ShareResult) => {
      if (result.resultCode === 0) {
        promptAction.showToast({
          message: '分享成功',
          duration: 2000
        });
      } else {
        promptAction.showToast({
          message: `分享失败:${result.resultMessage}`,
          duration: 2000
        });
      }
    });

    // 显示分享面板
    let uiContext: UIContext = this.getUIContext();
    let context: common.UIAbilityContext = uiContext.getHostContext() as common.UIAbilityContext;

    controller.show(context, {
      previewMode: systemShare.SharePreviewMode.DEFAULT,
      selectionMode: systemShare.SelectionMode.SINGLE
    });
  }

  build() {
    Column() {
      Text('监听分享结果示例')
        .fontSize(20)
        .fontWeight(FontWeight.Bold)
        .margin(20)
        .fontColor(Color.Black);

      Text(this.shareText)
        .fontSize(16)
        .margin({ left: 20, right: 20, bottom: 20 })
        .fontColor(Color.Gray);

      Button('分享文本(监听结果)')
        .onClick(() => {
          this.onShareTextWithResult();
        })
        .margin(20);
    }
    .width('100%')
    .height('100%');
  }
}

示例:记录分享行为

import { common } from '@kit.AbilityKit';
import { systemShare } from '@kit.ShareKit';

@Entry
@Component
struct ShareAnalyticsPage {
  // 分享文本
  shareText: string = '这是一段分享文本';

  // 分享文本并记录行为
  onShareTextWithAnalytics() {
    // 构造分享数据
    let shareData: systemShare.SharedData = new systemShare.SharedData({
      utd: 'general.text',
      uri: 'file://.../xxx.txt',
      title: '分享文本',
      description: this.shareText
    });

    // 构建分享控制器
    let controller: systemShare.ShareController = new systemShare.ShareController(shareData);

    // 注册分享完成事件监听
    controller.on('shareCompleted', (result: systemShare.ShareResult) => {
      // 记录分享行为
      console.log(`分享目标:${result.target}`);
      console.log(`分享结果:${result.resultCode === 0 ? '成功' : '失败'}`);
      console.log(`分享消息:${result.resultMessage}`);

      // 这里可以调用你的统计 SDK,记录分享行为
      // 比如:Analytics.track('share', { target: result.target, result: result.resultCode });
    });

    // 显示分享面板
    let uiContext: UIContext = this.getUIContext();
    let context: common.UIAbilityContext = uiContext.getHostContext() as common.UIAbilityContext;

    controller.show(context, {
      previewMode: systemShare.SharePreviewMode.DEFAULT,
      selectionMode: systemShare.SelectionMode.SINGLE
    });
  }

  build() {
    Column() {
      Text('记录分享行为示例')
        .fontSize(20)
        .fontWeight(FontWeight.Bold)
        .margin(20)
        .fontColor(Color.Black);

      Text(this.shareText)
        .fontSize(16)
        .margin({ left: 20, right: 20, bottom: 20 })
        .fontColor(Color.Gray);

      Button('分享文本(记录行为)')
        .onClick(() => {
          this.onShareTextWithAnalytics();
        })
        .margin(20);
    }
    .width('100%')
    .height('100%');
  }
}

🥦 西兰花小贴士
记录分享行为可以帮助你了解用户的分享习惯,比如用户最喜欢分享到哪里,分享成功率是多少等。这些数据对产品优化很有帮助。


如何取消监听?

如果你不再需要监听分享完成事件,可以调用 off 方法取消监听。

示例:取消监听

import { common } from '@kit.AbilityKit';
import { systemShare } from '@kit.ShareKit';

// 定义回调函数
let shareCompletedCallback = (result: systemShare.ShareResult) => {
  console.log(`分享完成,结果:${result}`);
};

// 注册分享完成事件监听
controller.on('shareCompleted', shareCompletedCallback);

// 取消分享完成事件监听
controller.off('shareCompleted', shareCompletedCallback);

🥦 西兰花警告
我有个朋友忘记取消监听,结果每次分享都会触发多次回调,debug 了两小时才发现是内存泄漏问题!血泪教训啊朋友们!


常见问题

Q1:监听回调没有触发怎么办?

检查以下几点:

  1. 是否正确注册了监听

    • 确认是否在显示分享面板前注册了监听
    • 确认事件名称是否正确(shareCompleted
  2. 是否正确获取了 UIAbility 上下文对象

    • 确认是否正确获取了 UIAbility 上下文对象
    • 确认上下文对象是否有效

Q2:如何区分不同的分享结果?

可以通过 resultCode 来区分不同的分享结果:

controller.on('shareCompleted', (result: systemShare.ShareResult) => {
  switch (result.resultCode) {
    case 0:
      console.log('分享成功');
      break;
    case 1:
      console.log('分享失败');
      break;
    case 2:
      console.log('用户取消分享');
      break;
    default:
      console.log('未知错误');
      break;
  }
});

Q3:如何处理分享失败的情况?

分享失败时,可以根据 resultMessage 提示用户,并记录错误日志:

controller.on('shareCompleted', (result: systemShare.ShareResult) => {
  if (result.resultCode !== 0) {
    // 提示用户
    promptAction.showToast({
      message: `分享失败:${result.resultMessage}`,
      duration: 2000
    });

    // 记录错误日志
    console.error(`分享失败:${result.resultMessage}`);
  }
});

下一步学什么?

看完这篇,你应该已经能获取分享结果了。接下来可以深入学习:

  1. 共享联系人到推荐区:让分享更精准
  2. 目标应用接入:让你的应用能接收其他应用分享的内容
  3. 高级功能:碰一碰分享、隔空传送
  4. 常见问题:分享失败、数据类型不支持等问题的解决方案

推荐资料

📚 官方文档


我是盐焗西兰花,
不教理论,只给你能跑的代码和避坑指南。
下期见!🥦

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐