1# 通过系统相机拍照和录像(CameraPicker) 2<!--Kit: Camera Kit--> 3<!--Subsystem: Multimedia--> 4<!--Owner: @qano--> 5<!--Designer: @leo_ysl--> 6<!--Tester: @xchaosioda--> 7<!--Adviser: @zengyawen--> 8 9应用可调用CameraPicker拍摄照片或录制视频,无需申请相机权限。 10CameraPicker的相机交互界面由系统提供,在用户点击拍摄和确认按钮后,调用CameraPicker的应用获取对应的照片或者视频。 11 12应用开发者如果只是需要获取即时拍摄的照片或者视频,则可以使用CameraPicker能力来轻松实现。 13 14由于照片的拍摄和确认都是由用户进行主动确认,因此应用开发者可以不用申请操作相机的相关权限。 15 16## 开发步骤 17 18详细的API说明请参考[CameraPicker API参考](../../reference/apis-camera-kit/js-apis-cameraPicker.md)。 19 201. 导入相关接口,导入方法如下。 21 ```ts 22 import { camera, cameraPicker as picker } from '@kit.CameraKit'; 23 import { fileIo, fileUri } from '@kit.CoreFileKit'; 24 ``` 25 262. 配置[PickerProfile](../../reference/apis-camera-kit/js-apis-cameraPicker.md#pickerprofile)。 27 28 > **说明:** 29 > 30 > PickerProfile的saveUri为可选参数,如果未配置该项,拍摄的照片和视频默认存入媒体库中。 31 > 32 > 如果不想将照片和视频存入媒体库,请自行配置应用沙箱内的文件路径。 33 > 应用沙箱内的这个文件必须是一个存在的、可写的文件。这个文件的uri传入picker接口之后,相当于应用给系统相机授权该文件的读写权限。系统相机在拍摄结束之后,会对此文件进行覆盖写入。 34 35 ```ts 36 function createPickerProfile(context: Context): picker.PickerProfile { 37 let pathDir = context.filesDir; 38 let fileName = `${new Date().getTime()}`; 39 let filePath = pathDir + `/${fileName}.tmp`; 40 try { 41 fileIo.createRandomAccessFileSync(filePath, fileIo.OpenMode.CREATE); 42 } catch (error) { 43 let err = error as BusinessError; 44 console.error(`create picker profile failed. error code: ${err.code}`); 45 } 46 47 let uri = fileUri.getUriFromPath(filePath); 48 let pickerProfile: picker.PickerProfile = { 49 cameraPosition: camera.CameraPosition.CAMERA_POSITION_BACK, 50 saveUri: uri 51 }; 52 return pickerProfile; 53 } 54 ``` 55 fileIo接口调用方法请参考:[createRandomAccessFileSync](../../reference/apis-core-file-kit/js-apis-file-fs.md#fscreaterandomaccessfilesync10)和[getUriFromPath](../../reference/apis-core-file-kit/js-apis-file-fileuri.md#fileurigeturifrompath)。 56 57 583. 调用picker拍摄接口获取拍摄的结果。 59 ```ts 60 async function getPickerResult(context: Context, pickerProfile: picker.PickerProfile): Promise<picker.PickerResult> { 61 let result: picker.PickerResult = 62 // 调用picker方法拉起系统相机,获取拍摄的图片或视频。 63 await picker.pick(context, [picker.PickerMediaType.PHOTO, picker.PickerMediaType.VIDEO], 64 pickerProfile); 65 console.info(`picker resultCode: ${result.resultCode},resultUri: ${result.resultUri},mediaType: ${result.mediaType}`); 66 return result; 67 } 68 ``` 69 70## 完整示例 71 ```ts 72 import { camera, cameraPicker as picker } from '@kit.CameraKit'; 73 import { fileIo, fileUri } from '@kit.CoreFileKit'; 74 75 @Entry 76 @Component 77 struct Index { 78 @State imgSrc: string = ''; 79 @State videoSrc: string = ''; 80 createPickerProfile(context: Context): picker.PickerProfile { 81 let pathDir = context.filesDir; 82 let fileName = `${new Date().getTime()}`; 83 let filePath = pathDir + `/${fileName}.tmp`; 84 fileIo.createRandomAccessFileSync(filePath, fileIo.OpenMode.CREATE); 85 86 let uri = fileUri.getUriFromPath(filePath); 87 let pickerProfile: picker.PickerProfile = { 88 cameraPosition: camera.CameraPosition.CAMERA_POSITION_BACK, 89 saveUri: uri 90 }; 91 return pickerProfile; 92 } 93 94 async getPickerResult(context: Context, pickerProfile: picker.PickerProfile): Promise<picker.PickerResult> { 95 let result: picker.PickerResult = 96 await picker.pick(context, [picker.PickerMediaType.PHOTO, picker.PickerMediaType.VIDEO], 97 pickerProfile); 98 console.info(`picker resultCode: ${result.resultCode},resultUri: ${result.resultUri},mediaType: ${result.mediaType}`); 99 return result; 100 } 101 102 getContext(): Context | undefined { 103 let uiContext: UIContext = this.getUIContext(); 104 let context: Context | undefined = uiContext.getHostContext(); 105 return context; 106 } 107 108 build() { 109 RelativeContainer() { 110 Column() { 111 Image(this.imgSrc).width(200).height(200).backgroundColor(Color.Black).margin(5); 112 Video({ src: this.videoSrc}).width(200).height(200).autoPlay(true); 113 Button("Test Picker Photo&Video").fontSize(20) 114 .fontWeight(FontWeight.Bold) 115 .onClick(async () => { 116 let context = this.getContext(); 117 if (context === undefined) { 118 return; 119 } 120 let pickerProfile = this.createPickerProfile(context); 121 let result = await this.getPickerResult(context, pickerProfile); 122 if (result.resultCode == 0) { 123 if (result.mediaType === picker.PickerMediaType.PHOTO) { 124 this.imgSrc = result.resultUri; 125 } else { 126 this.videoSrc = result.resultUri; 127 } 128 } 129 }).margin(5); 130 131 }.alignRules({ 132 center: { anchor: '__container__', align: VerticalAlign.Center }, 133 middle: { anchor: '__container__', align: HorizontalAlign.Center } 134 }); 135 } 136 .height('100%') 137 .width('100%') 138 } 139 } 140 ```