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

114 阅读2分钟

开发场景需求

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

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

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

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

 

`// 核心实现与代码示例

// 调用系统分享功能

// 基础分享实现:

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',

   // ...其他参数同上

};

 

// 从相册选择照片

// 调用系统文件选择器:

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);

  }

}

 

// 连接打印服务

// 发现可用打印服务:

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

});

 

// 关键优化策略

// 异步任务管理

typescript

 

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

taskpool.execute(async () => {

  const compressed = await ImageProcessor.compress(originalUri);

  return context.startAbility({

    action: wantConstant.ACTION_SEND,

    parameters: { [wantConstant.PARAM_URI]: compressed }

  });

});

// 失败重试机制

typescript

 

let retryCount = 0;

function safeStartAbility(intent) {

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

    if (retryCount++ < 3) {

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

    }

  });

}

// 权限动态检查

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;

  }

}

 

// URI权限问题

typescript

 

// 临时授权URI访问

const tempUri = await fileUri.grantTempReadPermission();

shareIntent.parameters[wantConstant.PARAM_URI] = tempUri;

// 应用不存在处理

typescript

 

try {

  await context.startAbility(weixinIntent);

} catch (err) {

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

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

  }

}

// 大文件传输优化

typescript

 

// 使用FileDescriptor代替URI

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

printIntent.parameters[wantConstant.PARAM_FD] = fd;`