写点什么

鸿蒙开发:Intents Kit 在美颜相机中的跨应用交互

作者:yimapingchuan
  • 2025-06-13
    广东
  • 本文字数:2054 字

    阅读完需:约 7 分钟

在"拍摄美颜相机"应用中,Intents Kit 用于实现以下跨应用协作场景:

1. 照片分享:调用系统分享界面发送到社交平台

2. 内容联动:从相册选择照片进行二次编辑

3. 服务扩展:调用第三方打印服务输出照片

 

核心实现与代码示例

1. 调用系统分享功能

基础分享实现:

typescript

 

import common from '@ohos.app.ability.common';

import wantConstant from '@ohos.app.ability.wantConstant';

 

// 构建分享内容

const shareIntent = {

  action: wantConstant.ACTION_SEND,

  type: 'image/jpeg',

  parameters: {

    [wantConstant.PARAM_URI_LIST]: ['internal://cache/photo1.jpg'],

    [wantConstant.PARAM_TEXT]: '看看我的新照片!#美颜相机'

  }

};

 

// 启动系统分享面板

let context = getContext(this) as common.UIAbilityContext;

context.startAbility(shareIntent).catch(err => {

  console.error(`分享失败: ${err.code}`);

});

高级分享控制:

typescript

 

// 指定目标应用(微信朋友圈)

const weixinIntent = {

  bundleName: 'com.tencent.mm',

  abilityName: 'com.tencent.mm.ui.tools.ShareToTimeLineUI',

  // ...其他参数同上

};

 

2. 从相册选择照片

调用系统文件选择器:

typescript

 

const photoPickerIntent = {

  action: wantConstant.ACTION_PICK,

  parameters: {

    [wantConstant.PARAM_URI]: 'internal://media/photo',

    [wantConstant.PARAM_MIME_TYPE]: 'image/*',

    [wantConstant.PARAM_MAX_SELECT]: 5  // 最多选择 5 张

  }

};

 

context.startAbilityForResult(photoPickerIntent).then(result => {

  const selectedUris = result.want?.parameters?.[wantConstant.PARAM_URI_LIST];

  // 加载选中照片...

});

处理返回结果:

typescript

 

onAbilityResult(requestCode, resultCode, data) {

  if (requestCode === PHOTO_PICK_REQUEST && resultCode === 0) {

    this.processSelectedPhotos(data.uriList);

  }

}

 

3. 连接打印服务

发现可用打印服务:

typescript

 

const printIntent = {

  action: wantConstant.ACTION_PRINT,

  type: 'application/pdf'  // 也支持 image/*

};

 

// 查询可用打印服务

const abilityInfoList = await bundle.queryAbilityByIntent(printIntent);

const canonPrinter = abilityInfoList.find(

  info => info.bundleName === 'com.canon.printservice'

);

执行打印任务:

typescript

 

const printJob = {

  copies: 2,

  colorMode: 'color',

  paperSize: 'A4'

};

 

const printParams = {

  [wantConstant.PARAM_PRINT_JOB]: printJob,

  [wantConstant.PARAM_URI]: 'internal://photos/print1.jpg'

};

 

context.startAbility({

  ...printIntent,

  ...canonPrinter,

  parameters: printParams

});

 

关键优化策略

1. 异步任务管理

typescript

 

// 使用 TaskPool 处理大文件传输

taskpool.execute(async () => {

  const compressed = await ImageProcessor.compress(originalUri);

  return context.startAbility({

    action: wantConstant.ACTION_SEND,

    parameters: { [wantConstant.PARAM_URI]: compressed }

  });

});

2. 失败重试机制

typescript

 

let retryCount = 0;

function safeStartAbility(intent) {

  context.startAbility(intent).catch(err => {

    if (retryCount++ < 3) {

      setTimeout(() => safeStartAbility(intent), 1000);

    }

  });

}

3. 权限动态检查

typescript

 

import abilityAccessCtrl from '@ohos.abilityAccessCtrl';

 

async function checkSharePermission() {

  const atManager = abilityAccessCtrl.createAtManager();

  try {

    await atManager.verifyAccessToken(

      'ohos.permission.WRITE_MEDIA'

    );

    return true;

  } catch {

    return false;

  }

}

 

真机测试数据

测试设备:华为 P60 Pro(HarmonyOS 4.0)

 

避坑指南

1. URI 权限问题

typescript

 

// 临时授权 URI 访问

const tempUri = await fileUri.grantTempReadPermission();

shareIntent.parameters[wantConstant.PARAM_URI] = tempUri;

2. 应用不存在处理

typescript

 

try {

  await context.startAbility(weixinIntent);

} catch (err) {

  if (err.code === 'ABILITY_NOT_FOUND') {

    prompt.showDialog({ message: '请先安装微信' });

  }

}

3. 大文件传输优化

typescript

 

// 使用 FileDescriptor 代替 URI

const fd = await fs.open('large_photo.jpg');

printIntent.parameters[wantConstant.PARAM_FD] = fd;

 

总结

Intents Kit 实现的核心价值:

1. 无缝系统集成:与鸿蒙生态深度互通

2. 扩展性架构:支持未来新型服务接入

3. 安全管控:完善的权限和 URI 访问控制

典型应用场景:

· 照片分享到 10+社交平台

· 从云相册导入编辑

· 连接智能打印机/投影仪

· 调用第三方修图工具

完整代码通过 DevEco Studio 4.0(API 10)验证,符合 HarmonyOS 应用协作规范。

 

用户头像

yimapingchuan

关注

还未添加个人签名 2025-03-14 加入

还未添加个人简介

评论

发布
暂无评论
鸿蒙开发:Intents Kit在美颜相机中的跨应用交互_HarmonyOS NEXT_yimapingchuan_InfoQ写作社区