鸿蒙学习实战之路-Share Kit系列(7/17)-自定义分享面板操作区

鸿蒙学习实战之路-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 了两小时才发现包名不对!血泪教训啊朋友们!


什么时候需要屏蔽系统操作?

以下场景可能需要屏蔽系统操作:

  1. 内容不适合打印:比如敏感信息、个人隐私等
  2. 内容不适合保存:比如临时内容、一次性内容等
  3. 应用有自定义操作:比如应用有自己的保存、复制功能
  4. 简化分享面板:减少操作选项,提升用户体验

常见问题

Q1:屏蔽系统操作后,操作区还是显示怎么办?

检查以下几点:

  1. 包名是否正确

    • 确认传入的包名是否正确
    • 确认包名格式是否正确
  2. 是否在显示分享面板前调用

    • 确认 setExcludedAbilities 是否在 show 之前调用
    • 如果在 show 之后调用,屏蔽不会生效

Q2:如何恢复被屏蔽的系统操作?

被屏蔽的系统操作无法恢复,如果需要恢复,只能重新创建 ShareController 对象,不调用 setExcludedAbilities 方法。

Q3:如何屏蔽所有系统操作?

如果需要屏蔽所有系统操作,可以传入一个包含所有系统操作包名的数组:

typescript 复制代码
controller.setExcludedAbilities([
  'com.example.print',
  'com.example.save',
  'com.example.saveAs',
  'com.example.copy'
]);

下一步学什么?

看完这篇,你应该已经能自定义分享面板操作区了。接下来可以深入学习:

  1. 获取分享结果:监听分享完成事件,处理分享结果
  2. 共享联系人到推荐区:让分享更精准
  3. 目标应用接入:让你的应用能接收其他应用分享的内容
  4. 高级功能:碰一碰分享、隔空传送

推荐资料

📚 官方文档


我是盐焗西兰花,

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

下期见!🥦

相关推荐
知识分享小能手2 分钟前
MongoDB入门学习教程,从入门到精通,MongoDB创建副本集知识点梳理(10)
数据库·学习·mongodb
星幻元宇VR28 分钟前
VR动感科普单车:让交通安全教育更真实、更有效
科技·学习·安全·生活·vr
123过去1 小时前
hashid使用教程
linux·网络·测试工具·安全
C+++Python2 小时前
Linux/C++多进程
linux·运维·c++
初生牛犊不怕苦2 小时前
与AI一起学习《C专家编程》:数组与指针
c语言·学习·算法
elseif1232 小时前
浅谈 C++ 学习
开发语言·c++·学习
Stack Overflow?Tan902 小时前
linux ubuntu22.04安装ROS2humble完整版的流程
linux·docker·ros2
zly35002 小时前
centos7 sshd无法启动
linux·运维·服务器
沛沛rh452 小时前
深入并发编程:从 C++ 到 Rust 的学习笔记
c++·笔记·学习·算法·rust
WYT王玉桐2 小时前
软件测试(黑马)
学习