鸿蒙学习实战之路-Share Kit系列(17/17)-Share Kit常见问题与避坑指南

鸿蒙学习实战之路-Share Kit系列(17/17)-Share Kit常见问题与避坑指南

最近好多朋友问我:"西兰花啊,我用 Share Kit 遇到各种问题,有没有避坑指南?" 害,这问题可问对人了!

今天这篇,我就把 Share Kit 常见问题和避坑指南整理出来,帮你少踩坑,多省时间~


权限问题

Q1:分享面板弹不出来怎么办?

可能原因

  1. 没有申请权限
  2. 权限被用户拒绝
  3. 权限配置错误

解决方案

  1. 检查 module.json5 配置

    json 复制代码
    {
      "module": {
        "requestPermissions": [
          {
            "name": "ohos.permission.DISTRIBUTED_DATASYNC"
          }
        ]
      }
    }
  2. 检查用户是否授权

    typescript 复制代码
    import { abilityAccessCtrl } from '@kit.AbilityKit';
    
    // 检查权限
    let atManager = abilityAccessCtrl.createAtManager();
    let grantStatus = atManager.verifyAccessToken(100, 'ohos.permission.DISTRIBUTED_DATASYNC');
    
    if (grantStatus !== 0) {
      console.log('权限未授权');
    }
  3. 引导用户授权

    typescript 复制代码
    // 请求权限
    atManager.requestPermissionsFromUser(context, ['ohos.permission.DISTRIBUTED_DATASYNC'], (err, data) => {
      if (err) {
        console.error(`请求权限失败:${err}`);
        return;
      }
      console.log(`请求权限成功:${data}`);
    });

🥦 西兰花警告

我有个朋友忘记申请权限,结果分享面板一直弹不出来,debug 了两小时才发现是权限问题!血泪教训啊朋友们!


Q2:碰一碰分享不触发怎么办?

可能原因

  1. 没有申请 NFC 权限
  2. NFC 功能未开启
  3. 设备不支持 NFC

解决方案

  1. 检查 module.json5 配置

    json 复制代码
    {
      "module": {
        "requestPermissions": [
          {
            "name": "ohos.permission.NFC_TAG"
          }
        ]
      }
    }
  2. 检查 NFC 功能是否开启

    typescript 复制代码
    import { nfc } from '@kit.ConnectivityKit';
    
    // 检查NFC功能是否开启
    let isNfcAvailable = nfc.isNfcAvailable();
    if (!isNfcAvailable) {
      console.log('NFC功能未开启');
    }
  3. 引导用户开启 NFC 功能

    typescript 复制代码
    if (!isNfcAvailable) {
      // 引导用户开启NFC功能
      console.log('请开启NFC功能');
    }

配置问题

Q3:目标应用接收不到分享怎么办?

可能原因

  1. module.json5 配置错误
  2. exported 未设置为 true
  3. skills 配置不正确

解决方案

  1. 检查 module.json5 配置

    json 复制代码
    {
      "module": {
        "abilities": [
          {
            "name": "EntryAbility",
            "exported": true,
            "skills": [
              {
                "entities": [
                  "entity.system.home"
                ],
                "actions": [
                  "ohos.want.action.sendData"
                ],
                "uris": [
                  {
                    "scheme": "file",
                    "linkFeature": "FileOpen",
                    "type": "general.text",
                    "maxFileSupported": 1
                  }
                ],
                "domainVerify": true
              }
            ]
          }
        ]
      }
    }
  2. 检查 exported 是否设置为 true

    • 确认 exported 是否设置为 true
    • 如果设置为 false,其他应用无法分享到你的应用
  3. 检查 skills 配置

    • 确认 actions 是否设置为 ohos.want.action.sendData
    • 确认 uris 中的 type 是否和分享数据的 utd 类型匹配

🥦 西兰花警告

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


Q4:分享详情页弹不出来怎么办?

可能原因

  1. ShareExtensionAbility 配置错误
  2. srcEntry 路径错误
  3. skills 配置不正确

解决方案

  1. 检查 module.json5 配置

    json 复制代码
    {
      "module": {
        "abilities": [
          {
            "name": "ShareExtensionAbility",
            "srcEntry": "./ets/shareextensionability/ShareExtensionAbility.ets",
            "exported": true,
            "skills": [
              {
                "entities": [
                  "entity.system.home"
                ],
                "actions": [
                  "ohos.want.action.sendData"
                ],
                "uris": [
                  {
                    "scheme": "file",
                    "linkFeature": "FileOpen",
                    "type": "general.text",
                    "maxFileSupported": 1
                  }
                ],
                "domainVerify": true
              }
            ]
          }
        ]
      }
    }
  2. 检查 srcEntry 路径

    • 确认 srcEntry 指向的文件是否存在
    • 确认文件路径是否正确
  3. 检查 skills 配置

    • 确认 actions 是否设置为 ohos.want.action.sendData
    • 确认 uris 中的 type 是否和分享数据的 utd 类型匹配

数据类型问题

Q5:分享数据类型不支持怎么办?

可能原因

  1. utd 类型不正确
  2. 目标应用不支持该类型
  3. 数据格式不正确

解决方案

  1. 检查 utd 类型

    typescript 复制代码
    // 常用的UTD类型
    let utdTypes = [
      'general.text',      // 文本
      'general.image',     // 图片
      'general.video',     // 视频
      'general.link'      // 链接
    ];
  2. 检查目标应用是否支持该类型

    • 确认目标应用的 module.json5 中是否声明了该类型
    • 确认目标应用是否支持该类型
  3. 检查数据格式

    typescript 复制代码
    // 构造分享数据
    let shareData: systemShare.SharedData = new systemShare.SharedData({
      utd: 'general.text',  // 确认utd类型是否正确
      uri: 'file://.../xxx.txt',  // 确认uri是否正确
      title: '分享文本',
      preview: 'file://.../preview.jpg',
      description: '这是一段分享文本'
    });

Q6:分享图片失败怎么办?

可能原因

  1. 图片路径不正确
  2. 图片格式不支持
  3. 图片文件不存在

解决方案

  1. 检查图片路径

    typescript 复制代码
    // 确认图片路径是否正确
    let imagePath = 'file://.../xxx.jpg';
    
    // 检查文件是否存在
    import { fileIo } from '@kit.CoreFileKit';
    let isExist = fileIo.accessSync(imagePath);
    if (!isExist) {
      console.log('图片文件不存在');
    }
  2. 检查图片格式

    typescript 复制代码
    // 常用的图片格式
    let imageFormats = [
      'jpg',
      'jpeg',
      'png',
      'gif',
      'bmp',
      'webp'
    ];
  3. 检查图片文件

    typescript 复制代码
    // 检查图片文件是否有效
    import { image } from '@kit.ImageKit';
    
    async function checkImage(imagePath: string): Promise<boolean> {
      try {
        let imageSource = image.createImageSource(imagePath);
        let imageInfo = await imageSource.getImageInfo();
        return true;
      } catch (e) {
        console.error(`图片文件无效:${e}`);
        return false;
      }
    }

跨设备分享问题

Q7:跨设备分享不成功怎么办?

可能原因

  1. 设备不在同一网络
  2. 设备未信任
  3. 设备不支持跨设备分享

解决方案

  1. 检查设备是否在同一网络

    typescript 复制代码
    import { deviceManager } from '@kit.DistributedDeviceKit';
    
    // 获取设备列表
    deviceManager.getTrustedDeviceList((err, data) => {
      if (err) {
        console.error(`获取设备列表失败:${err}`);
        return;
      }
      console.log(`设备列表:${data}`);
    });
  2. 检查设备是否已信任

    • 确认设备是否已添加到信任设备列表
    • 确认设备是否在线
  3. 检查设备是否支持跨设备分享

    typescript 复制代码
    // 检查设备类型
    deviceManager.getTrustedDeviceList((err, data) => {
      if (err) {
        console.error(`获取设备列表失败:${err}`);
        return;
      }
      data.forEach(device => {
        if (device.deviceType === 'PHONE' || device.deviceType === 'TABLET' || device.deviceType === 'PC') {
          console.log(`支持跨设备分享的设备:${device.deviceName}`);
        }
      });
    });

Q8:隔空传送不成功怎么办?

可能原因

  1. 设备距离太远
  2. 设备未信任
  3. 设备不支持隔空传送

解决方案

  1. 检查设备距离

    • 确认设备距离是否在 10 米以内
    • 建议设备距离在 5 米以内
  2. 检查设备是否已信任

    • 确认设备是否已添加到信任设备列表
    • 确认设备是否在线
  3. 检查设备是否支持隔空传送

    typescript 复制代码
    // 检查设备类型
    deviceManager.getTrustedDeviceList((err, data) => {
      if (err) {
        console.error(`获取设备列表失败:${err}`);
        return;
      }
      data.forEach(device => {
        if (device.deviceType === 'PHONE' || device.deviceType === 'TABLET' || device.deviceType === 'PC') {
          console.log(`支持隔空传送的设备:${device.deviceName}`);
        }
      });
    });

性能问题

Q9:分享面板打开慢怎么办?

可能原因

  1. 分享数据太大
  2. 预览图太大
  3. 设备性能不足

解决方案

  1. 压缩分享数据

    typescript 复制代码
    // 压缩文本数据
    let text = '这是一段很长的文本...';
    let compressedText = text.substring(0, 1000);  // 只取前1000个字符
  2. 压缩预览图

    typescript 复制代码
    // 压缩预览图
    import { image } from '@kit.ImageKit';
    
    async function compressImage(imagePath: string, outputPath: string): Promise<void> {
      try {
        let imageSource = image.createImageSource(imagePath);
        let imageInfo = await imageSource.getImageInfo();
        
        // 创建图片解码器
        let decoder = image.createImageDecoder();
        await decoder.setSource(imageSource);
        
        // 创建图片编码器
        let encoder = image.createImageEncoder();
        await encoder.setSource(decoder);
        await encoder.setOutputPath(outputPath);
        await encoder.encode();
      } catch (e) {
        console.error(`压缩图片失败:${e}`);
      }
    }
  3. 优化分享数据

    typescript 复制代码
    // 优化分享数据
    let shareData: systemShare.SharedData = new systemShare.SharedData({
      utd: 'general.text',
      uri: 'file://.../xxx.txt',
      title: '分享文本',
      preview: 'file://.../preview.jpg',  // 使用压缩后的预览图
      description: '这是一段分享文本'
    });

其他问题

Q10:分享结果监听不触发怎么办?

可能原因

  1. 没有注册监听
  2. 监听回调函数错误
  3. 分享面板未正确关闭

解决方案

  1. 检查是否注册了监听

    typescript 复制代码
    // 注册分享完成事件监听
    controller.on('shareCompleted', (result: systemShare.ShareResult) => {
      console.log(`分享完成,结果:${result}`);
    });
  2. 检查监听回调函数

    typescript 复制代码
    // 确认回调函数是否正确
    let shareCompletedCallback = (result: systemShare.ShareResult) => {
      console.log(`分享完成,结果:${result}`);
    };
    
    controller.on('shareCompleted', shareCompletedCallback);
  3. 检查分享面板是否正确关闭

    typescript 复制代码
    // 关闭分享面板
    controller.hide();

避坑指南

1. 权限申请要提前

在开发前,先确认需要哪些权限,并在 module.json5 中声明。

2. 配置要仔细

module.json5 的配置要仔细检查,特别是 exportedskills 等关键字段。

3. 数据类型要匹配

分享数据的 utd 类型要和目标应用的 skills 配置匹配。

4. 设备要信任

跨设备分享前,先确认设备是否已添加到信任设备列表。

5. 预览图要压缩

预览图要压缩,避免分享面板打开慢。

6. 监听要注册

分享结果监听要注册,否则无法获取分享结果。

7. 错误要处理

代码中要处理各种错误情况,避免应用崩溃。


推荐资料

📚 官方文档


我是盐焗西兰花,

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

下期见!🥦

相关推荐
神龙天舞200111 分钟前
CMake构建学习笔记-通用的CMake构建脚本
笔记·学习
似的8358 小时前
一步一步学习使用FireMonkey动画() 使用TAnimator类创建动画
linux·学习·nginx
fanged9 小时前
总线学习3--SPI番外(TODO)
学习
ThsPool10 小时前
【遥感学习整理 02】ENVI遥感图像处理基础:从数据读取到遥感信息产品
图像处理·人工智能·学习
FF2501_9402285810 小时前
HarmonyOS应用开发实战:猫猫大作战-在排行榜和历史记录查询中,排序是必不可少的操作【apple_product_name】
华为·harmonyos·鸿蒙
05664612 小时前
Python康复训练——常用标准库
开发语言·python·学习
05664612 小时前
Python康复训练——控制流与函数
开发语言·python·学习
早睡早起身体好12314 小时前
为什么 Network 中会出现两个同名请求?——CORS 预检请求学习笔记
网络·笔记·学习·网络安全
菩提树下的打坐14 小时前
测试左移的更深一层:用 DDD 战术设计反推测试边界
学习
casual~15 小时前
模逆元计算方法详解:扩展欧几里得算法与费马小定理
学习·算法·逆元