HarmonyOS 鸿蒙Next 自定义相机拍照
HarmonyOS 鸿蒙Next 自定义相机拍照
介绍
- 使用@kit.CameraKit实现自定义相机拍照、双路预览功能
- 使用@kit.MediaLibraryKit、@kit.ImageKit、@kit.CoreFileKit、安全保存控件SaveButton实现图片保存到系统图库
- 使用@kit.MediaLibraryKit实现图库图片/视频选择
- 使用@kit.CoreFileKit实现保存文件到文件管理器中
效果图
使用说明
- 打开应用,展示“拍照”、“图库”两个按钮。
- 点击“拍照”按钮,即可进入拍照界面,注意当首次使用该功能时,需要用户进行授权,授权后才可使用。
- 点击“图库”按钮,即可拉起系统相册,访问系统相册图片进行保存和读取。
实现思路
主页的设计
- 设置拍照按钮,点击后进行授权询问,requestPermissionsFromUser会判断权限的授权状态来决定是否唤起弹窗,用户拒绝授权,提示用户必须授权才能访问当前页面的功能,并引导用户到系统设置中打开相应的权限。授权后即可跳转自定义照相机页面。
.onClick(() => {
let permissions: Array<Permissions> = [
···
];
let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
atManager.requestPermissionsFromUser(this.context, permissions).then((data: PermissionRequestResult) => {
···
})
}
- 设置图库按钮,点击后即可拉起系统相册,进行图片的保存和读取。
Button('图库')
.width(200)
.height(30)
.onClick(() => {
this.imagePicker();
})
.margin({ top: 30 })
构造imagePicker()函数,拉起图片选择。
imagePicker() { try { let photoSelectOptions = new photoAccessHelper.PhotoSelectOptions(); photoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_VIDEO_TYPE; photoSelectOptions.maxSelectNumber = 1; let photoPicker = new photoAccessHelper.PhotoViewPicker(); photoPicker.select(photoSelectOptions).then((photoSelectResult: photoAccessHelper.PhotoSelectResult) => { this.curFile = photoSelectResult.photoUris[0]; if (this.curFile) { ··· } }) } }
构造isVideoType()函数,用以判断所要保存的文件是image类型还是video类型。如果typeId == uniformTypeDescriptor.UniformDataType.IMAGE.toString(),则返回false;如果typeId == uniformTypeDescriptor.UniformDataType.VIDEO.toString(),则返回true。
isVideoType(fileUri: string): boolean {
try {
let fileExtention = fileUri.substring(fileUri.lastIndexOf('.'));
let typeId = uniformTypeDescriptor.getUniformDataTypeByFilenameExtension(fileExtention);
···
let typeObj: uniformTypeDescriptor.TypeDescriptor = uniformTypeDescriptor.getTypeDescriptor(typeId);
return typeObj.belongingToTypes.some((s) => s == uniformTypeDescriptor.UniformDataType.VIDEO.toString())
}
}
自定义相机的页面的实现
- 构建createCameraManager()函数,创建camera对象,监听相机状态变化
createCameraManager() {
let cameraManager: camera.CameraManager = camera.getCameraManager(this.context);
this.cameraManager = cameraManager;
···
this.cameraManager.on();
}
- 创建安全控件按钮,使用安全控件创建文件,选择通过文件管理写入文件
SaveButton(this.saveButtonOptions)
.onClick(async (event, result: SaveButtonOnClickResult) => {
···
···
···
})
- 创建拍照按钮,通过拍照流实现:点击拍照,从imageReceiver中获取图片,实现拍照。
.onClick(async () => {
let photoCaptureSetting: camera.PhotoCaptureSetting = {
quality: camera.QualityLevel.QUALITY_LEVEL_HIGH,
rotation: camera.ImageRotation.ROTATION_0
}
await this.photoOutput?.capture(photoCaptureSetting).catch((error: BusinessError) => {
console.error(`CameraDemo Failed to capture the photo ${error.message}`);
})
this.hasPicture = true;
})
- 获取支持指定的相机设备对象
let cameraDevices: Array<camera.CameraDevice> = [];
- 创建相机输入流
try {
this.cameraInput = this.cameraManager.createCameraInput(cameraDevices[0]);
}
- 打开相机,获取指定的相机设备对象支持的模式,获取相机设备支持的输出流能力,创建相机预览输出流,监听previewOutput错误信息,监听previewOutput2错误信息,创建拍照输出流,调用上面的回调函数来保存图片,创建相机会话,监听session错误信息,开始会话配置,向会话中添加相机输入流,向会话中添加预览输出流等依次操作。
工程目录
entry/src/main/ets/
|---entryability
| |---EntryAbility.ets
|---pages
| |---CameraDemo.ets // 自定义相机拍照页面
| |---FilePickerDemo.ets // 图库文件选择页面
| |---Index.ets // 入口页面
约束与限制
- 需要的权限
- ohos.permission.CAMERA
- ohos.permission.READ_MEDIA
- ohos.permission.WRITE_MEDIA
- ohos.permission.MEDIA_LOCATION
- 运行环境
- 手机ROM版本:ALN-AL00 5.0.0.102(SP8C00E73R4P17logpatch02)
- IDE:DevEco Studio 5.0.3.910
- SDK:HarmonyOS 5.0.0 Release(API 12)
更多关于HarmonyOS 鸿蒙Next 自定义相机拍照的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
1 回复
更多关于HarmonyOS 鸿蒙Next 自定义相机拍照的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS 鸿蒙Next中,自定义相机拍照功能可以通过以下场景化代码实现。假设你已经创建了一个鸿蒙应用,并添加了必要的权限(如CAMERA权限)。
自定义相机拍照代码示例
-
布局文件(XML):
<DirectionalLayout ohos:width="match_parent" ohos:height="match_parent" ohos:orientation="vertical"> <Camera ohos:id="$+id:camera" ohos:width="match_parent" ohos:height="0vp" ohos:weight="1"/> <Button ohos:id="$+id:capture" ohos:width="match_content" ohos:height="match_content" ohos:text="Capture"/> </DirectionalLayout>
-
逻辑代码(JavaScript/ETS):
[@Entry](/user/Entry) [@Component](/user/Component) struct CameraPage { @State camera: Camera | null = null; @Build MyCamera() { Column() { Camera(this.camera) .width('100%') .height('90%') Button('Capture') .onClick(() => { if (this.camera) { this.camera.captureImage((err, data) => { if (!err) { // 处理拍照结果 } }); } }) } } }
以上代码展示了如何在鸿蒙应用中嵌入相机控件并实现拍照功能。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html