一、前言

用户有时需要分享图片、视频等用户文件,开发者可以通过特定接口拉起系统图库,用户自行选择待分享的资源,然后最终完成分享。此接口本身无需申请权限,目前适用于界面UIAbility,使用窗口组件触发。

1.1 示例

效果图

选择图片页面

在这里插入图片描述

返回的uris

在这里插入图片描述

代码

import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { fileIo } from '@kit.CoreFileKit';
import { BusinessError } from '@kit.BasicServicesKit';


function photoSelect() {
  // 创建图片-音频类型文件选择选项实例。
  const photoSelectOptions = new photoAccessHelper.PhotoSelectOptions();

  //配置可选的媒体文件类型和媒体文件的最大数目。
  photoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE; // 过滤选择媒体文件类型为IMAGE。
  photoSelectOptions.maxSelectNumber = 5; // 选择媒体文件的最大数目。

  // 创建图库选择器实例,调用PhotoViewPicker.select接口拉起图库界面进行文件选择。文件选择成功后,返回PhotoSelectResult结果集
  let uris: Array<string> = [];
  const photoViewPicker = new photoAccessHelper.PhotoViewPicker();
  photoViewPicker.select(photoSelectOptions).then((photoSelectResult: photoAccessHelper.PhotoSelectResult) => {
    uris = photoSelectResult.photoUris;
    console.info('photoViewPicker.select to file succeed and uris are:' + uris);
  }).catch((err: BusinessError) => {
    console.error(`Invoke photoViewPicker.select failed, code is ${err.code}, message is ${err.message}`);
  })

}

select返回的uri权限是只读权限,可以根据结果集中uri进行读取文件数据操作。注意不能在picker的回调里直接使用此uri进行打开文件操作,需要定义一个全局变量保存uri,类似使用一个按钮去触发打开文件。可参考指定URI读取文件数据。

也可以通过返回的uri获取图片或视频资源。

如有获取元数据需求,可以通过文件管理接口和文件URI根据uri获取部分文件属性信息,比如文件大小、访问时间、修改时间、文件名、文件路径等。

二、指定URI读取文件数据

示例效果图

在这里插入图片描述

示例代码


import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { fileIo } from '@kit.CoreFileKit';
import { BusinessError } from '@kit.BasicServicesKit';


function testURIgetFileData() {
  // 1 待界面从图库返回后,再通过一个类似按钮的组件去调用其他函数,使用fileIo.openSync接口,通过媒体文件uri打开这个文件得到fd。这里需要注意接口权限参数是fileIo.OpenMode.READ_ONLY。
  let uri: string = 'file://media/Photo/8/IMG_1742976310_006/screenshot_20250326_160329.jpg';
  let file = fileIo.openSync(uri, fileIo.OpenMode.READ_ONLY);
  console.info('file fd: ' + file.fd);

  // 2. 通过fd使用fileIo.readSync接口读取这个文件内的数据,读取完成后关闭fd。
  let buffer = new ArrayBuffer(4096);
  let readLen = fileIo.readSync(file.fd, buffer);
  console.info('readSync data to file succeed and buffer size is:' + readLen);
  fileIo.closeSync(file);
}

三、指定URI获取图片或视频资源

媒体库支持Picker选择媒体文件URI后,根据指定URI获取图片或视频资源,下面以查询指定URI为’file://media/Photo/8/IMG_1742976310_006/screenshot_20250326_160329.jpg’为例。

示例效果图

在这里插入图片描述

示例代码

import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { dataSharePredicates } from '@kit.ArkData';


const context = getContext(this);
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);

class MediaDataHandler implements photoAccessHelper.MediaAssetDataHandler<ArrayBuffer> {
  onDataPrepared(data: ArrayBuffer) {
    if (data === undefined) {
      console.error('Error occurred when preparing data');
      return;
    }
    console.info('on image data prepared');
    // 应用自定义对资源数据的处理逻辑。
  }
}

/**
 * 指定URI获取图片或视频资源
 * 媒体库支持Picker选择媒体文件URI后,根据指定URI获取图片或视频资源,下面以查询指定URI
 */
async function testRequestImageData() {
  let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
  let uri: string = 'file://media/Photo/8/IMG_1742976310_006/screenshot_20250326_160329.jpg';// 需保证此uri已存在
  predicates.equalTo(photoAccessHelper.PhotoKeys.URI, uri.toString());
  let fetchOptions: photoAccessHelper.FetchOptions = {
    fetchColumns: [photoAccessHelper.PhotoKeys.TITLE],
    predicates: predicates
  };

  try {
    let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await phAccessHelper.getAssets(fetchOptions);
    let photoAsset: photoAccessHelper.PhotoAsset = await fetchResult.getFirstObject();
    console.info('getAssets photoAsset.uri : ' + photoAsset.uri);
    // 获取属性值,以标题为例;对于非默认查询的属性,get前需要在fetchColumns中添加对应列名。
    console.info('图片 title : ' + photoAsset.get(photoAccessHelper.PhotoKeys.TITLE));
    // 请求图片资源数据。
    let requestOptions: photoAccessHelper.RequestOptions = {
      deliveryMode: photoAccessHelper.DeliveryMode.HIGH_QUALITY_MODE,
    }
    await photoAccessHelper.MediaAssetManager.requestImageData(context, photoAsset, requestOptions, new MediaDataHandler());
    console.info('requestImageData successfully');
    fetchResult.close();
  } catch (err) {
    console.error('getAssets failed with err: ' + err);
  }
}
Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐