# CameraPicker拍摄的优势及常见问题

## 问题现象

在开发相机功能时，一般有两种方案可供选择：[CameraPicker](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/camera-picker)和自定义相机。相比较功能丰富的自定义相机而言，CameraPicker有什么优势，又可能会有哪些问题呢？

## 解决方案

**CameraPicker核心优势**

* 轻量级开发。 相比于自定义相机的开发流程而言，CameraPicker开发代码量极少，只要在配置好[PickerProfile](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-camerapicker#pickerprofile)之后调用[cameraPicker.pick](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-camerapicker#camerapickerpick)接口即可，不需要对相机开发有太深的了解，"即插即用"，快速出结果。

* 无需申请相机权限。 CameraPicker的相机交互界面由系统提供，照片的拍摄和确认都是由用户进行主动确认，因此应用开发者可以不用申请操作相机的相关权限。

* 隐私安全。 CameraPicker封装的是系统相机能力，开发者仅能获取拍摄后的成片，对于终端用户而言该方式更为安全。

**CameraPicker常见问题**

* 系统已经开放地理位置权限，但是CameraPicker拍摄的图片依然看不到地理位置信息。 答：CameraPicker的隐私规格限制决定了其拍摄的图片不会带上地理位置信息。

* 如何获取CameraPicker拍照生成文件的格式？ 答：通过pickerResult.resultUri的扩展名判断文件格式，或者使用image模块的[ImageSource](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-image-imagesource)接口来获取文件的真实MIME类型，从而准确确定文件格式。

* CameraPicker调起系统相机拍照时怎么获取拍摄时间？

  答：一般可通过下述两种方案来解决：
  * 使用[@ohos.file.fs](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-file-fs)获取照片文件的创建时间。需要在相机拍摄完成后，拿到返回的resultUri，然后使用[fileIo.statSync](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-file-fs#fileiostatsync)接口创建[fileIo.Stat](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-file-fs#stat)对象，Stat对象中的mtime属性即为该文件上次被修改的时间，一般来说就是拍摄完被覆写的时间。
  * 在代码里直接记录时间戳。可根据业务实际需要，在调起Picker拍摄时或者拍摄动作完成后记录时间戳，作为照片拍摄时间。
* 使用CameraPicker拍照后无法使用uri生成ImagereSource。 答：在对PickerProfile的saveUri配置时，应用沙箱内的这个文件必须是一个存在的、可写的文件。这个文件的uri传入Picker接口之后，相当于应用给系统相机授权该文件的读写权限。系统相机在拍摄结束之后，会对此文件进行覆盖写入。

## 总结

CameraPicker和自定义相机优劣势对比可参见下表：

|方案|优势|劣势|适用场景|
|:-----------|:-------------------------------------------------------|:-----------------------------------------|:--------------------------------|
|CameraPicker|1. 快速上手，代码量极低，节约开发测试成本 2. 无需申请相机权限 3. 系统相机能力，用户的隐私安全更有保障|1. 拍摄页面无法定制，无法嵌入业务的页面布局 2. 功能简单，可调整的拍摄参数较少|快速开发场景，对拍摄效果要求不高。比如用户头像拍摄等场景。|
|自定义相机|1. 可自定义页面布局 2. 可自定义拍摄参数，改善拍摄效果 3. 可对预览流做二次加工处理|1. 开发测试成本较高，需要有一定相机开发基础 2. 需要自己处理相机权限|深度定制场景。如直播、美图相机等对拍摄效果和自由度要求较高的场景。|

