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

开发场景需求
在"拍摄美颜相机"应用中,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;

posted @ 2025-06-17 17:49  yimapingchuan  阅读(8)  评论(0)    收藏  举报