前言导读
各位网友和同学,相信大家在开发app的过程中都有遇到上传图片到服务器的需求,我们一般是有两种方式,拍照获取照片或者调用相册获取照片,今天我们就分享一个小案例讲一下这两种情况的实现。废话不多说我们正式开始
效果图
nimg.cn/direct/f9b831e0d5cf41c484dd1fced7c58385.gif)
具体实现
export async function fileSelect(): Promise<string> {let photoSelectOptions = new picker.PhotoSelectOptions();photoSelectOptions.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE;photoSelectOptions.maxSelectNumber = 1;let photoPicker = new picker.PhotoViewPicker();try {let photoSelectResult = await photoPicker.select(photoSelectOptions);if (photoSelectResult && photoSelectResult.photoUris && photoSelectResult.photoUris.length > 0) {let imgUri = photoSelectResult.photoUris[0];if (imgUri.indexOf('media/Photo')<0) {showToast($r('app.string.prompt_select_img'));return '';}return photoSelectResult.photoUris[0];} else {return '';}} catch (err) {Logger.error('SelectedImage failed', JSON.stringify(err));return '';}
}
export async function cameraSelect(cameraPosition: Array<camera.CameraPosition>,mediaType: Array<cameraPicker.PickerMediaType>,context:Context): Promise<string> {try {let pickerProfile: cameraPicker.PickerProfile = { cameraPosition: cameraPosition[1] };let pickerResult: cameraPicker.PickerResult = await cameraPicker.pick(context,[mediaType[0]], pickerProfile);let uri = pickerResult.resultUri;return uri;hilog.info(0x0000, ' ', "the pick pickerResult is:" + JSON.stringify(pickerResult));} catch (error) {let err = error as BusinessError;Logger.error( `the pick call failed. error code: `);return '';}}
界面实现
import { cameraPicker } from '@kit.CameraKit';
import { camera } from '@kit.CameraKit';
import { cameraSelect, fileSelect } from './Camerautils';@Entry
@Component
struct Index {@State imageUri: Resource | string | undefined = undefined;private cameraPosition: Array<camera.CameraPosition> = [camera.CameraPosition.CAMERA_POSITION_UNSPECIFIED, camera.CameraPosition.CAMERA_POSITION_BACK,camera.CameraPosition.CAMERA_POSITION_FRONT, camera.CameraPosition.CAMERA_POSITION_FOLD_INNER];private mediaType: Array<cameraPicker.PickerMediaType> = [cameraPicker.PickerMediaType.PHOTO, cameraPicker.PickerMediaType.VIDEO];selectImage() {fileSelect().then((uri: string) => {this.imageUri = uri || '';});}openphoto(){cameraSelect(this.cameraPosition,this.mediaType,getContext(this)).then((uri: string) => {this.imageUri = uri || '';});}build() {Row() {Column() {Image(this.imageUri).height(200).alt($r('app.media.startIcon'))Button("从相册获取").width(200).margin({ top: 20}).onClick(()=>{this.selectImage()})Button("拍照").width(200).margin({ top: 20}).onClick(async () => {this.openphoto()})}.width('100%')}.height('100%')}
}
我们在主界面写2个button来触发我们拍照动作和我们的从相册获取, 拍照的时候我们是需要去申请权限,获取到权限之后才能拍照拿到对应的照片。这里需要强调 无论是从相册获取照片还是拍照获取照片都是需要真机, 并且是next系统,鸿蒙4.2版本上面代码会报错api不同。我们拿到图片的uri然后通过赋值给我们的装饰器 ,来刷新我们image组件来显示。
最后总结
鸿蒙next 无论是拍照获取照片uri 还是从相册获取照片uri 都比较简单,大家有真机的可以去尝试,获取到照片然后提交给服务器把整个前后端的交互完善 。 如果有其他的需求方面可以在文章地下留言。老师看到了都会回复的,更多鸿蒙next 开发相关知识的学习和交流都可以关注我掘金专栏或者B站的课程。
如果需要学习更多鸿蒙的知识可以关注我B站教程
课程地址
B站课程地址:www.bilibili.com/cheese/play…
项目内容:
-
1 常用布局组件的学习
-
2 网络请求工具类封装
-
3 arkui 生命周期启动流程
-
4 日志工具类的封装
-
5 自定义组合组件的封装
-
6 路由导航跳转的使用
-
7 本地地数据的缓存 以及缓存工具类的封装
-
8 欢迎页面的实现
-
9 登录案例和自动登录效果实现
-
10 请求网络数据分页上拉加载 下拉刷新的实现
-
11 list数据懒加载实现
-
12 webview组件的使用
团队介绍
团队介绍:作者: 坚果派-徐庆 坚果派由坚果等人创建,团队由12位华为HDE以及若干热爱鸿蒙的开发者和其他领域的三十余位万粉博主运营。专注于分享 HarmonyOS/OpenHarmony,ArkUI-X,元服务,仓颉,团队成员聚集在北京,上海,南京,深圳,广州,宁夏等地,目前已开发鸿蒙 原生应用,三方库60+,欢迎进行课程,项目等合作。