鸿蒙学习实战之路-Share Kit系列(10/17)-目标应用接收分享(应用内处理)
最近好多朋友问我:"西兰花啊,我想让我的应用能接收其他应用分享的内容,但不知道代码怎么写?" 害,这问题可问对人了!
今天这篇,我就手把手带你实现目标应用接收分享功能(应用内处理),从零到一,全程不超过 10 分钟(不含调试时间)~
目标应用是啥?
目标应用就是分享内容的接收者。简单说,就是用户从其他应用分享内容到你的应用,你的应用作为目标应用,接收并处理分享的内容。
这就像前端的分享接收功能,只不过 Share Kit 是系统级别的服务,体验更统一。
应用内处理 vs 分享详情页
目标应用接收分享有两种方式:
| 方式 | 说明 | 适用场景 |
|---|---|---|
| 应用内处理 | 直接在应用内处理分享内容 | 内容简单,不需要额外操作 |
| 分享详情页 | 弹出一个详情页,用户确认后再处理 | 内容复杂,需要用户确认 |
今天我们讲应用内处理,分享详情页会在下一篇文章中讲解。
完整实现步骤
实现目标应用接收分享(应用内处理),就三步:
- 配置 module.json5:声明支持的 UTD 类型
- 实现 UIAbility:在 onCreate 或 onNewWant 中解析分享数据
- 处理分享数据:根据分享数据类型做相应的处理
步骤 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 的 onCreate 或 onNewWant 方法中解析 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:自定义方法,用于处理分享数据
🥦 西兰花小贴士 :
onCreate 和 onNewWant 都需要实现,因为分享可能发生在应用首次启动时,也可能发生在应用已经运行时。
步骤 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:其他应用分享不到我的应用怎么办?
检查以下几点:
-
module.json5 配置是否正确:
- 确认
exported是否设置为true - 确认
actions是否设置为ohos.want.action.sendData - 确认
uris中的type是否和分享数据的 utd 类型匹配
- 确认
-
应用是否已安装:
- 确认目标应用是否已安装
- 确认应用版本是否支持分享
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 | 应用在后台时被唤起 | 处理后续分享 |
下一步学什么?
看完这篇,你应该已经能实现目标应用接收分享(应用内处理)了。接下来可以深入学习:
- 分享详情页处理分享内容:ShareExtensionAbility 的配置和实现
- 判断应用是否被系统分享拉起:LaunchParam 的使用
- 配置目标应用名单:企业应用专属功能
- 高级功能:碰一碰分享、隔空传送
推荐资料
📚 官方文档:
我是盐焗西兰花,
不教理论,只给你能跑的代码和避坑指南。
下期见!🥦