1# Web获取相机拍照图片案例 2 3### 介绍 4 5本示例介绍如何在HTML页面中拉起原生相机进行拍照,并获取返回的图片。 6 7### 效果预览图 8 9 10 11**使用说明** 121. 点击HTML页面中的选择文件按钮,拉起原生相机进行拍照。 132. 完成拍照后,将图片在HTML的img标签中显示。 14 15### 实现思路 161. 添加Web组件,设置[onShowFileSelector](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-arkweb/ts-basic-components-web.md#onshowfileselector9)和[javaScriptProxy](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-arkweb/ts-basic-components-web.md#javascriptproxy)属性,接收HTML页面中input的点击事件。在onShowFileSelector中调用invokeCamera接口,拉起原生相机进行拍照,并通过callback回调方法获得照片的uri。然后将uri放在[FileSelectorResult](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-arkweb/ts-basic-components-web.md#fileselectorresult9)中,通过event参数返回给HTML页面。源码参考[MainPage.ets](./webgetcameraimage/src/main/ets/components/mainpage/MainPage.ets)。 17 18 ```typescript 19 Web({ src: $rawfile(LOCAL_HTML_PATH), controller: this.controller }) 20 .onShowFileSelector((event: FileResult) => { 21 this.invokeCamera(((uri: string) => { 22 event?.result.handleFileList([uri]); 23 })) 24 return true; 25 }) 26 .javaScriptProxy({ 27 object: this.shareObject, 28 name: 'shareObject', 29 methodList: ['share'], 30 controller: this.controller 31 }) 32 ``` 33 342. 实现invokeCamera接口,拉起原生相机,通过callback回调方法返回拍照结果,并保存到应用沙箱中。源码参考[MainPage.ets](./webgetcameraimage/src/main/ets/components/mainpage/MainPage.ets)。 35 36 ```typescript 37 invokeCamera(callback: (uri: string) => void) { 38 const context = getContext(this) as common.UIAbilityContext; 39 let want: Want = { 40 action: ACTION_IMAGE_CAPTURE, 41 parameters: { 42 "callBundleName": context.abilityInfo.bundleName, 43 } 44 }; 45 let result: (error: BusinessError, data: common.AbilityResult) => void = (error: BusinessError, data: common.AbilityResult) => { 46 if (error && error.code !== 0) { 47 logger.error(`${TAG_CAMERA_ERROR} ${JSON.stringify(error.message)}`); 48 return; 49 } 50 let resultUri: string = data.want?.parameters?.resourceUri as string; 51 if (callback && resultUri) { 52 callback(resultUri); 53 this.copyFileToSandBox(pickerResult.resultUri); 54 } 55 } 56 context.startAbilityForResult(want, result); 57 } 58 ``` 59 603. 实现拉起分享面板接口,源码参考[MainPage.ets](./webgetcameraimage/src/main/ets/components/mainpage/MainPage.ets)。 61 62 ```typescript 63 shareObject: ShareClass = { 64 share: async () => { 65 if (!this.filePath) { 66 this.getUIContext().getPromptAction().showToast({ 67 message: '未选择任何文件' 68 }); 69 return; 70 } 71 let utdTypeId = uniformTypeDescriptor.getUniformDataTypeByFilenameExtension('.jpg', 72 uniformTypeDescriptor.UniformDataType.IMAGE); 73 let uri: string = fileUri.getUriFromPath(this.filePath); 74 let shareData: systemShare.SharedData = new systemShare.SharedData({ 75 utd: utdTypeId, 76 uri: uri, 77 title: 'Picture Title', 78 description: 'Picture Description' 79 }); 80 let controller: systemShare.ShareController = new systemShare.ShareController(shareData); 81 let context = this.getUIContext().getHostContext() as common.UIAbilityContext; 82 controller.show(context, { 83 selectionMode: systemShare.SelectionMode.SINGLE, 84 previewMode: systemShare.SharePreviewMode.DEFAULT 85 }).then(() => { 86 console.info('ShareController show success'); 87 }).catch((error: BusinessError) => { 88 console.error(`ShareController show error, code: ${error.code}, message: ${error.message}`); 89 }) 90 } 91 }; 92 ``` 93 944. 在HTML页面中添加input标签,并在onChange属性中添加js方法,通过dom tree返回的描述事件相关信息的event对象接收ArkTS返回的照片,并显示在img标签上。添加sharePic()方法并在button标签上调用,使html可以拉起分享面板。源码参考[camera.html](./webgetcameraimage/src/main/resources/rawfile/camera.html)。 95 96 ```html 97 <script> 98 function showPic() { 99 let event = this.event; 100 let tFile = event ? event.target.files : []; 101 if (tFile === 0) { 102 document.getElementById('image_preview').style.display = 'block'; 103 document.getElementById('image_preview').innerHTML = "未选择图片"; 104 return 105 } 106 document.getElementById('image').setAttribute('src', URL.createObjectURL(tFile[0])); 107 document.getElementById('image_preview').style.display = 'block'; 108 document.getElementById('image').style.display = 'block'; 109 } 110 function sharePic() { 111 shareObject.share(); 112 } 113 </script> 114 <input ref="camera" type="file" id="upload" name="upload" accept="image/*" capture="upload" onchange="showPic()" /> 115 <button onclick="sharePic()">分享图片</button> 116 <p id="image_preview">图片预览</p> 117 <img id="image"> 118 ``` 119 120### 工程结构&模块类型 121 122 ``` 123 webgetcameraimage // har类型 124 |---mainpage 125 | |---MainPage.ets // ArkTS页面 126 |---rawfile 127 | |---camera.html // HTML页面 128 ``` 129 130### 模块依赖 131 132不涉及 133 134### 参考资料 135 136[Web组件](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-arkweb/ts-basic-components-web.md) 137 138### 相关权限 139 140不涉及 141 142### 约束与限制 143 1441.本示例仅支持在标准系统上运行,支持设备:Phone。 145 1462.本示例为Stage模型,支持API13版本SDK,SDK版本号(API Version 13 Release)。 147 1483.本示例需要使用DevEco Studio 5.0.4 Release 才可编译运行。 149 150### 下载 151 152如需单独下载本工程,执行如下命令: 153``` 154git init 155git config core.sparsecheckout true 156echo code/BasicFeature/Web/WebGetCameraImage/ > .git/info/sparse-checkout 157git remote add origin https://gitee.com/openharmony/applications_app_samples.git 158git pull origin master 159``` 160