鸿蒙中 相机服务:Camera Kit(一)
本文介绍了鸿蒙系统相机开发的关键要点:1)CameraKit提供相机硬件访问、参数配置和输出管理功能,支持独立相机应用或内嵌相机模块开发;2)相机工作流程包括设备输入、会话管理和输出配置三部分;3)开发需申请相机、麦克风等权限,受限权限需审核;4)提供权限申请代码示例;5)推荐优先使用CameraPicker快速调用系统相机(无需权限)和媒体库Picker等替代方案,简化开发并提升安全性。
本文同步发表于微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新
一、Camera Kit
Camera Kit(相机服务)提供了相机开发的接口:
-
访问和操作相机硬件
-
实现预览、拍照和录像等基础操作
-
通过接口组合完成更多操作(控制闪光灯、曝光时间、对焦等)
开发场景
| 场景 | 说明 |
|---|---|
| 相机应用开发 | 开发独立的相机应用 |
| 应用内相机模块 | 在应用中嵌入相机功能 |
| 快速拍摄 | 使用CameraPicker拉起系统相机 |
提示:如果仅是需要拉起系统相机拍摄一张照片、录制一段视频,可直接使用CameraPicker,无需申请相机权限。
二、相机开发模型
2.1 工作流程三部分
相机应用开发的工作流程可概括为三部分:
┌─────────────────────────────────────────────────────────┐
│ 相机应用 │
├─────────────────────────────────────────────────────────┤
│ 1. 相机设备 │ 2. 相机会话管理 │ 3. 相机输出管理 │
│ (相机输入流) │ (配置参数) │ (预览/拍照/录像) │
└─────────────────────────────────────────────────────────┘
2.2 各模块
| 模块 | 功能 | 说明 |
|---|---|---|
| 相机设备 | 相机输入流 | 选择合适的相机镜头(前置/后置)进行拍摄 |
| 相机会话管理 | 配置参数 | 配置闪光灯、曝光时间、对焦和调焦等参数 |
| 相机输出管理 | 输出配置 | 将图像内容以预览流、拍照流或视频流输出 |
2.3 数据流转流程
相机设备采集数据
↓
图像信号处理器(ISP)处理
↓
相机HDI接口(硬件设备接口)
↓
缓存队列传递
↓
上层应用(预览/拍照/录像)
三、相机开发所需权限
3.1 权限清单
| 权限 | 说明 | 必需性 |
|---|---|---|
| ohos.permission.CAMERA | 相机权限,访问相机硬件 | 必需 |
| ohos.permission.MICROPHONE | 麦克风权限,录制音频时需申请 | 录制音视频时必需 |
| ohos.permission.MEDIA_LOCATION | 地理位置信息,照片/视频显示位置时需申请 | 需要位置信息时必需 |
3.2 权限申请原则
以上权限均需要:
-
配置文件权限声明
-
通过弹窗向用户申请授权
3.3 替代方案建议
| 需求 | 推荐方案 | 说明 |
|---|---|---|
| 读取图片/视频文件 | 媒体库Picker | 优先使用PhotoViewPicker选择媒体资源 |
| 保存图片/视频文件 | 安全控件 | 优先使用SaveButton安全控件保存媒体资源 |
3.4 受限权限说明
仅当应用需要克隆、备份或同步用户公共目录的图片、视频类文件时,可申请以下受限权限:
| 权限 | 说明 |
|---|---|
| ohos.permission.READ_IMAGEVIDEO | 读取图片视频文件 |
| ohos.permission.WRITE_IMAGEVIDEO | 写入图片视频文件 |
注意:受限权限需要通过AGC审核后才能使用。为避免应用上架申请被驳回,应优先使用Picker/控件等替代方案,仅少量符合特殊场景的应用被允许申请受限权限。
四、权限申请代码示例
4.1 声明权限(module.json5)
{
"module": {
"requestPermissions": [
{
"name": "ohos.permission.CAMERA",
"reason": "$string:camera_permission_reason",
"usedScene": {
"abilities": ["EntryAbility"],
"when": "inuse"
}
},
{
"name": "ohos.permission.MICROPHONE",
"reason": "$string:microphone_permission_reason",
"usedScene": {
"abilities": ["EntryAbility"],
"when": "inuse"
}
}
]
}
}
4.2 动态申请权限
import { abilityAccessCtrl, common } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
async function requestCameraPermission() {
const permissions: Array<string> = [
'ohos.permission.CAMERA',
'ohos.permission.MICROPHONE'
];
let atManager = abilityAccessCtrl.createAtManager();
let context = getContext(this) as common.UIAbilityContext;
try {
let result = await atManager.requestPermissionsFromUser(context, permissions);
let grantStatus = result.authResults;
for (let i = 0; i < grantStatus.length; i++) {
if (grantStatus[i] === 0) {
console.info(`${permissions[i]} 授权成功`);
} else {
console.warn(`${permissions[i]} 授权失败`);
}
}
} catch (error) {
let err = error as BusinessError;
console.error(`权限申请失败: ${err.code}, ${err.message}`);
}
}
五、CameraPicker快速方案
如果仅需要拉起系统相机拍摄一张照片、录制一段视频,可直接使用CameraPicker,无需申请相机权限,直接拉起系统相机完成拍摄。
使用场景
| 场景 | 说明 |
|---|---|
| 快速拍照 | 拉起系统相机拍照后返回 |
| 快速录像 | 拉起系统相机录像后返回 |
| 无需预览 | 不需要自定义相机预览界面 |
优势
-
无需申请权限:无需声明CAMERA权限
-
开发简单:几行代码即可完成
-
用户体验统一:使用系统相机界面
鸿蒙相机开发可通过Camera Kit实现自定义相机界面(需申请CAMERA权限),也可通过CameraPicker快速拉起系统相机(无需权限),读写媒体文件时优先使用Picker/安全控件替代受限权限。
更多推荐




所有评论(0)