鸿蒙学习实战之路-Share Kit系列(7/17)-自定义分享面板操作区
最近好多朋友问我:"西兰花啊,我想屏蔽分享面板里的某些系统操作,比如打印,但不知道代码怎么写?" 害,这问题可问对人了!
今天这篇,我就手把手带你自定义分享面板操作区,从零到一,全程不超过 5 分钟(不含调试时间)~
操作区是啥?
操作区是分享面板中的一个区域,显示系统提供的操作,比如:
- 复制:复制分享内容到剪贴板
- 保存:保存分享内容到本地
- 另存为:将分享内容另存为指定格式
- 打印:打印分享内容
这些操作是系统默认提供的,但有时候你可能不需要某些操作,这时候就可以屏蔽它们。
如何屏蔽系统操作?
Share Kit 提供了 setExcludedAbilities 方法,可以屏蔽指定的系统操作。
完整代码示例
typescript
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.setExcludedAbilities(['com.example.print']);
// 步骤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
});
参数详解
setExcludedAbilities - 屏蔽系统操作
controller.setExcludedAbilities(['com.example.print']) 用于屏蔽指定的系统操作。
参数是一个数组,可以传入多个要屏蔽的操作。
🥦 西兰花小贴士 :
要屏蔽的操作需要传入完整的包名和类名,比如 com.example.print。如果你不知道要屏蔽的操作的包名,可以查看系统日志,找到对应的操作信息。
在实际项目中怎么用?
上面的代码是基础实现,但在实际项目中,你可能会这样用:
示例:屏蔽打印操作
typescript
import { common } from '@kit.AbilityKit';
import { systemShare } from '@kit.ShareKit';
@Entry
@Component
struct SharePage {
// 分享文本
shareText: string = '这是一段分享文本';
// 分享文本(屏蔽打印操作)
onShareTextWithoutPrint() {
// 构造分享数据
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.setExcludedAbilities(['com.example.print']);
// 显示分享面板
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.onShareTextWithoutPrint();
})
.margin(20);
}
.width('100%')
.height('100%');
}
}
示例:屏蔽多个系统操作
typescript
import { common } from '@kit.AbilityKit';
import { systemShare } from '@kit.ShareKit';
@Entry
@Component
struct SharePage {
// 分享文本
shareText: string = '这是一段分享文本';
// 分享文本(屏蔽多个系统操作)
onShareTextWithoutMultipleOperations() {
// 构造分享数据
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.setExcludedAbilities([
'com.example.print',
'com.example.save',
'com.example.copy'
]);
// 显示分享面板
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.onShareTextWithoutMultipleOperations();
})
.margin(20);
}
.width('100%')
.height('100%');
}
}
常见的系统操作包名
下面是一些常见的系统操作包名,你可以根据需要屏蔽:
| 操作 | 包名 |
|---|---|
| 打印 | com.example.print |
| 保存 | com.example.save |
| 另存为 | com.example.saveAs |
| 复制 | com.example.copy |
🥦 西兰花警告 :
我有个朋友第一次屏蔽系统操作,随便写了个包名,结果屏蔽失败,debug 了两小时才发现包名不对!血泪教训啊朋友们!
什么时候需要屏蔽系统操作?
以下场景可能需要屏蔽系统操作:
- 内容不适合打印:比如敏感信息、个人隐私等
- 内容不适合保存:比如临时内容、一次性内容等
- 应用有自定义操作:比如应用有自己的保存、复制功能
- 简化分享面板:减少操作选项,提升用户体验
常见问题
Q1:屏蔽系统操作后,操作区还是显示怎么办?
检查以下几点:
-
包名是否正确:
- 确认传入的包名是否正确
- 确认包名格式是否正确
-
是否在显示分享面板前调用:
- 确认
setExcludedAbilities是否在show之前调用 - 如果在
show之后调用,屏蔽不会生效
- 确认
Q2:如何恢复被屏蔽的系统操作?
被屏蔽的系统操作无法恢复,如果需要恢复,只能重新创建 ShareController 对象,不调用 setExcludedAbilities 方法。
Q3:如何屏蔽所有系统操作?
如果需要屏蔽所有系统操作,可以传入一个包含所有系统操作包名的数组:
typescript
controller.setExcludedAbilities([
'com.example.print',
'com.example.save',
'com.example.saveAs',
'com.example.copy'
]);
下一步学什么?
看完这篇,你应该已经能自定义分享面板操作区了。接下来可以深入学习:
- 获取分享结果:监听分享完成事件,处理分享结果
- 共享联系人到推荐区:让分享更精准
- 目标应用接入:让你的应用能接收其他应用分享的内容
- 高级功能:碰一碰分享、隔空传送
推荐资料
📚 官方文档:
我是盐焗西兰花,
不教理论,只给你能跑的代码和避坑指南。
下期见!🥦