ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

HarmonyOS:使用Picker选择媒体库资源

HarmonyOS:使用Picker选择媒体库资源 一、前言用户有时需要分享图片、视频等用户文件开发者可以通过特定接口拉起系统图库用户自行选择待分享的资源然后最终完成分享。此接口本身无需申请权限目前适用于界面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: Arraystring []; 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.MediaAssetDataHandlerArrayBuffer { 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.FetchResultphotoAccessHelper.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); } }
返回列表