如何通过系统相机拍照和录像
2024-12-04 11:51:56
213次阅读
0个评论
通过系统相机拍照和录像
应用可调用CameraPicker拍摄照片或录制视频,无需申请相机权限。 CameraPicker的相机交互界面由系统提供,在用户点击拍摄和确认按钮后,调用CameraPicker的应用获取对应的照片或者视频。
应用开发者如果只是需要获取即时拍摄的照片或者视频,则可以使用CameraPicker能力来轻松实现。
由于照片的拍摄和确认都是由用户进行主动确认,因此应用开发者可以不用申请操作相机的相关权限。
约束与限制
在应用调试时,开发者需在release模式下调用系统相机(CameraPicker)。
由于系统限制了debug模式下不允许调试release应用,在debug模式下调用系统相机,将导致异常。
开发步骤
详细的API说明请参考CameraPicker API参考。
1.导入相关接口,导入方法如下。
import { camera, cameraPicker as picker } from '@kit.CameraKit'
import { fileIo, fileUri } from '@kit.CoreFileKit'
2.配置PickerProfile
说明:
PickerProfile的saveUri为可选参数,如果未配置该项,拍摄的照片和视频默认存入媒体库中。
如果不想将照片和视频存入媒体库,请自行配置应用沙箱内的文件路径。 应用沙箱内的这个文件必须是一个存在的、可写的文件。这个文件的uri传入picker接口之后,相当于应用给系统相机授权该文件的读写权限。系统相机在拍摄结束之后,会对此文件进行覆盖写入。
let pathDir = getContext().filesDir;
let fileName = `${new Date().getTime()}`
let filePath = pathDir + `/${fileName}.tmp`
fileIo.createRandomAccessFileSync(filePath, fileIo.OpenMode.CREATE);
let uri = fileUri.getUriFromPath(filePath);
let pickerProfile: picker.PickerProfile = {
cameraPosition: camera.CameraPosition.CAMERA_POSITION_BACK,
saveUri: uri
};
3.调用picker拍摄接口获取拍摄的结果。
let result: picker.PickerResult =
await picker.pick(getContext(), [picker.PickerMediaType.PHOTO, picker.PickerMediaType.VIDEO],
pickerProfile);
console.info(`picker resultCode: ${result.resultCode},resultUri: ${result.resultUri},mediaType: ${result.mediaType}`);
完整示例
import { camera, cameraPicker as picker } from '@kit.CameraKit'
import { fileIo, fileUri } from '@kit.CoreFileKit'
@Entry
@Component
struct Index {
@State imgSrc: string = '';
@State videoSrc: string = '';
build() {
RelativeContainer() {
Column() {
Image(this.imgSrc).width(200).height(200).backgroundColor(Color.Black).margin(5);
Video({ src: this.videoSrc}).width(200).height(200).autoPlay(true);
Button("Test Picker Photo&Video").fontSize(20)
.fontWeight(FontWeight.Bold)
.onClick(async () => {
let pathDir = getContext().filesDir;
let fileName = `${new Date().getTime()}`
let filePath = pathDir + `/${fileName}.tmp`
fileIo.createRandomAccessFileSync(filePath, fileIo.OpenMode.CREATE);
let uri = fileUri.getUriFromPath(filePath);
let pickerProfile: picker.PickerProfile = {
cameraPosition: camera.CameraPosition.CAMERA_POSITION_BACK,
saveUri: uri
};
let result: picker.PickerResult =
await picker.pick(getContext(), [picker.PickerMediaType.PHOTO, picker.PickerMediaType.VIDEO],
pickerProfile);
console.info(`picker resultCode: ${result.resultCode},resultUri: ${result.resultUri},mediaType: ${result.mediaType}`);
if (result.resultCode == 0) {
if (result.mediaType === picker.PickerMediaType.PHOTO) {
this.imgSrc = result.resultUri;
} else {
this.videoSrc = result.resultUri;
}
}
}).margin(5);
}.alignRules({
center: { anchor: '__container__', align: VerticalAlign.Center },
middle: { anchor: '__container__', align: HorizontalAlign.Center }
});
}
.height('100%')
.width('100%')
}
}
00
- 3回答
- 7粉丝
- 2关注
相关话题
- 如何调用系统拍照并获取图片
- 鸿蒙Next如何处理相机在全屏预览的时候,画面会有变形和拉伸的问题?
- 鸿蒙无权限实现图片选择拍照和录视频
- 录像实现方案
- 高性能拍照实现方案(仅对系统应用开放)
- 如何加载和使用自定义字体
- 拍照实现方案
- OpenHarmony: 如何通过路由跳转到一个只有页面没有UIAbility的模块
- 分段式拍照实现方案
- 鸿蒙原生应用如何才能拉起系统浏览器?
- 通过简单计算器熟悉栅格化布局
- harmony OS NEXT-通过用户首选项实现数据持久化
- 「Mac玩转仓颉内测版38」小学奥数篇1 - 如何平分6个苹果和4个橘子
- Flutter 鸿蒙化 使用 Flutter Channel实现和Flutter和HarmonyOS交互
- OpenHarmony 并发 taskpool 和 worker