【鸿蒙开发】第二十二章 Media Library媒体文件管理服务

25 篇文章 4 订阅
25 篇文章 2 订阅

1 简介

Media Library Kit(媒体文件管理服务)提供了管理相册和媒体文件的能力,包括照片视频,帮助你的应用快速构建图片视频展示和播放能力。

通过Media Library Kit, 开发者可以管理相册和媒体文件,包括创建相册以及访问、修改相册中的媒体信息等,其中对三方应用开放的能力有:

  1. 媒体资源(图片、视频)相关
    获取指定媒体资源
    获取图片和视频缩略图
    创建媒体资源(安全控件)
    重命名媒体资源

  2. 用户相册相关
    获取用户相册
    重命名用户相册
    添加图片和视频到用户相册中
    获取用户相册中的图片和视频
    从用户相册中移除图片和视频

  3. 系统相册相关
    收藏夹
    视频相册
    媒体资源(图片、视频和相册)变更通知相关,包括:
    注册对指定URI的监听
    取消指定URI的监听

  4. 媒体资源增删操作(系统应用)
    创建媒体资源
    将媒体资源放入回收站
    永久删除媒体资源

  5. 相册相关操作(系统应用)
    创建用户相册
    删除用户相册
    隐藏相册
    设置收藏和取消收藏
    使用截屏和录屏相册

应用需要先获取相册管理模块实例,才能访问和修改相册中的媒体数据信息。相册管理模块涉及用户个人数据信息,所以应用需要向用户申请相册管理模块读写操作权限才能保证功能的正常运行。在使用相册管理模块相关接口时如无其他注明则默认在工程代码的pages/index.ets或者其他自创的ets文件中使用。

1.1 获取相册管理模块实例

应用需要使用应用上下文Context通过接口getPhotoAccessHelper,获取相册管理模块实例,用于访问和修改相册中媒体数据信息(如图片、视频)。

  • 开发步骤
  1. 导入photoAccessHelper模块以使用相册管理模块相关接口。
  2. 通过getContext获取应用上下文。
  3. 获取相册管理模块实例。
import photoAccessHelper from '@ohos.file.photoAccessHelper';

// 此处获取的photoAccessHelper实例为全局对象,后续文档中使用到的地方默认为使用此处获取的对象,如未添加此段代码报未定义的错误请自行添加。
const context = getContext(this);
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);

1.2 申请相册管理模块功能相关权限

相册管理模块的读写操作需要相应权限,在申请权限前,请保证符合权限使用的基本原则。涉及的权限如下表。

权限名说明授权方式
ohos.permission.READ_IMAGEVIDEO允许应用读取媒体库的图片和视频媒体文件信息。user_grant
ohos.permission.WRITE_IMAGEVIDEO允许应用读写媒体库的图片和视频媒体文件信息。user_grant

以上权限的授权方式均为user_grant(用户授权),即开发者在module.json5文件中配置对应的权限后,需要使用接口abilityAccessCtrl.requestPermissionsFromUser去校验当前用户是否已授权。如果是,应用可以直接访问/操作目标对象;否则需要弹框向用户申请授权。

  • 开发步骤
  1. 在配置文件module.json5中声明权限。
  2. 向用户申请授权。

说明:即使用户曾经授予权限,应用在调用受此权限保护的接口前,也应该先检查是否有权限。不能把之前授予的状态持久化,因为用户在动态授予后还可以通过“设置”取消应用的权限。

2 媒体资源使用

应用可以通过photoAccessHelper的接口,对媒体资源(图片、视频)进行相关操作。

说明:
1.申请相册管理模块功能开发相关权限
2.导入photoAccessHelper模块
3.大部分photoAccessHelper的接口调用都是异步的,异步调用的API示例均采用Promise函数

2.1 获取指定媒体资源

可以根据特定的条件查询媒体资源,如指定类型、指定日期、指定相册等。

应用通过调用PhotoAccessHelper.getAssets获取媒体资源,并传入FetchOptions对象指定检索条件。如无特别说明,文档中涉及的待获取的资源均视为已经预置且在数据库中存在相应数据。如出现按照示例代码执行出现获取资源为空的情况请确认文件是否已预置,数据库中是否存在该文件的数据。

如果只想获取某个位置的对象(如第一个、最后一个、指定索引等),可以通过FetchResult中的接口获取对应位置的媒体资源对象。

前提条件

  1. 获取相册管理模块photoAccessHelper实例。
  2. 申请相册管理模块读权限’ohos.permission.READ_IMAGEVIDEO’
  3. 导入dataSharePredicates模块。

2.1.1 指定媒体文件名/指定URI 获取图片或视频资源

import dataSharePredicates from '@ohos.data.dataSharePredicates';
import photoAccessHelper from '@ohos.file.photoAccessHelper';
const context = getContext(this);
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);

async function example() {
  let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
  // 1. 通过文件名获取
  predicates.equalTo(photoAccessHelper.PhotoKeys.DISPLAY_NAME, 'test.jpg');
  
  // 2.通过URI获取
  // let uri = 'file://media/Photo/1/IMG_datetime_0001/displayName.jpg' // 需保证此uri已存在。
  // predicates.equalTo(photoAccessHelper.PhotoKeys.URI, uri.toString());
  let fetchOptions: photoAccessHelper.FetchOptions = {
    fetchColumns: [],
    predicates: predicates
  };
  try {
    let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await phAccessHelper.getAssets(fetchOptions);
    let photoAsset: photoAccessHelper.PhotoAsset = await fetchResult.getFirstObject();
    console.info('getAssets photoAsset.displayName : ' + photoAsset.displayName);
    // console.info('getAssets photoAsset.uri : ' + photoAsset.uri);
    fetchResult.close();
  } catch (err) {
    console.error('getAssets failed with err: ' + err);
  }
}

2.2 获取图片和视频缩略图

通过接口PhotoAsset.getThumbnail,传入缩略图尺寸,可以获取图片和视频缩略图。缩略图常用于UI界面展示。

  • 前提条件
  1. 获取相册管理模块photoAccessHelper实例。
  2. 申请相册管理模块读权限’ohos.permission.READ_IMAGEVIDEO’。
  3. 导入dataSharePredicates模块。

当需要在相册展示图片和视频、编辑预览,应用需要获取某张图片的缩略图。

参考以下示例,获取图片的文件描述符fd后,需要解码为统一的PixelMap,方便在应用中进行图片显示或图片处理,具体请参考图片解码。

下面以获取一张图片的缩略图为例,缩略图尺寸为720*720。

  • 开发步骤
  1. 建立检索条件,用于获取图片资源。
  2. 调用PhotoAccessHelper.getAssets接口获取图片资源。
  3. 调用FetchResult.getFirstObject接口获取第一张图片。
  4. 调用PhotoAsset.getThumbnail获取图片的缩略图的PixelMap
import dataSharePredicates from '@ohos.data.dataSharePredicates';
import image from '@ohos.multimedia.image';
import photoAccessHelper from '@ohos.file.photoAccessHelper';
const context = getContext(this);
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);

async function example() {
  let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
  let fetchOptions: photoAccessHelper.FetchOptions = {
    fetchColumns: [],
    predicates: predicates
  };

  try {
    let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await phAccessHelper.getAssets(fetchOptions);
    let photoAsset: photoAccessHelper.PhotoAsset = await fetchResult.getFirstObject();
    console.info('getAssets photoAsset.displayName : ' + photoAsset.displayName);
    let size: image.Size = { width: 720, height: 720 };
    let pixelMap: image.PixelMap =  await photoAsset.getThumbnail(size);
    let imageInfo: image.ImageInfo = await pixelMap.getImageInfo()
    console.info('getThumbnail successful, pixelMap ImageInfo size: ' + JSON.stringify(imageInfo.size));
    fetchResult.close();
  } catch (err) {
    console.error('getThumbnail failed with err: ' + err);
  }
}

2.3 创建媒体资源

创建MediaAssetChangeRequest媒体资产变更对象并写入媒体资源内容,然后调用PhotoAccessHelper.applyChanges接口提交创建资产的变更请求。

  • 前提条件
  1. 获取相册管理模块photoAccessHelper实例。
  2. 申请相册管理模块读权限’ohos.permission.WRITE_IMAGEVIDEO’

2.3.1 创建图片或视频资源(仅向系统应用开放)

  • 开发步骤
  1. 定义文件名和创建选项,用于创建图片资源时设置属性。
  2. 调用MediaAssetChangeRequest.createAssetRequest接口创建资产变更请求。
  3. 调用MediaAssetChangeRequest.getWriteCacheHandler接口获取临时文件写句柄,并写入图片资源的内容。
  4. 调用PhotoAccessHelper.applyChanges接口提交资产变更请求。
import photoAccessHelper from '@ohos.file.photoAccessHelper';
import fs from '@ohos.file.fs';
let context = getContext(this);
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);

async function example() {
  try {
    let displayName: string = 'testPhoto' + Date.now() + '.jpg';
    let createOption: photoAccessHelper.PhotoCreateOptions = {
      subtype: photoAccessHelper.PhotoSubtype.DEFAULT
    };
    let assetChangeRequest: photoAccessHelper.MediaAssetChangeRequest = photoAccessHelper.MediaAssetChangeRequest.createAssetRequest(context, displayName, createOption);
    let fd: number = await assetChangeRequest.getWriteCacheHandler();
    // write date into fd
    await fs.close(fd);
    await phAccessHelper.applyChanges(assetChangeRequest);
  } catch (err) {
    console.error(`create asset failed with error: ${err.code}, ${err.message}`);
  }
}

应用还可以调用MediaAssetChangeRequest.addResource接口指定媒体资源内容的数据来源,具体包括应用沙箱,ArrayBufferPhotoProxy

2.4 使用安全控件创建媒体资源

下面以使用安全控件创建一张图片资源为例。使用安全控件创建媒体资源无需在应用中申请相册管理模块权限’ohos.permission.WRITE_IMAGEVIDEO’

  • 开发步骤
  1. 设置安全控件按钮属性。
  2. 创建安全控件按钮。
  3. 调用MediaAssetChangeRequest.createImageAssetRequestPhotoAccessHelper.applyChanges接口创建图片资源。
import photoAccessHelper from '@ohos.file.photoAccessHelper'

@Entry
@Component
struct Index {
  @State message: string = 'Hello World'
  @State saveButtonOptions: SaveButtonOptions = {
    icon: SaveIconStyle.FULL_FILLED,
    text: SaveDescription.SAVE_IMAGE,
    buttonType: ButtonType.Capsule
  } // 设置安全控件按钮属性

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
        SaveButton(this.saveButtonOptions) // 创建安全控件按钮
          .onClick(async (event, result: SaveButtonOnClickResult) => {
             if (result == SaveButtonOnClickResult.SUCCESS) {
               try {
                 let context = getContext();
                 let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);
                 // 需要确保fileUri对应的资源存在
                 let fileUri = 'file://com.example.temptest/data/storage/el2/base/haps/entry/files/test.jpg';
                 let assetChangeRequest: photoAccessHelper.MediaAssetChangeRequest = photoAccessHelper.MediaAssetChangeRequest.createImageAssetRequest(context, fileUri);
                 await phAccessHelper.applyChanges(assetChangeRequest);
                 console.info('createAsset successfully, uri: ' + assetChangeRequest.getAsset().uri);
               } catch (err) {
                 console.error(`create asset failed with error: ${err.code}, ${err.message}`);
               }
             } else {
               console.error('SaveButtonOnClickResult create asset failed');
             }
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}

2.5 重命名媒体资源

重命名修改的是文件的PhotoAsset.displayName属性,即文件的显示文件名,包含文件后缀。

调用MediaAssetChangeRequest.setTitle重命名后再通过PhotoAccessHelper.applyChanges更新到数据库中完成修改。

在重命名文件之前,需要先获取文件对象,可以通过FetchResult中的接口获取对应位置的文件。

  • 前提条件
  1. 获取相册管理模块photoAccessHelper实例。
  2. 申请相册管理模块权限’ohos.permission.WRITE_IMAGEVIDEO’’ohos.permission.READ_IMAGEVIDEO’
  • 开发步骤
  1. 建立检索条件,用于获取图片资源。
  2. 调用PhotoAccessHelper.getAssets接口获取目标图片资源。
  3. 调用FetchResult.getFirstObject接口获取第一张图片,即要重命名的图片对象。
  4. 调用MediaAssetChangeRequest.setTitle接口将图片重命名为新的名字。
  5. 调用PhotoAccessHelper.applyChanges接口将修改的图片属性更新到数据库中完成修改。
import dataSharePredicates from '@ohos.data.dataSharePredicates';
import photoAccessHelper from '@ohos.file.photoAccessHelper';
let context = getContext(this);
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);

async function example() {
  let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
  let fetchOptions: photoAccessHelper.FetchOptions = {
    fetchColumns: ['title'],
    predicates: predicates
  };
  let newTitle: string = 'newTestPhoto';

  try {
    let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await phAccessHelper.getAssets(fetchOptions);
    let photoAsset: photoAccessHelper.PhotoAsset = await fetchResult.getFirstObject();
    let assetChangeRequest: photoAccessHelper.MediaAssetChangeRequest = new photoAccessHelper.MediaAssetChangeRequest(photoAsset);
    assetChangeRequest.setTitle(newTitle);
    await phAccessHelper.applyChanges(assetChangeRequest);
    fetchResult.close();
  } catch (err) {
    console.error(`rename failed with error: ${err.code}, ${err.message}`);
  }
}

2.6 将文件放入回收站

通过MediaAssetChangeRequest.deleteAssets可以将文件放入回收站。

放入回收站的文件将会保存30天,30天后会自动彻底删除。在此期间,应用用户可以通过系统应用“文件管理”或“图库”恢复文件。

  • 前提条件
  1. 获取相册管理模块photoAccessHelper实例。
  2. 申请相册管理模块权限’ohos.permission.WRITE_IMAGEVIDEO’’ohos.permission.READ_IMAGEVIDEO’
  • 开发步骤
  1. 建立检索条件,用于获取图片资源。
  2. 调用PhotoAccessHelper.getAssets接口获取目标图片资源。
  3. 调用FetchResult.getFirstObject接口获取第一张图片,即要放入回收站的图片对象。
  4. 在这里插入代码片. 调用MediaAssetChangeRequest.deleteAssets接口将文件放入回收站。
import dataSharePredicates from '@ohos.data.dataSharePredicates';
import photoAccessHelper from '@ohos.file.photoAccessHelper';
let context = getContext(this);
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);

async function example() {
  let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
  let fetchOptions: photoAccessHelper.FetchOptions = {
    fetchColumns: [],
    predicates: predicates
  };

  try {
    let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await phAccessHelper.getAssets(fetchOptions);
    let photoAsset: photoAccessHelper.PhotoAsset = await fetchResult.getFirstObject();
    await photoAccessHelper.MediaAssetChangeRequest.deleteAssets(context, [photoAsset]);
    fetchResult.close();
  } catch (err) {
    console.error(`deleteAssets failed with error: ${err.code}, ${err.message}`);
  }
}

2.7 使用Picker选择媒体库资源

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

// 1. 导入选择器模块和文件管理模块。
import photoAccessHelper from '@ohos.file.photoAccessHelper';
import fs from '@ohos.file.fs';
import { BusinessError } from '@ohos.base';

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

// 3. 选择媒体文件类型和选择媒体文件的最大数目。 以下示例以图片选择为例,媒体文件类型请参见PhotoViewMIMETypes。
photoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE; // 过滤选择媒体文件类型为IMAGE
photoSelectOptions.maxSelectNumber = 5; // 选择媒体文件的最大数目

// 4. 创建图库选择器实例,调用PhotoViewPicker.select接口拉起图库界面进行文件选择。文件选择成功后,返回PhotoSelectResult结果集。
// select返回的uri权限是只读权限,可以根据结果集中uri进行读取文件数据操作。注意不能在picker的回调里直接使用此uri进行打开文件操作,需要定义一个全局变量保存uri,使用类似一个按钮去触发打开文件。
// 如有获取元数据需求,可以通过文件管理接口和文件URI根据uri获取部分文件属性信息,比如文件大小、访问时间、修改时间、文件名、文件路径等。

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}`);
})


// 5. 待界面从图库返回后,再通过类似一个按钮调用其他函数,使用fs.openSync接口,通过uri打开这个文件得到fd。这里需要注意接口权限参数是fs.OpenMode.READ_ONLY。
let uri: string = '';
let file = fs.openSync(uri, fs.OpenMode.READ_ONLY);
console.info('file fd: ' + file.fd);

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

3 用户相册资源使用

开发前的准备跟媒体资源使用一样,photoAccessHelper提供用户相册相关的接口,供开发者创建、删除用户相册,往用户相册中添加和删除图片和视频资源等。

3.1 创建用户相册(仅向系统应用开放)

通过MediaAlbumChangeRequest.createAlbumRequestPhotoAccessHelper.applyChanges接口创建用户相册。

待创建的相册名参数规格为:

  • 相册名字符串长度为1~255。
  • 不允许出现的非法英文字符,包括:. \ / : * ? " ’ ` < > | { } [ ]
  • 英文字符大小写不敏感。
  • 相册名不允许重名。

前提条件

  1. 获取相册管理模块photoAccessHelper实例。
  2. 申请相册管理模块权限’ohos.permission.WRITE_IMAGEVIDEO’

开发步骤

  1. 设置相册名。
  2. 调用MediaAlbumChangeRequest.createAlbumRequest接口创建相册变更请求。
  3. 调用PhotoAccessHelper.applyChanges接口提交相册变更请求。
import photoAccessHelper from '@ohos.file.photoAccessHelper';
const context = getContext(this);
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);

async function example() {
  try {
    let albumName = 'albumName';
    let albumChangeRequest: photoAccessHelper.MediaAlbumChangeRequest = photoAccessHelper.MediaAlbumChangeRequest.createAlbumRequest(context, albumName);
    await phAccessHelper.applyChanges(albumChangeRequest);
    let album: photoAccessHelper.Album = albumChangeRequest.getAlbum();
    console.info('create album successfully, album name: ' + album.albumName + ' uri: ' + album.albumUri);
  } catch (err) {
    console.error('create album failed with err: ' + err);
  }
}

3.2 获取用户相册

通过PhotoAccessHelper.getAlbums接口获取用户相册。

  • 前提条件
  1. 获取相册管理模块photoAccessHelper实例。
  2. 申请相册管理模块权限’ohos.permission.READ_IMAGEVIDEO’
  • 开发步骤
  1. 建立检索条件,用于获取用户相册。
  2. 调用PhotoAccessHelper.getAlbums接口获取用户相册资源。
  3. 调用FetchResult.getFirstObject接口获取第一个用户相册。
import dataSharePredicates from '@ohos.data.dataSharePredicates';
import photoAccessHelper from '@ohos.file.photoAccessHelper';
const context = getContext(this);
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);

async function example() {
  let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
  let albumName: photoAccessHelper.AlbumKeys = photoAccessHelper.AlbumKeys.ALBUM_NAME;
  predicates.equalTo(albumName, 'albumName');
  let fetchOptions: photoAccessHelper.FetchOptions = {
    fetchColumns: [],
    predicates: predicates
  };

  try {
    let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.Album> = await phAccessHelper.getAlbums(photoAccessHelper.AlbumType.USER, photoAccessHelper.AlbumSubtype.USER_GENERIC, fetchOptions);
    let album: photoAccessHelper.Album = await fetchResult.getFirstObject();
    console.info('getAlbums successfully, albumName: ' + album.albumName);
    fetchResult.close();
  } catch (err) {
    console.error('getAlbums failed with err: ' + err);
  }
}

3.3 重命名用户相册

重命名用户相册修改的是相册的Album.albumName属性。

调用MediaAlbumChangeRequest.setAlbumName重命名用户相册后再通过PhotoAccessHelper.applyChanges更新到数据库中完成修改。

在重命名用户相册之前,需要先获取相册对象,可以通过FetchResult中的接口获取对应位置的用户相册。

重命名的相册名参数规格为:

相册名字符串长度为1~255。
不允许出现的非法英文字符,包括:
. \ / : * ? " ’ ` < > | { } [ ]
英文字符大小写不敏感。
相册名不允许重名。
前提条件

获取相册管理模块photoAccessHelper实例。
申请相册管理模块权限’ohos.permission.READ_IMAGEVIDEO’和’ohos.permission.WRITE_IMAGEVIDEO’。
下面以将一个相册名为’albumName’的用户相册重命名为例。

开发步骤

建立检索条件,用于获取用户相册。
调用PhotoAccessHelper.getAlbums接口获取用户相册资源。
调用FetchResult.getFirstObject接口获取第一个用户相册。
调用MediaAlbumChangeRequest.setAlbumName接口设置新的相册名。
调用PhotoAccessHelper.applyChanges接口将修改的相册属性更新到数据中完成修改。

import dataSharePredicates from '@ohos.data.dataSharePredicates';
import photoAccessHelper from '@ohos.file.photoAccessHelper';
const context = getContext(this);
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);

async function example() {
  let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
  let albumName: photoAccessHelper.AlbumKeys = photoAccessHelper.AlbumKeys.ALBUM_NAME;
  predicates.equalTo(albumName, 'albumName');
  let fetchOptions: photoAccessHelper.FetchOptions = {
    fetchColumns: [],
    predicates: predicates
  };

  try {
    let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.Album> = await phAccessHelper.getAlbums(photoAccessHelper.AlbumType.USER, photoAccessHelper.AlbumSubtype.USER_GENERIC, fetchOptions);
    let album: photoAccessHelper.Album = await fetchResult.getFirstObject();
    console.info('getAlbums successfully, albumName: ' + album.albumName);
    let albumChangeRequest: photoAccessHelper.MediaAlbumChangeRequest = new photoAccessHelper.MediaAlbumChangeRequest(album);
    let newAlbumName: string = 'newAlbumName';
    albumChangeRequest.setAlbumName(newAlbumName);
    await phAccessHelper.applyChanges(albumChangeRequest);
    console.info('setAlbumName successfully, new albumName: ' + album.albumName);
    fetchResult.close();
  } catch (err) {
    console.error('setAlbumName failed with err: ' + err);
  }
}

3.4 添加图片和视频到用户相册中

先获取用户相册对象和需要添加到相册中的图片或视频的对象数组,然后调用MediaAlbumChangeRequest.addAssetsPhotoAccessHelper.applyChanges接口往用户相册中添加图片或视频。

  • 前提条件
  1. 获取相册管理模块photoAccessHelper实例。
  2. 申请相册管理模块权限’ohos.permission.READ_IMAGEVIDEO’’ohos.permission.WRITE_IMAGEVIDEO’
  • 开发步骤
  1. 建立相册检索条件,用于获取用户相册。
  2. 建立图片检索条件,用于获取图片。
  3. 调用PhotoAccessHelper.getAlbums接口获取用户相册资源。
  4. 调用FetchResult.getFirstObject接口获取第一个用户相册。
  5. 调用PhotoAccessHelper.getAssets接口获取图片资源。
  6. 调用FetchResult.getFirstObject接口获取第一张图片。
  7. 调用MediaAlbumChangeRequest.addAssets接口往用户相册中添加图片。
  8. 调用PhotoAccessHelper.applyChanges接口提交相册变更请求。
import dataSharePredicates from '@ohos.data.dataSharePredicates';
import photoAccessHelper from '@ohos.file.photoAccessHelper';
const context = getContext(this);
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);

async function example() {
  let albumPredicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
  let albumName: photoAccessHelper.AlbumKeys = photoAccessHelper.AlbumKeys.ALBUM_NAME;
  albumPredicates.equalTo(albumName, 'albumName');
  let albumFetchOptions: photoAccessHelper.FetchOptions = {
    fetchColumns: [],
    predicates: albumPredicates
  };

  let photoPredicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
  let photoFetchOptions: photoAccessHelper.FetchOptions = {
    fetchColumns: [],
    predicates: photoPredicates
  };

  try {
    let albumFetchResult: photoAccessHelper.FetchResult<photoAccessHelper.Album> = await phAccessHelper.getAlbums(photoAccessHelper.AlbumType.USER, photoAccessHelper.AlbumSubtype.USER_GENERIC, albumFetchOptions);
    let album: photoAccessHelper.Album = await albumFetchResult.getFirstObject();
    console.info('getAlbums successfully, albumName: ' + album.albumName);
    let photoFetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await phAccessHelper.getAssets(photoFetchOptions);
    let photoAsset: photoAccessHelper.PhotoAsset = await photoFetchResult.getFirstObject();
    console.info('getAssets successfully, albumName: ' + photoAsset.displayName);
    let albumChangeRequest: photoAccessHelper.MediaAlbumChangeRequest = new photoAccessHelper.MediaAlbumChangeRequest(album);
    albumChangeRequest.addAssets([photoAsset]);
    await phAccessHelper.applyChanges(albumChangeRequest);
    console.info('succeed to add ' + photoAsset.displayName + ' to ' + album.albumName);
    albumFetchResult.close();
    photoFetchResult.close();
  } catch (err) {
    console.error('addAssets failed with err: ' + err);
  }
}

3.5 获取用户相册中的图片和视频

先获取用户相册对象,然后调用Album.getAssets接口获取用户相册中的图片资源。

  • 前提条件
  1. 获取相册管理模块photoAccessHelper实例。
  2. 申请相册管理模块权限’ohos.permission.READ_IMAGEVIDEO’’ohos.permission.WRITE_IMAGEVIDEO’
  • 开发步骤
  1. 建立相册检索条件,用于获取用户相册。
  2. 建立图片检索条件,用于获取图片。
  3. 调用PhotoAccessHelper.getAlbums接口获取用户相册资源。
  4. 调用FetchResult.getFirstObject接口获取第一个用户相册。
  5. 调用Album.getAssets接口获取用户相册中的图片资源。
  6. 调用FetchResult.getFirstObject接口获取第一张图片。
import dataSharePredicates from '@ohos.data.dataSharePredicates';
import photoAccessHelper from '@ohos.file.photoAccessHelper';
const context = getContext(this);
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);

async function example() {
  let albumPredicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
  let albumName: photoAccessHelper.AlbumKeys = photoAccessHelper.AlbumKeys.ALBUM_NAME;
  albumPredicates.equalTo(albumName, 'albumName');
  let albumFetchOptions: photoAccessHelper.FetchOptions = {
    fetchColumns: [],
    predicates: albumPredicates
  };

  let photoPredicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
  let photoFetchOptions: photoAccessHelper.FetchOptions = {
    fetchColumns: [],
    predicates: photoPredicates
  };

  try {
    let albumFetchResult: photoAccessHelper.FetchResult<photoAccessHelper.Album> = await phAccessHelper.getAlbums(photoAccessHelper.AlbumType.USER, photoAccessHelper.AlbumSubtype.USER_GENERIC, albumFetchOptions);
    let album: photoAccessHelper.Album = await albumFetchResult.getFirstObject();
    console.info('getAlbums successfully, albumName: ' + album.albumName);
    let photoFetchResult = await album.getAssets(photoFetchOptions);
    let photoAsset = await photoFetchResult.getFirstObject();
    console.info('album getAssets successfully, albumName: ' + photoAsset.displayName);
    albumFetchResult.close();
    photoFetchResult.close();
  } catch (err) {
    console.error('album getAssets failed with err: ' + err);
  }
}

3.6 从用户相册中移除图片和视频

先获取用户相册对象,然后调用Album.getAssets接口获取用户相册中的资源。

选择其中要移除的资源,然后调用MediaAlbumChangeRequest.removeAssetsPhotoAccessHelper.applyChanges接口移除。

  • 前提条件
  1. 获取相册管理模块photoAccessHelper实例。
  2. 申请相册管理模块权限’ohos.permission.READ_IMAGEVIDEO’’ohos.permission.WRITE_IMAGEVIDEO’
  • 开发步骤
  1. 建立相册检索条件,用于获取用户相册。
  2. 建立图片检索条件,用于获取图片。
  3. 调用PhotoAccessHelper.getAlbums接口获取用户相册资源。
  4. 调用FetchResult.getFirstObject接口获取第一个用户相册。
  5. 调用Album.getAssets接口获取图片资源。
  6. 调用FetchResult.getFirstObject接口获取第一张图片。
  7. 调用MediaAlbumChangeRequest.removeAssets接口从用户相册中移除图片。
  8. 调用PhotoAccessHelper.applyChanges接口提交相册变更请求。
import dataSharePredicates from '@ohos.data.dataSharePredicates';
import photoAccessHelper from '@ohos.file.photoAccessHelper';
const context = getContext(this);
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);

async function example() {
  let albumPredicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
  let albumName: photoAccessHelper.AlbumKeys = photoAccessHelper.AlbumKeys.ALBUM_NAME;
  albumPredicates.equalTo(albumName, 'albumName');
  let albumFetchOptions: photoAccessHelper.FetchOptions = {
    fetchColumns: [],
    predicates: albumPredicates
  };

  let photoPredicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
  let photoFetchOptions: photoAccessHelper.FetchOptions = {
    fetchColumns: [],
    predicates: photoPredicates
  };

  try {
    let albumFetchResult: photoAccessHelper.FetchResult<photoAccessHelper.Album> = await phAccessHelper.getAlbums(photoAccessHelper.AlbumType.USER, photoAccessHelper.AlbumSubtype.USER_GENERIC, albumFetchOptions);
    let album: photoAccessHelper.Album = await albumFetchResult.getFirstObject();
    console.info('getAlbums successfully, albumName: ' + album.albumName);
    let photoFetchResult = await album.getAssets(photoFetchOptions);
    let photoAsset = await photoFetchResult.getFirstObject();
    console.info('album getAssets successfully, albumName: ' + photoAsset.displayName);
    let albumChangeRequest: photoAccessHelper.MediaAlbumChangeRequest = new photoAccessHelper.MediaAlbumChangeRequest(album);
    albumChangeRequest.removeAssets([photoAsset]);
    await phAccessHelper.applyChanges(albumChangeRequest);
    console.info('succeed to remove ' + photoAsset.displayName + ' from ' + album.albumName);
    albumFetchResult.close();
    photoFetchResult.close();
  } catch (err) {
    console.error('removeAssets failed with err: ' + err);
  }
}

3.7 删除用户相册(仅向系统应用开放)

先获取用户相册对象,然后调用MediaAlbumChangeRequest.deleteAlbums删除用户相册。

  • 前提条件
  1. 获取相册管理模块photoAccessHelper实例。
  2. 申请相册管理模块权限’ohos.permission.READ_IMAGEVIDEO’’ohos.permission.WRITE_IMAGEVIDEO’
  • 开发步骤
  1. 建立检索条件,用于获取用户相册。
  2. 调用PhotoAccessHelper.getAlbums接口获取用户相册资源。
  3. 调用FetchResult.getFirstObject接口获取第一个用户相册。
  4. 调用MediaAlbumChangeRequest.deleteAlbums接口删除第一个用户相册。
import dataSharePredicates from '@ohos.data.dataSharePredicates';
import photoAccessHelper from '@ohos.file.photoAccessHelper';
const context = getContext(this);
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);

async function example() {
  let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
  let albumName: photoAccessHelper.AlbumKeys = photoAccessHelper.AlbumKeys.ALBUM_NAME;
  predicates.equalTo(albumName, 'albumName');
  let fetchOptions: photoAccessHelper.FetchOptions = {
    fetchColumns: [],
    predicates: predicates
  };

  try {
    let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.Album> = await phAccessHelper.getAlbums(photoAccessHelper.AlbumType.USER, photoAccessHelper.AlbumSubtype.USER_GENERIC, fetchOptions);
    let album: photoAccessHelper.Album = await fetchResult.getFirstObject();
    console.info('getAlbums successfully, albumName: ' + album.albumName);
    await photoAccessHelper.MediaAlbumChangeRequest.deleteAlbums(context, [album]);
    fetchResult.close();
  } catch (err) {
    console.error('deleteAlbums failed with err: ' + err);
  }
}

4 系统相册资源使用

photoAccessHelper仅提供开发者对收藏夹、视频相册、截屏和录屏相册进行相关操作。

说明:
在进行功能开发前,请开发者查阅开发准备,了解如何获取相册管理模块实例和如何申请相册管理模块功能开发相关权限。 文档中使用到PhotoAccessHelper的地方默认为使用开发准备中获取的对象,如未添加此段代码报PhotoAccessHelper未定义的错误请自行添加。

为了保证应用的运行效率,大部分photoAccessHelper的接口调用都是异步的。以下异步调用的API示例均采用Promise函数,更多方式可以查阅API参考。 如无特别说明,文档中涉及的待获取的资源均视为已经预置且在数据库中存在相应数据。如出现按照示例代码执行出现获取资源为空的情况请确认文件是否已预置,数据库中是否存在该文件的数据。

4.1 收藏夹

收藏夹属于系统相册,对图片或视频设置收藏时会自动将其加入到收藏夹中,取消收藏则会从收藏夹中移除。

4.1.1 获取收藏夹对象

通过PhotoAccessHelper.getAlbums接口获取收藏夹对象。

  • 前提条件
  1. 获取相册管理模块photoAccessHelper实例。
  2. 申请相册管理模块权限’ohos.permission.READ_IMAGEVIDEO’
  • 开发步骤
  1. 设置获取收藏夹的参数为photoAccessHelper.AlbumType.SYSTEMphotoAccessHelper.AlbumSubtype.FAVORITE
  2. 调用PhotoAccessHelper.getAlbums接口获取收藏夹对象。
import photoAccessHelper from '@ohos.file.photoAccessHelper';
const context = getContext(this);
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);

async function example() {
  try {
    let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.Album> = await phAccessHelper.getAlbums(photoAccessHelper.AlbumType.SYSTEM, photoAccessHelper.AlbumSubtype.FAVORITE);
    let album: photoAccessHelper.Album = await fetchResult.getFirstObject();
    console.info('get favorite album successfully, albumUri: ' + album.albumUri);
    fetchResult.close();
  } catch (err) {
    console.error('get favorite album failed with err: ' + err);
  }
}

4.1.2 收藏图片和视频(仅向系统应用开放)

通过MediaAssetChangeRequest.setFavoritePhotoAccessHelper.applyChanges接口将图片或视频设置为收藏。

  • 前提条件
  1. 获取相册管理模块photoAccessHelper实例。
  2. 申请相册管理模块权限’ohos.permission.READ_IMAGEVIDEO’’ohos.permission.WRITE_IMAGEVIDEO’
  • 开发步骤
  1. 获取指定媒体资源。
  2. 调用MediaAssetChangeRequest.setFavorite接口将图片设置为收藏。
  3. 调用PhotoAccessHelper.applyChanges接口提交收藏图片的变更请求。
import dataSharePredicates from '@ohos.data.dataSharePredicates';
import photoAccessHelper from '@ohos.file.photoAccessHelper';
const context = getContext(this);
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);

async function example() {
  let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
  predicates.equalTo(photoAccessHelper.PhotoKeys.DISPLAY_NAME, 'test.jpg');
  let fetchOptions: photoAccessHelper.FetchOptions = {
    fetchColumns: [],
    predicates: predicates
  };

  try {
    let photoFetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await phAccessHelper.getAssets(fetchOptions);
    let photoAsset: photoAccessHelper.PhotoAsset = await photoFetchResult.getFirstObject();
    let assetChangeRequest: photoAccessHelper.MediaAssetChangeRequest = new photoAccessHelper.MediaAssetChangeRequest(photoAsset);
    let favoriteState = true;
    assetChangeRequest.setFavorite(favoriteState);
    await phAccessHelper.applyChanges(assetChangeRequest);
  } catch (err) {
    console.error('setFavorite failed with err: ' + err);
  }
}

4.1.3 获取收藏夹中的图片和视频

先获取收藏夹对象。然后调用Album.getAssets接口获取收藏夹中的资源。

  • 前提条件
  1. 获取相册管理模块photoAccessHelper实例。
  2. 申请相册管理模块权限’ohos.permission.READ_IMAGEVIDEO’
  • 开发步骤
  1. 获取收藏夹对象。
  2. 建立图片检索条件,用于获取图片。
  3. 调用Album.getAssets接口获取图片资源。
  4. 调用FetchResult.getFirstObject接口获取第一张图片。
import dataSharePredicates from '@ohos.data.dataSharePredicates';
import photoAccessHelper from '@ohos.file.photoAccessHelper';
const context = getContext(this);
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);

async function example() {
  let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
  let fetchOptions: photoAccessHelper.FetchOptions = {
    fetchColumns: [],
    predicates: predicates
  };

  try {
    let albumFetchResult: photoAccessHelper.FetchResult<photoAccessHelper.Album> = await phAccessHelper.getAlbums(photoAccessHelper.AlbumType.SYSTEM, photoAccessHelper.AlbumSubtype.FAVORITE);
    let album: photoAccessHelper.Album = await albumFetchResult.getFirstObject();
    console.info('get favorite album successfully, albumUri: ' + album.albumUri);

    let photoFetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await album.getAssets(fetchOptions);
    let photoAsset: photoAccessHelper.PhotoAsset = await photoFetchResult.getFirstObject();
    console.info('favorite album getAssets successfully, photoAsset displayName: ' + photoAsset.displayName);
    photoFetchResult.close();
    albumFetchResult.close();
  } catch (err) {
    console.error('favorite failed with err: ' + err);
  }
}

4.1.4 取消收藏图片或视频(仅向系统应用开放)

通过MediaAssetChangeRequest.setFavoritePhotoAccessHelper.applyChanges接口将图片或视频取消收藏。

  • 前提条件
  1. 获取相册管理模块photoAccessHelper实例。
  2. 申请相册管理模块权限’ohos.permission.READ_IMAGEVIDEO’’ohos.permission.WRITE_IMAGEVIDEO’
  • 开发步骤
  1. 获取收藏夹中的图片和视频。
  2. 调用MediaAssetChangeRequest.setFavorite接口将图片设置为取消收藏。
  3. 调用PhotoAccessHelper.applyChanges接口提交取消收藏图片的变更请求。
import dataSharePredicates from '@ohos.data.dataSharePredicates';
import photoAccessHelper from '@ohos.file.photoAccessHelper';
const context = getContext(this);
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);

async function example() {
  let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
  let fetchOptions: photoAccessHelper.FetchOptions = {
    fetchColumns: [],
    predicates: predicates
  };

  try {
    let albumFetchResult: photoAccessHelper.FetchResult<photoAccessHelper.Album> = await phAccessHelper.getAlbums(photoAccessHelper.AlbumType.SYSTEM, photoAccessHelper.AlbumSubtype.FAVORITE);
    let album: photoAccessHelper.Album = await albumFetchResult.getFirstObject();
    console.info('get favorite album successfully, albumUri: ' + album.albumUri);

    let photoFetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await album.getAssets(fetchOptions);
    let photoAsset: photoAccessHelper.PhotoAsset = await photoFetchResult.getFirstObject();
    console.info('favorite album getAssets successfully, photoAsset displayName: ' + photoAsset.displayName);

    let assetChangeRequest: photoAccessHelper.MediaAssetChangeRequest = new photoAccessHelper.MediaAssetChangeRequest(photoAsset);
    let favoriteState = false;
    assetChangeRequest.setFavorite(favoriteState);
    await phAccessHelper.applyChanges(assetChangeRequest);
    photoFetchResult.close();
    albumFetchResult.close();
  } catch (err) {
    console.error('setFavorite failed with err: ' + err);
  }
}

4.2 视频相册

视频相册属于系统相册,用户文件中属于视频类型的媒体文件会自动加入到视频相册中。

4.2.1 获取视频相册对象

通过PhotoAccessHelper.getAlbums接口获取视频相册对象。

  • 前提条件
  1. 获取相册管理模块photoAccessHelper实例。
  2. 申请相册管理模块权限’ohos.permission.READ_IMAGEVIDEO’
  • 开发步骤
  1. 设置获取视频相册的参数为photoAccessHelper.AlbumType.SYSTEMphotoAccessHelper.AlbumSubtype.VIDEO
  2. 调用PhotoAccessHelper.getAlbums接口获取视频相册。
import photoAccessHelper from '@ohos.file.photoAccessHelper';
const context = getContext(this);
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);

async function example() {
  try {
    let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.Album> = await phAccessHelper.getAlbums(photoAccessHelper.AlbumType.SYSTEM, photoAccessHelper.AlbumSubtype.VIDEO);
    let album: photoAccessHelper.Album = await fetchResult.getFirstObject();
    console.info('get video album successfully, albumUri: ' + album.albumUri);
    fetchResult.close();
  } catch (err) {
    console.error('get video album failed with err: ' + err);
  }
}

4.2.2 获取视频相册中的视频

先获取视频相册对象。然后调用Album.getAssets接口获取视频相册对象中的视频资源。

  • 前提条件
  1. 获取相册管理模块photoAccessHelper实例。
  2. 申请相册管理模块权限’ohos.permission.READ_IMAGEVIDEO’
  • 开发步骤
  1. 先获取视频相册对象。
  2. 建立视频检索条件,用于获取视频。
  3. 调用Album.getAssets接口获取视频资源。
  4. 调用FetchResult.getFirstObject接口获取第一个视频。
import dataSharePredicates from '@ohos.data.dataSharePredicates';
import photoAccessHelper from '@ohos.file.photoAccessHelper';
const context = getContext(this);
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);

async function example() {
  let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
  let fetchOptions: photoAccessHelper.FetchOptions = {
    fetchColumns: [],
    predicates: predicates
  };

  try {
    let albumFetchResult: photoAccessHelper.FetchResult<photoAccessHelper.Album> = await phAccessHelper.getAlbums(photoAccessHelper.AlbumType.SYSTEM, photoAccessHelper.AlbumSubtype.VIDEO);
    let album: photoAccessHelper.Album = await albumFetchResult.getFirstObject();
    console.info('get video album successfully, albumUri: ' + album.albumUri);

    let videoFetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await album.getAssets(fetchOptions);
    let photoAsset: photoAccessHelper.PhotoAsset = await videoFetchResult.getFirstObject();
    console.info('video album getAssets successfully, photoAsset displayName: ' + photoAsset.displayName);
    videoFetchResult.close();
    albumFetchResult.close();
  } catch (err) {
    console.error('video failed with err: ' + err);
  }
}

4.3 截屏和录屏相册(仅向系统应用开放)

截屏和录屏相册属于系统相册,用户文件中属于截屏和录屏的媒体文件会自动加入到截屏和录屏相册中。

4.3.1 获取截屏和录屏相册对象

通过PhotoAccessHelper.getAlbums接口获取截屏和录屏相册对象。

  • 前提条件
  1. 获取相册管理模块photoAccessHelper实例。
  2. 申请相册管理模块权限’ohos.permission.READ_IMAGEVIDEO’。
  • 开发步骤
  1. 设置获取截屏和录屏相册的参数为photoAccessHelper.AlbumType.SYSTEMphotoAccessHelper.AlbumSubtype.SCREENSHOT
  2. 调用PhotoAccessHelper.getAlbums接口获取截屏和录屏相册。
import photoAccessHelper from '@ohos.file.photoAccessHelper';
const context = getContext(this);
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);

async function example() {
  try {
    let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.Album> = await phAccessHelper.getAlbums(photoAccessHelper.AlbumType.SYSTEM, photoAccessHelper.AlbumSubtype.SCREENSHOT);
    let album: photoAccessHelper.Album = await fetchResult.getFirstObject();
    console.info('get screenshot album successfully, albumUri: ' + album.albumUri);
    fetchResult.close();
  } catch (err) {
    console.error('get screenshot album failed with err: ' + err);
  }
}

4.3.2 获取截屏和录屏相册中的媒体资源

先获取截屏和录屏相册对象。然后调用Album.getAssets接口获取截屏和录屏相册对象中的媒体资源。

  • 前提条件
  1. 获取相册管理模块photoAccessHelper实例。
  2. 申请相册管理模块权限’ohos.permission.READ_IMAGEVIDEO’
  • 开发步骤
  1. 先获取截屏和录屏相册对象。
  2. 建立检索条件,用于获取媒体资源。
  3. 调用Album.getAssets接口获取媒体资源。
  4. 调用FetchResult.getFirstObject接口获取第一个媒体资源。
import dataSharePredicates from '@ohos.data.dataSharePredicates';
import photoAccessHelper from '@ohos.file.photoAccessHelper';
const context = getContext(this);
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);

async function example() {
  let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
  let fetchOptions: photoAccessHelper.FetchOptions = {
    fetchColumns: [],
    predicates: predicates
  };

  try {
    let albumFetchResult: photoAccessHelper.FetchResult<photoAccessHelper.Album> = await phAccessHelper.getAlbums(photoAccessHelper.AlbumType.SYSTEM, photoAccessHelper.AlbumSubtype.SCREENSHOT);
    let album: photoAccessHelper.Album = await albumFetchResult.getFirstObject();
    console.info('get screenshot album successfully, albumUri: ' + album.albumUri);

    let screenshotFetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await album.getAssets(fetchOptions);
    let photoAsset: photoAccessHelper.PhotoAsset = await screenshotFetchResult.getFirstObject();
    console.info('screenshot album getAssets successfully, photoAsset displayName: ' + photoAsset.displayName);
    screenshotFetchResult.close();
    albumFetchResult.close();
  } catch (err) {
    console.error('screenshot album failed with err: ' + err);
  }
}

5 媒体资源变更通知相关

photoAccessHelper提供监听媒体资源变更的接口,供开发者对指定媒体资源变更进行监听。

说明:
在进行功能开发前,请开发者查阅开发准备,了解如何获取相册管理模块实例和如何申请相册管理模块功能开发相关权限。 文档中使用到photoAccessHelper的地方默认为使用开发准备中获取的对象,如未添加此段代码报photoAccessHelper未定义的错误请自行添加。

媒体资源变更通知相关接口的异步调用仅支持使用callback方式。以下只列出部分接口使用方式,其他使用方式可以查阅API参考。 如无特别说明,文档中涉及的待获取的资源均视为已经预置且在数据库中存在相应数据。如出现按照示例代码执行出现获取资源为空的情况请确认文件是否已预置,数据库中是否存在该文件的数据。

5.1 监听指定URI

通过调用registerChange接口监听指定uri。当被监听对象发生变更时返回监听器回调函数的值。

5.1.1 对指定PhotoAsset注册监听

对指定PhotoAsset注册监听,当被监听的PhotoAsset发生变更时,返回监听回调。

  • 前提条件
    1.c获取相册管理模块photoAccessHelper实例。
  1. 申请相册管理模块权限’ohos.permission.READ_IMAGEVIDEO’’ohos.permission.WRITE_IMAGEVIDEO’

下面以对一张图片注册监听,通过将这张图片删除触发监听回调为例。

  • 开发步骤
  1. 获取指定媒体资源。
  2. 对指定PhotoAsset注册监听。
  3. 将指定媒体资源删除。
import dataSharePredicates from '@ohos.data.dataSharePredicates';
import photoAccessHelper from '@ohos.file.photoAccessHelper';
const context = getContext(this);
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);

async function example() {
  let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
  predicates.equalTo(photoAccessHelper.PhotoKeys.DISPLAY_NAME, 'test.jpg');
  let fetchOptions: photoAccessHelper.FetchOptions = {
    fetchColumns: [],
    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);
    let onCallback = (changeData: photoAccessHelper.ChangeData) => {
      console.info('onCallback successfully, changData: ' + JSON.stringify(changeData));
    }
    phAccessHelper.registerChange(photoAsset.uri, false, onCallback);
    await photoAccessHelper.MediaAssetChangeRequest.deleteAssets(context, [photoAsset]);
    fetchResult.close();
  } catch (err) {
    console.error('onCallback failed with err: ' + err);
  }
}

5.1.2 对指定Album注册监听

对指定Album注册监听,当被监听的Album发生变更时,返回监听回调。

  • 前提条件
  1. 获取相册管理模块photoAccessHelper实例。
  2. 申请相册管理模块权限’ohos.permission.READ_IMAGEVIDEO’’ohos.permission.WRITE_IMAGEVIDEO’

下面以对一个用户相册注册监听,通过重命名相册触发监听回调为例。

  • 开发步骤
  1. 获取用户相册。
  2. 对指定Album注册监听。
  3. 将指定用户相册重命名。
import dataSharePredicates from '@ohos.data.dataSharePredicates';
import photoAccessHelper from '@ohos.file.photoAccessHelper';
const context = getContext(this);
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);

async function example() {
  let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
  let albumName: photoAccessHelper.AlbumKeys = photoAccessHelper.AlbumKeys.ALBUM_NAME;
  predicates.equalTo(albumName, 'albumName');
  let fetchOptions: photoAccessHelper.FetchOptions = {
    fetchColumns: [],
    predicates: predicates
  };

  try {
    let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.Album> = await phAccessHelper.getAlbums(photoAccessHelper.AlbumType.USER, photoAccessHelper.AlbumSubtype.USER_GENERIC, fetchOptions);
    let album: photoAccessHelper.Album = await fetchResult.getFirstObject();
    console.info('getAlbums successfully, albumUri: ' + album.albumUri);

    let onCallback = (changeData: photoAccessHelper.ChangeData) => {
      console.info('onCallback successfully, changData: ' + JSON.stringify(changeData));
    }
    phAccessHelper.registerChange(album.albumUri, false, onCallback);
    album.albumName = 'newAlbumName' + Date.now();
    await album.commitModify();
    fetchResult.close();
  } catch (err) {
    console.error('onCallback failed with err: ' + err);
  }
}

5.2 模糊监听

通过设置forChildUris=true来注册模糊监听,uri为相册uri时,forChildUris=true能监听到相册中文件的变化,如果是false只能监听相册本身变化。uri为photoAsset时,forChildUris为true、false没有区别,uri为DefaultChangeUri时,forChildUris必须为true,如果为false将找不到该uri,收不到任何消息。

5.2.1 对所有PhotoAsset注册监听

对所有PhotoAsset注册监听,当有被监听的PhotoAsset发生变更时,返回监听回调。

  • 前提条件
  1. 获取相册管理模块photoAccessHelper实例。
  2. 申请相册管理模块权限’ohos.permission.READ_IMAGEVIDEO’’ohos.permission.WRITE_IMAGEVIDEO’

下面以对所有PhotoAsset注册监听,通过将被监听的PhotoAsset删除触发监听回调为例。

  • 开发步骤
  1. 对所有PhotoAsset注册监听。
  2. 获取指定媒体资源。
  3. 将指定媒体资源删除。
import dataSharePredicates from '@ohos.data.dataSharePredicates';
import photoAccessHelper from '@ohos.file.photoAccessHelper';
const context = getContext(this);
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);

async function example() {
  let onCallback = (changeData: photoAccessHelper.ChangeData) => {
    console.info('onCallback successfully, changData: ' + JSON.stringify(changeData));
  }
  phAccessHelper.registerChange(photoAccessHelper.DefaultChangeUri.DEFAULT_PHOTO_URI, true, onCallback);
  let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
  let fetchOptions: photoAccessHelper.FetchOptions = {
    fetchColumns: [],
    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);
    await photoAccessHelper.MediaAssetChangeRequest.deleteAssets(context, [photoAsset]);
    fetchResult.close();
  } catch (err) {
    console.error('onCallback failed with err: ' + err);
  }
}

5.3 取消对指定URI的监听

取消对指定uri的监听,通过调用unRegisterChange接口取消对指定uri的监听。一个uri可以注册多个监听,存在多个callback监听时,可以取消指定注册的callback的监听;不指定callback时取消该uri的所有监听。

  • 前提条件
  1. 获取相册管理模块photoAccessHelper实例。
  2. 申请相册管理模块权限’ohos.permission.READ_IMAGEVIDEO’’ohos.permission.WRITE_IMAGEVIDEO’

下面以取消对一张图片指定的监听为例,取消监听后,删除图片不再触发对应的监听回调。

  • 开发步骤
  1. 获取指定媒体资源。
  2. 取消对指定媒体资源uri的监听。
  3. 将指定媒体资源删除。
import dataSharePredicates from '@ohos.data.dataSharePredicates';
import photoAccessHelper from '@ohos.file.photoAccessHelper';
const context = getContext(this);
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);

async function example() {
  let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
  predicates.equalTo(photoAccessHelper.PhotoKeys.DISPLAY_NAME, 'test.jpg');
  let fetchOptions: photoAccessHelper.FetchOptions = {
    fetchColumns: [],
    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);
    let onCallback1 = (changeData: photoAccessHelper.ChangeData) => {
      console.info('onCallback1, changData: ' + JSON.stringify(changeData));
    }
    let onCallback2 = (changeData: photoAccessHelper.ChangeData) => {
      console.info('onCallback2, changData: ' + JSON.stringify(changeData));
    }
    phAccessHelper.registerChange(photoAsset.uri, false, onCallback1);
    phAccessHelper.registerChange(photoAsset.uri, false, onCallback2);
    phAccessHelper.unRegisterChange(photoAsset.uri, onCallback1);
    await photoAccessHelper.MediaAssetChangeRequest.deleteAssets(context, [photoAsset]);
    fetchResult.close();
  } catch (err) {
    console.error('onCallback failed with err: ' + err);
  }
}

参考文献:
[1]OpenHarmoney应用开发文档

  • 16
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
在DevEco Studio进行鸿蒙开发中,可以使用VideoPlayer组件来实现视频播放器,而要读取本地文件夹的所有视频,需要使用MediaLibrary API。 具体步骤如下: 1. 在xml布局文件中添加VideoPlayer组件 ``` <VideoPlayer id="videoPlayer" width="match_parent" height="match_parent" /> ``` 2. 在java代码中,调用MediaLibrary API来获取本地视频文件列表,并将列表传递给VideoPlayer组件进行播放。 ``` import ohos.medialibrary.MediaLibrary; import ohos.media.player.Player; import ohos.media.player.PlayerCallback; import ohos.media.player.PlayerState; import ohos.media.player.PlayerInfo; import ohos.media.common.Source; ... // 获取本地视频文件列表 List<MediaLibrary.FileInfo> fileList = MediaLibrary.getInstance().getMediaList(MediaLibrary.MEDIA_VIDEO); // 将视频列表转换为播放列表 List<PlayerInfo> playList = new ArrayList<>(); for (MediaLibrary.FileInfo fileInfo : fileList) { Source source = new Source(fileInfo.getFilePath()); PlayerInfo playerInfo = new PlayerInfo(source); playList.add(playerInfo); } // 设置播放器播放列表 Player player = new Player(this); player.setSource(playList, Player.LOOP_MODE_NONE); // 设置回调监听器,监听播放器状态 player.setPlayerCallback(new PlayerCallback() { @Override public void onPrepared(Player player) { // 播放器准备完成 player.play(); } @Override public void onStateChanged(Player player, int state) { // 播放器状态改变 if (state == PlayerState.COMPLETED) { // 播放器播放完成,自动播放下一个视频 player.next(); } } }); // 将播放器设置给VideoPlayer组件 VideoPlayer videoPlayer = (VideoPlayer) findComponentById(ResourceTable.Id_videoPlayer); videoPlayer.setPlayer(player); ``` 需要注意的是,使用MediaLibrary API需要在config.json文件中添加权限声明。 ``` "requiredPermissions": [ "ohos.permission.READ_MEDIA_LIBRARY" ] ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

__Yvan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值