##HarmonyOS Next实战##HarmonyOS SDK应用服务##教育##
目标:可以唤起相机拍照和录像,并展示拍摄的图片和视频。
应用可调用CameraPicker拍摄照片或录制视频,无需申请相机权限。
- CameraPicker的相机交互界面由系统提供,在用户点击拍摄和确认按钮后,调用CameraPicker的应用获取对应的照片或者视频。
- 应用开发者如果只是需要获取即时拍摄的照片或者视频,则可以使用CameraPicker能力来轻松实现。
- 由于照片的拍摄和确认都是由用户进行主动确认,因此应用开发者可以不用申请操作相机的相关权限。
cameraPicker.pick接口
pick(context: Context, mediaTypes: Array<PickerMediaType>, pickerProfile: PickerProfile): Promise<PickerResult>
拉起相机选择器,根据媒体类型进入相应的模式。操作结束通过Promise形式获取结果。
PickerProfile:相机选择器的配置信息。 PickerProfile属性
- cameraPosition:相机的位置。
- saveUri:保存配置信息的uri,默认值请参考文件uri。
- videoDuration:录制的最大时长(单位:秒)。
说明
- PickerProfile的saveUri为可选参数,如果未配置该项,拍摄的照片和视频默认存入媒体库中。
- 如果不想将照片和视频存入媒体库,请自行配置应用沙箱内的文件路径。
- 应用沙箱内的这个文件必须是一个存在的、可写的文件。这个文件的uri传入picker接口之后,相当于应用给系统相机授权该文件的读写权限。系统相机在拍摄结束之后,会对此文件进行覆盖写入。
PickerResult:相机选择器的处理结果。 PickerResult属性
- resultCode:处理的结果,成功返回0,失败返回-1。
- resultUri:返回的uri地址。若saveUri为空,resultUri为公共媒体路径。若saveUri不为空且具备写权限,resultUri与saveUri相同。若saveUri不为空且不具备写权限,则无法获取到resultUri。
- mediaType:返回的媒体类型。
实战:CameraPickerPage
import { camera, cameraPicker as picker } from '@kit.CameraKit'
import { fileIo, fileUri } from '@kit.CoreFileKit'
@Entry
@Component
struct CameraPickerPage {
@State imgSrc: string = '';
@State videoSrc: string = '';
@State isShowImage: boolean = false
build() {
Column({ space: 10 }) {
Text('CameraPicker Demo')
Row({ space: 10 }){
Button('拍照')
.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],
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;
this.isShowImage = true
} else {
this.videoSrc = result.resultUri;
}
}
})
Button('录视频')
.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.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;
this.isShowImage = false
}
}
})
}
if (this.imgSrc != '' || this.videoSrc != '') {
if (this.isShowImage) {
Image(this.imgSrc).width(200).height(200).backgroundColor(Color.Black).margin(5);
} else {
Video({ src: this.videoSrc }).width(200).height(200).autoPlay(true);
}
}
}
.height('100%')
.width('100%')
}
}