鸿蒙5.0版开发:使用PhotoPicker组件访问图片/视频

打印 上一主题 下一主题

主题 956|帖子 956|积分 2870

 往期鸿蒙全套实战文章必看:



  • 鸿蒙开发焦点知识点,看这篇文章就够了
  • 最新版!鸿蒙HarmonyOS Next应用开发实战学习路线
  • 鸿蒙HarmonyOS NEXT开发技术最全学习路线指南
  • 鸿蒙应用开发实战项目,看这一篇文章就够了(部门项目附源码)

使用PhotoPicker组件访问图片/视频

当应用需要读取用户图片时,开发者可以在应用界面中嵌入PhotoPicker组件,在用户选择所需要的图片资源后,直接返回该图片资源,而不需要授予应用读取图片文件的权限,即可完成图片或视频文件的访问和读取。
界面结果如图所示。
宫格页
大图页




开发步调


  • 导入PhotoPicker模块文件。
    1. import {
    2.   PhotoPickerComponent,
    3.   PickerController,
    4.   PickerOptions,
    5.   DataType,
    6.   ItemInfo,
    7.   ItemType,
    8.   PhotoBrowserInfo,
    9.   ClickType,
    10.   PickerColorMode,
    11.   MaxSelected,
    12.   MaxCountType,
    13.   ReminderMode,
    14.   PickerOrientation,
    15.   BaseItemInfo,
    16.   PhotoBrowserRange,
    17. } from '@ohos.file.PhotoPickerComponent';
    18. import photoAccessHelper from '@ohos.file.photoAccessHelper';
    复制代码
  • 创建Picker组件配置选项实例(PickerOptions)和控制实例(PickerController)。 通过PickerOptions,开发者可配置Picker宫格的样式(如勾选框背景致、文本颜色等)、滑动预览方向、最大选择数量等参数。
    通过PickerController,应用可向Picker组件发送数据。
    1. // 组件初始化时设置参数信息
    2. pickerOptions: PickerOptions = new PickerOptions();
    3. // 组件初始化完成后,可控制组件部分行为
    4. @State pickerController: PickerController = new PickerController();  
    复制代码
  • 应用界面出现时,初始化组件配置选项实例(PickerOptions)。此处仅列举部门参数。
    1. aboutToAppear() {
    2.   // 设置picker宫格页数据类型
    3.   this.pickerOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_VIDEO_TYPE;
    4.   // 是否展示搜索框,默认false
    5.   this.pickerOptions.isSearchSupported = true;
    6.   // 是否支持拍照,默认false
    7.   this.pickerOptions.isPhotoTakingSupported = true;
    8.   // 是否支持重复选择
    9.   this.pickerOptions.isRepeatSelectSupported = false;
    10.   // 最大选择数量
    11.   this.pickerOptions.maxSelectNumber = 8; // 最大选择数量
    12.   // 最大图片选择数量
    13.   this.pickerOptions.maxPhotoSelectNumber = 8; // 最大图片选择数量
    14.   // 最大视频选择数量
    15.   this.pickerOptions.maxVideoSelectNumber = 8; // 最大视频选择数量
    16.   // 超出最大选择数量时
    17.   this.pickerOptions.maxSelectedReminderMode = ReminderMode.TOAST;
    18.   // 设置大图背景色
    19.   this.pickerOptions.photoBrowserBackgroundColorMode = PickerColorMode.AUTO;
    20.   // 设置checkbox选中颜色
    21.   this.pickerOptions.checkBoxColor = '#000000';
    22.   // 设置checkbox文字颜色
    23.   this.pickerOptions.checkboxTextColor = '#000000';
    24.   
    25.   // 设置宫格页背景色
    26.   this.pickerOptions.backgroundColor = '#000000';
    27.   // 设置选择模式,默认:MULTI_SELECT
    28.   this.pickerOptions.selectMode = SelectMode.SINGLE_SELECT;
    29. }
    复制代码
  • 实现回调函数。 通过实现以下回调事故,可在用户在界面操作时,将相关信息报给应用举行处理。

    • 进退大图、切换大图回调。
    • 勾选或取消勾选图片/视频,将上报图片URI供应用使用。 阐明

      • 回调返回的全部URI均为只读URI,开发者可以根据结果会集的URI读取文件数据。但不能在Picker的回调中直接使用此URI打开文档,需要定义一个全局变量保存URI。
      • 如需获取元数据,可通过文件管理和文件URI接口,根据uri获取部门文件属性信息,比如文件大小、访问时间、修改时间、文件名、文件路径等。
            
    • 点击图片(缩略图item),将上报图片/视频信息ItemInfo;点击相机item,可拉起体系相机或应用自行处理。
    1. // 进入大图页回调
    2. private onEnterPhotoBrowser(photoBrowserInfo: PhotoBrowserInfo): boolean {
    3.   console.info('onEnterPhotoBrowser' + JSON.stringify(photoBrowserInfo));
    4.   return false;
    5. }
    6. // 退出大图页回调
    7. private onExitPhotoBrowser(photoBrowserInfo: PhotoBrowserInfo): boolean {
    8.   console.info('onExitPhotoBrowser' + JSON.stringify(photoBrowserInfo));
    9.   return false;
    10. }
    11. // 接收到该回调后,便可通过pickerController相关接口向picker发送数据,在此之前不生效。
    12. private onPickerControllerReady(): void {
    13.   console.info('onPickerControllerReady');
    14. }
    15. // 大图页图片切换回调事件处理
    16. private onPhotoBrowserChanged(photoBrowserItemInfo: BaseItemInfo): boolean {
    17.   console.info('onPhotoBrowserChanged' + JSON.stringify(photoBrowserItemInfo));
    18.   this.currentUri = photoBrowserItemInfo.uri ?? '';
    19.   return true;
    20. }
    21. // 图片/视频被选中的回调,返回的url只有只读权限,不能用url直接去打开
    22. private onSelect(uri: string): void {
    23.   if (uri) {
    24.     this.selectedUris.push(uri)
    25.   }
    26.   // 将uri保存起来,并保证切换不同的宫格页组件时保持选中项一致
    27.   this.pickerOptions.preselectedUris = [...this.selectedUris];
    28.   this.pickerOptions1.preselectedUris = [...this.selectedUris];
    29.   this.pickerOptions2.preselectedUris = [...this.selectedUris];
    30.   console.info('onSelect' + JSON.stringify(this.selectedUris));
    31. }
    32. // 图片/视频被取消勾选的回调,返回的url只有只读权限,不能用url直接去打开
    33. private onDeselect(uri: string): void {
    34.   if (uri) {
    35.     this.selectedUris = this.selectedUris.filter((item: string) => {
    36.       return item !== uri;
    37.     })
    38.   }
    39.   // 排除反勾选uri,并保证切换不同的宫格页组件时保持选中项一致
    40.   this.pickerOptions.preselectedUris = [...this.selectedUris];
    41.   this.pickerOptions1.preselectedUris = [...this.selectedUris];
    42.   this.pickerOptions2.preselectedUris = [...this.selectedUris];
    43.   console.info('onDeselect' + JSON.stringify(this.selectedUris));
    44. }
    45. /**
    46. * 图片/视频被选中回调,返回资源的信息,以及选中方式
    47. * ItemInfo 图片、视频相关信息
    48. * ClickType(SELECTED:勾选, DESELECTED: 反选)
    49. * return 返回值为true时才会给url授权(返回的uri权限是只读权限)
    50. */
    51. private onItemClicked(itemInfo: ItemInfo, clickType: ClickType): boolean {
    52.   if (!itemInfo) {
    53.     return false;
    54.   }
    55.   let type: ItemType | undefined = itemInfo.itemType;
    56.   let uri: string | undefined = itemInfo.uri;
    57.   if (type === ItemType.CAMERA) {   // 点击相机item
    58.     console.info('onCameraClick');
    59.     if (this.isBlock) {
    60.       return false;
    61.     }
    62.     // 返回true则拉起系统相机,若应用需要自行处理则返回false。
    63.     return true;
    64.   } else if (type === ItemType.THUMBNAIL) {  //点击图片、视频item(缩略图item)
    65.     if (clickType === ClickType.SELECTED) {  //选中
    66.       if (this.isBlock) {
    67.         return false;
    68.       }
    69.       // 将uri保存起来,并保证切换不同的宫格页组件时保持选中项一致
    70.       if (uri) {
    71.         this.selectedUris.push(uri)
    72.         this.pickerOptions.preselectedUris = [...this.selectedUris];
    73.         this.pickerOptions1.preselectedUris = [...this.selectedUris];
    74.         this.pickerOptions2.preselectedUris = [...this.selectedUris];
    75.       }
    76.     } else {    //反选
    77.       if (uri) {
    78.         // 排除反勾选uri,并保证切换不同的宫格页组件时保持选中项一致
    79.         this.selectedUris = this.selectedUris.filter((item: string) => {
    80.           return item !== uri;
    81.         })
    82.         this.pickerOptions.preselectedUris = [...this.selectedUris];
    83.         this.pickerOptions1.preselectedUris = [...this.selectedUris];
    84.         this.pickerOptions2.preselectedUris = [...this.selectedUris];
    85.       }
    86.     }
    87.   } else {
    88.   }
    89.   console.info('onItemClicked' + JSON.stringify(itemInfo));
    90.   return true;
    91. }
    复制代码

  • 创建PhotoPickerComponent组件。
    1. build() {
    2.   PhotoPickerComponent({
    3.     // 设置组件选择选项实例
    4.     pickerOptions: this.pickerOptions,
    5.     // 资源被选中回调,返回url信息(返回的uri权限是只读权限)
    6.     onSelect: (uri: string): void => this.onSelect(uri),
    7.     // 资源被反选回调,返回url信息(返回的uri权限是只读权限)
    8.     onDeselect: (uri: string): void => this.onDeselect(uri),
    9.     /**
    10.      * 资源被选中回调,返回资源的信息,以及选中方式
    11.      * ItemInfo(itemType, uri, mimeType, width, height, size, duration)
    12.      * ClickType(SELECTED:勾选, DESELECTED: 反选)
    13.      * return 返回值为true时才会给url授权(返回的uri权限是只读权限)
    14.      */
    15.     onItemClicked: (itemInfo: ItemInfo, clickType: ClickType): boolean => this.onItemClicked(itemInfo, clickType),
    16.     /**
    17.      * 进入大图页回调,
    18.      * PhotoBrowserInfo (animatorParams: 动效)
    19.      */
    20.     onEnterPhotoBrowser: (photoBrowserInfo: PhotoBrowserInfo): boolean => this.onEnterPhotoBrowser(photoBrowserInfo),
    21.     /**
    22.      * 退出大图页回调,
    23.      * PhotoBrowserInfo (animatorParams: 动效)
    24.      */
    25.     onExitPhotoBrowser: (photoBrowserInfo: PhotoBrowserInfo): boolean => this.onExitPhotoBrowser(photoBrowserInfo),
    26.     /**
    27.      * 切换大图页内容回调事件,
    28.      * PhotoBrowserInfo (animatorParams: 动效)
    29.      */
    30.     onPhotoBrowserChanged: (photoBrowserItemInfo: BaseItemInfo): boolean => this.onPhotoBrowserChanged(photoBrowserItemInfo),
    31.     // 接收到该回调后,便可通过pickerController相关接口向picker发送数据,在此之前不生效。
    32.     onPickerControllerReady: (): void => this.onPickerControllerReady(),
    33.     // picker控制实例,应用可通过PickerController向picker组件发送数据,实现控制PhotoPickerComponent组件行为
    34.     pickerController: this.pickerController,
    35.   })
    36. }
    复制代码
  • 通过PickerController向Picker组件发送数据,实现控制PhotoPickerComponent组件活动。 存在多种用法。
使用PickerController



  • 用法1:通过相册URI,设置PhotoPickerComponent组件宫格页展示的相册的图片。
    1. private onAlbumClick(albumInfo: AlbumInfo): boolean {
    2.     this.isShowAlbum = false;
    3.     console.info('onAlbumClick' + JSON.stringify(albumInfo?.uri));
    4.     if (albumInfo?.uri) {
    5.       this.pickerController.setData(DataType.SET_ALBUM_URI, albumInfo.uri);
    6.       console.info('onAlbumClick' + JSON.stringify(albumInfo.uri));
    7.     }
    8.     return true;
    9.   }
    10. }
    复制代码
  • 用法2:设置PhotoPickerComponent组件宫格页选中的图片。
    1. this.pickerController.setData(DataType.SET_SELECTED_URIS, this.selectedUris);
    复制代码
  • 用法3:设置PhotoPickerComponent组件宫格页最大选择(总数/图片/视频)的数量。此处使用一个Button组件方便验证,开发者可根据现实诉求实现。
    1. Button("设置选择数量").width('50%').height('5%').onClick(() => {
    2.     let maxSelect: MaxSelected = new MaxSelected();
    3.     maxSelect.data = new Map<MaxCountType, number>([[MaxCountType.TOTAL_MAX_COUNT, 10], [MaxCountType.PHOTO_MAX_COUNT, 5], [MaxCountType.VIDEO_MAX_COUNT, 5]]);
    4.     this.pickerController.setMaxSelected(maxSelect);
    5. })
    复制代码
  • 用法4:设置PhotoPickerComponent组件大图页显示的图片。uri可通过OnItemClicked回调获取。
  1. Image(uri).height('10%').width('20%').backgroundColor(this.allBackGroundColor).onClick(() => {
  2.     console.log('uri = ' + uri);
  3.     this.pickerController.setPhotoBrowserItem(uri, PhotoBrowserRange.ALL);
  4. })
复制代码



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

拉不拉稀肚拉稀

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表