图片权限

316 阅读3分钟

1 申请权限

获取用户相册首次授权需要申请权限

// 1 程序访问控制管理
const AtManager = abilityAccessCtrl.createAtManager()
// 2 向用户申请权限
const resultResult = await AtManager.requestPermissionsFromUser(getContext(), permissions)

两种情况 :

  1. 用户首次授权同意授权->完成
  2. 用户拒绝授权->提示去设置页面开启 使用promptAction.showDialog弹出提示框 让用户选择取消还是去设置界面开启权限
promptAction.showDialog({
      alignment: DialogAlignment.Center,
      title: '温馨提示',
      message: '手机瘦身功能需要获取权限,请在系统设置中打开相册开关',
      buttons: [
        { text: '取消', color: $r('app.color.font_sub') },
        { text: '立即开启', color: $r('app.color.brand') }
      ]
    })

用户点击取消按钮表示授权失败

用户点击立刻开启 则跳转至设置界面让用户手动开启权限(用户点击了取消按钮 鸿蒙没有内置的API修改,需要手动去设置页面修改) 核心API context.startAbility


// 1 获取 context 对象 ,并通过 as 断言 为 UIAbilityContext,UIAbilityContext 才能调用 startAbility 这个 API
const context =getContext() as common.UIAbilityContext
// 3 获取 bundleInfo 应用包信息 动态信息获取 APP Scope/app.json5中的配置的包信息
const bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
// 2 启动一个设置页(应用)
context.startAbility({
  // 打开设置页的固定写法(Harmony os Next 文档中有)
  bundleName: 'com.huawei.hmos.settings',
  abilityName: 'com.huawei.hmos.settings.MainAbility',
  uri: 'application_info_entry',
  parameters:{
    // 安装包名 打开指定应用的详情页面
    pushParams:bundleInfo.name
  }

2 获取图片信息

应用通过调用PhotoAccessHelper.getAssets获取媒体资源

image.png 核心API phAccessHelper.getAssets


// 获取相册管理模块的实例,用于访问和修改相册中的媒体文件。
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(getContext())
// 查询条件
let predicates = new dataSharePredicates.DataSharePredicates()
// 获取图片和视频资源 核心 API: getAssets,
let fetchResult = await phAccessHelper.getAssets({
  fetchColumns: [], // 检索条件,指定列名查询,如果该参数为空时默认查询uri、name、photoType
  predicates: predicates  // 谓词查询,显示过滤条件。
})
// 获取第一 图片/视频 资源
let photoAsset = await fetchResult.getFirstObject()


fetchResult图片/视频 资源
getFirstObject获取第一张
getNextObject获取下一张
getLastObject获取最后一张
getObjectByPosition获取下标索引的图片
getAllObject获取全部

fetchResult.getFirstObject()只能获取到 图片/视频 地址(uri),图片名称(displayName),图片类型(photoType)

fetchColumns 文件关键信息 文档链接 如果需要其他枚举需要使用.get 注意 :fetchColumns 和 get 里面的枚举需要一致 否则不显示

使用如下 (举例: "size""date_added")
fetchColumns: [
  photoAccessHelper.PhotoKeys.SIZE, // 获取文件大小 单位KB
  photoAccessHelper.PhotoKeys.DATE_ADDED// 获取日期
]
--------------------------
let photoAsset = await fetchResult.getFirstObject()
let size = photoAsset.get(photoAccessHelper.PhotoKeys.SIZE) as number
let added = photoAssrt.get( photoAccessHelper.PhotoKeys.DATE_ADDED)as string

3 删除图片(放入回收站)

删除图片 核心API deleteAssets(11+版本) 通过 MediaAssetChangeRequest.deleteAssets 可以将文件放入回收站

image.png 实现步骤

  1. 建立搜索条件 用于获取图片资源
  2. 调用 photoAccessHelper.getAssets接口获取目标图片资源
  3. 调用getFirstObbject/getAllObjects接口获取图片 将要放入回收站的对象 (以上步骤和获取图片 相同)
  4. 调用MediaAssetChangeRequest.deleteAssets接口将文件放入回收站

// 1 找到待删除的图片资源 PhotoAsset
// 1.1 获取相册管理块的实列
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(getContext())
// 1.2 准备查询条件
let Predicates = new dataSharePredicates.DataSharePredicates
// 1.3 获取资源,返回值类型为
let fetchResult = await phAccessHelper.getAssets({
  fetchColumns: [],
  predicates: Predicates
})
// 1.4 获取图片资源 删除图片 API 的第二个参数 photoAccessHelper.PhotoAsset[]
let photoAsset = await fetchResult.getFirstObject()
// 2 核心API 调用 deleteAssets 实现删除
photoAccessHelper.MediaAssetChangeRequest.deleteAssets(getContext(), [photoAsset])

老版本APIcreateDeleteRequest 版本更新后可能被废除 需要换新版本的API

4 获取相册信息

核心API getAlbums 必填参数 type相册类型 subtype相册子类型

参考链接 docs.openharmony.cn/pages/v4.1/…

image.png

// 获取相册管理模块的实例,用于访问和修改相册中的媒体文件。
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(getContext())
// getAssets 获取 图片/视频
// fetAlbums 获取 图片
let fetchResult = await phAccessHelper.getAlbums(
  photoAccessHelper.AlbumType.USER, // 一级相册类型 -> 用户相册系统相册
  photoAccessHelper.AlbumSubtype.USER_GENERIC // 二级相册类型 -> 用户相册 收藏夹 等
)
// 获取第一个对象
const album = await fetchResult.getFirstObject()

返回结果

image.png

以上就是我对 1 申请权限 2 获取图片/视频(文件信息) 3 删除图片 4 获取相册 的个人见解 本人小白一名 如有错的地方 敬请谅解 欢迎大家补充 感谢