鸿蒙学习实战之路-Share Kit系列(10/17)-目标应用接收分享(应用内处理)

鸿蒙学习实战之路-Share Kit系列(10/17)-目标应用接收分享(应用内处理)

最近好多朋友问我:"西兰花啊,我想让我的应用能接收其他应用分享的内容,但不知道代码怎么写?" 害,这问题可问对人了!

今天这篇,我就手把手带你实现目标应用接收分享功能(应用内处理),从零到一,全程不超过 10 分钟(不含调试时间)~


目标应用是啥?

目标应用就是分享内容的接收者。简单说,就是用户从其他应用分享内容到你的应用,你的应用作为目标应用,接收并处理分享的内容。

这就像前端的分享接收功能,只不过 Share Kit 是系统级别的服务,体验更统一。


应用内处理 vs 分享详情页

目标应用接收分享有两种方式:

方式 说明 适用场景
应用内处理 直接在应用内处理分享内容 内容简单,不需要额外操作
分享详情页 弹出一个详情页,用户确认后再处理 内容复杂,需要用户确认

今天我们讲应用内处理,分享详情页会在下一篇文章中讲解。


完整实现步骤

实现目标应用接收分享(应用内处理),就三步:

  1. 配置 module.json5:声明支持的 UTD 类型
  2. 实现 UIAbility:在 onCreate 或 onNewWant 中解析分享数据
  3. 处理分享数据:根据分享数据类型做相应的处理

步骤 1:配置 module.json5

module.json5 中声明支持的 UTD 类型,这样系统才能识别你的应用支持分享。

json 复制代码
{
  "module": {
    "abilities": [
      {
        "name": "EntryAbility",
        "srcEntry": "./ets/entryability/EntryAbility.ets",
        "startWindowIcon": "$media:launcher",
        "startWindowBackground": "$color:start_window_background",
        "exported": true,
        "skills": [
          {
            "entities": [
              "entity.system.home"
            ],
            "actions": [
              "ohos.want.action.sendData"
            ],
            "uris": [
              {
                "scheme": "file",
                "linkFeature": "FileOpen",
                "type": "org.openxmlformats.wordprocessingml.document",
                "maxFileSupported": 1
              }
            ],
            "domainVerify": true
          }
        ]
      }
    ]
  }
}

参数说明

  • actions:设置为 ohos.want.action.sendData,表示接收分享数据
  • uris:声明支持的 UTD 类型,比如 org.openxmlformats.wordprocessingml.document 表示 Word 文档
  • maxFileSupported:最大支持的文件数量,1 表示只支持单个文件

🥦 西兰花警告

我有个朋友第一次配置 module.json5,忘记设置 exported: true,结果其他应用分享不到他的应用,debug 了两小时才发现是配置问题!血泪教训啊朋友们!


步骤 2:实现 UIAbility

在 UIAbility 的 onCreateonNewWant 方法中解析 want 参数,获取分享数据。

typescript 复制代码
import { common } from '@kit.AbilityKit';
import { systemShare } from '@kit.ShareKit';

@Entry
@Component
struct EntryAbility {
  onCreate(want: Want, launchParam: LaunchParam) {
    // 解析want参数,获取分享数据
    let shareData: systemShare.SharedData = new systemShare.SharedData({
      utd: want.parameters['utd'],
      uri: want.parameters['uri'],
      title: want.parameters['title'],
      preview: want.parameters['preview'],
      description: want.parameters['description']
    });
    // 处理分享数据
    this.handleShareData(shareData);
  }

  onNewWant(want: Want, launchParam: LaunchParam) {
    // 解析want参数,获取分享数据
    let shareData: systemShare.SharedData = new systemShare.SharedData({
      utd: want.parameters['utd'],
      uri: want.parameters['uri'],
      title: want.parameters['title'],
      preview: want.parameters['preview'],
      description: want.parameters['description']
    });
    // 处理分享数据
    this.handleShareData(shareData);
  }

  handleShareData(shareData: systemShare.SharedData) {
    // 处理分享数据
    console.log(`分享数据:${shareData}`);
  }
}

方法说明

  • onCreate:应用首次启动时调用,用于处理首次分享
  • onNewWant:应用在后台时被唤起时调用,用于处理后续分享
  • handleShareData:自定义方法,用于处理分享数据

🥦 西兰花小贴士
onCreateonNewWant 都需要实现,因为分享可能发生在应用首次启动时,也可能发生在应用已经运行时。


步骤 3:处理分享数据

根据分享数据类型做相应的处理。

typescript 复制代码
handleShareData(shareData: systemShare.SharedData) {
  // 根据utd类型处理不同的分享数据
  switch (shareData.utd) {
    case 'general.text':
      this.handleTextShare(shareData);
      break;
    case 'general.image':
      this.handleImageShare(shareData);
      break;
    case 'general.video':
      this.handleVideoShare(shareData);
      break;
    case 'general.link':
      this.handleLinkShare(shareData);
      break;
    default:
      console.log('不支持的分享类型');
      break;
  }
}

handleTextShare(shareData: systemShare.SharedData) {
  console.log(`处理文本分享:${shareData.description}`);
}

handleImageShare(shareData: systemShare.SharedData) {
  console.log(`处理图片分享:${shareData.uri}`);
}

handleVideoShare(shareData: systemShare.SharedData) {
  console.log(`处理视频分享:${shareData.uri}`);
}

handleLinkShare(shareData: systemShare.SharedData) {
  console.log(`处理链接分享:${shareData.uri}`);
}

完整代码示例

把上面的步骤整合起来,就是一个完整的目标应用接收分享(应用内处理)的实现:

typescript 复制代码
import { common } from '@kit.AbilityKit';
import { systemShare } from '@kit.ShareKit';

@Entry
@Component
struct EntryAbility {
  onCreate(want: Want, launchParam: LaunchParam) {
    // 解析want参数,获取分享数据
    let shareData: systemShare.SharedData = new systemShare.SharedData({
      utd: want.parameters['utd'],
      uri: want.parameters['uri'],
      title: want.parameters['title'],
      preview: want.parameters['preview'],
      description: want.parameters['description']
    });
    // 处理分享数据
    this.handleShareData(shareData);
  }

  onNewWant(want: Want, launchParam: LaunchParam) {
    // 解析want参数,获取分享数据
    let shareData: systemShare.SharedData = new systemShare.SharedData({
      utd: want.parameters['utd'],
      uri: want.parameters['uri'],
      title: want.parameters['title'],
      preview: want.parameters['preview'],
      description: want.parameters['description']
    });
    // 处理分享数据
    this.handleShareData(shareData);
  }

  handleShareData(shareData: systemShare.SharedData) {
    // 根据utd类型处理不同的分享数据
    switch (shareData.utd) {
      case 'general.text':
        this.handleTextShare(shareData);
        break;
      case 'general.image':
        this.handleImageShare(shareData);
        break;
      case 'general.video':
        this.handleVideoShare(shareData);
        break;
      case 'general.link':
        this.handleLinkShare(shareData);
        break;
      default:
        console.log('不支持的分享类型');
        break;
    }
  }

  handleTextShare(shareData: systemShare.SharedData) {
    console.log(`处理文本分享:${shareData.description}`);
  }

  handleImageShare(shareData: systemShare.SharedData) {
    console.log(`处理图片分享:${shareData.uri}`);
  }

  handleVideoShare(shareData: systemShare.SharedData) {
    console.log(`处理视频分享:${shareData.uri}`);
  }

  handleLinkShare(shareData: systemShare.SharedData) {
    console.log(`处理链接分享:${shareData.uri}`);
  }
}

在实际项目中怎么用?

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

示例:接收文本分享并显示

typescript 复制代码
import { common } from '@kit.AbilityKit';
import { systemShare } from '@kit.ShareKit';
import { router } from '@kit.ArkUI';

@Entry
@Component
struct EntryAbility {
  // 分享的文本内容
  sharedText: string = '';

  onCreate(want: Want, launchParam: LaunchParam) {
    // 解析want参数,获取分享数据
    let shareData: systemShare.SharedData = new systemShare.SharedData({
      utd: want.parameters['utd'],
      uri: want.parameters['uri'],
      title: want.parameters['title'],
      preview: want.parameters['preview'],
      description: want.parameters['description']
    });

    // 处理分享数据
    this.handleShareData(shareData);
  }

  onNewWant(want: Want, launchParam: LaunchParam) {
    // 解析want参数,获取分享数据
    let shareData: systemShare.SharedData = new systemShare.SharedData({
      utd: want.parameters['utd'],
      uri: want.parameters['uri'],
      title: want.parameters['title'],
      preview: want.parameters['preview'],
      description: want.parameters['description']
    });

    // 处理分享数据
    this.handleShareData(shareData);
  }

  handleShareData(shareData: systemShare.SharedData) {
    // 根据utd类型处理不同的分享数据
    if (shareData.utd === 'general.text') {
      this.sharedText = shareData.description || '';
    }
  }

  build() {
    Column() {
      Text('接收分享示例')
        .fontSize(20)
        .fontWeight(FontWeight.Bold)
        .margin(20)
        .fontColor(Color.Black);

      if (this.sharedText) {
        Text('分享的文本:')
          .fontSize(16)
          .margin(20)
          .fontColor(Color.Black);

        Text(this.sharedText)
          .fontSize(16)
          .margin({ left: 20, right: 20, bottom: 20 })
          .fontColor(Color.Gray);
      } else {
        Text('暂无分享内容')
          .fontSize(16)
          .margin(20)
          .fontColor(Color.Gray);
      }
    }
    .width('100%')
    .height('100%');
  }
}

常见问题

Q1:其他应用分享不到我的应用怎么办?

检查以下几点:

  1. module.json5 配置是否正确

    • 确认 exported 是否设置为 true
    • 确认 actions 是否设置为 ohos.want.action.sendData
    • 确认 uris 中的 type 是否和分享数据的 utd 类型匹配
  2. 应用是否已安装

    • 确认目标应用是否已安装
    • 确认应用版本是否支持分享

Q2:如何支持多种分享类型?

uris 中配置多个 type,支持多种分享类型:

json 复制代码
"uris": [
  {
    "scheme": "file",
    "linkFeature": "FileOpen",
    "type": "general.text",
    "maxFileSupported": 1
  },
  {
    "scheme": "file",
    "linkFeature": "FileOpen",
    "type": "general.image",
    "maxFileSupported": 1
  }
]

Q3:onCreate 和 onNewWant 有什么区别?

方法 调用时机 适用场景
onCreate 应用首次启动时 处理首次分享
onNewWant 应用在后台时被唤起 处理后续分享

下一步学什么?

看完这篇,你应该已经能实现目标应用接收分享(应用内处理)了。接下来可以深入学习:

  1. 分享详情页处理分享内容:ShareExtensionAbility 的配置和实现
  2. 判断应用是否被系统分享拉起:LaunchParam 的使用
  3. 配置目标应用名单:企业应用专属功能
  4. 高级功能:碰一碰分享、隔空传送

推荐资料

📚 官方文档


我是盐焗西兰花,

不教理论,只给你能跑的代码和避坑指南。

下期见!🥦

相关推荐
清空mega2 小时前
《Vue3 新手学习路线总览:我该怎么系统学 Vue3?》
学习
非凡ghost2 小时前
支持1000+格式:Wondershare Recoverit万能数据恢复
网络·windows·学习·软件需求·teamviewer
盐水冰2 小时前
【Redis】学习(3)Redis的Java客户端
java·redis·学习
江湖有缘2 小时前
基于开发者空间部署OtterWiki知识管理工具【华为开发者空间】
华为
云边散步2 小时前
godot2D游戏教程系列二(14)
笔记·学习·游戏·游戏开发
正牌强哥2 小时前
别再用天价软件做量化研究了:我开源了一个全流程因子分析平台FactorHub
学习·开源·量化交易
执笔论英雄2 小时前
【大模型推理】cudastream 学习
linux·运维·学习
YLXA3 小时前
1.helle_cuda学习
linux·学习·算法
小付同学呀3 小时前
C语言学习(九)——C判断三元运算符
c语言·开发语言·学习