鸿蒙开发:Intents Kit 在美颜相机中的跨应用交互
在"拍摄美颜相机"应用中,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 应用协作规范。
评论