鸿蒙学习实战之路-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. 高级功能:碰一碰分享、隔空传送

推荐资料

📚 官方文档


我是盐焗西兰花,

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

下期见!🥦

相关推荐
zhim001 小时前
【保姆级教程】使用 Docker 部署 PostgreSQL + pgvector(含踩坑指南)
linux·docker
香水5只用六神2 小时前
【RTOS快速入门】07_同步互斥与通信概述
单片机·嵌入式硬件·学习·操作系统·freertos·rtos·嵌入式软件
开朗觉觉2 小时前
将json字符串转换为json对象
linux·服务器·python
脱脱克克2 小时前
OpenClaw 腾讯云 + 火山方舟(Volcengine Ark)完整安装与扩展教程
linux·腾讯云·openclaw
庭前云落2 小时前
从零开始的Hardhat学习 1| Hardhat 的基本使用、部署智能合约
学习·智能合约
飞Link3 小时前
深度捕捉时序本质:TSTD 异常检测之表示学习(Representation-based)全解析
学习·算法·数据挖掘·回归
cyber_两只龙宝3 小时前
【MySQL】MySQL主从复制架构
linux·运维·数据库·mysql·云原生·架构
Lolo_fi3 小时前
Linux PCI/PCIe子系统
linux
沐墨专攻技术3 小时前
一、项目初始化
笔记·学习