@ohos.file.photoAccessHelper (相册管理模块)的使用

228 阅读4分钟

简介

该模块提供相册管理模块能力,包括创建相册以及访问、修改相册中的媒体数据信息等。

在使用该模块之前我们需要申请用户权限

根据授权方式的不同,权限类型可分为 system_grant 和 user_grant。

system_grant(系统授权)

system_grant指的是系统授权类型,在该类型的权限许可下,应用被允许访问的数据不会涉及到用户或设备的敏感信息,应用被允许执行的操作对系统或者其他应用产生的影响可控。

如果在应用中申请了system_grant 权限,那么系统会在用户安装应用时,自动把相应权限授予给应用。

user_grant(用户授权)

user_grant指的是用户授权类型,在该类型的权限许可下,应用被允许访问的数据将会涉及到用户或设备的敏感信息,应用被允许执行的操作可能对系统或者其他应用产生严重的影响。

该类型权限不仅需要在安装包中申请权限,还需要在应用动态运行时,通过发送弹窗的方式请求用户授权。在用户手动允许授权后,应用才会真正获取相应权限,从而成功访问操作目标对象。

当应用申请系统权限时,系统权限会自动授权,比如网络权限INTERNET,当应用申请网络权限时,需要得到用户的同意才能正常使用需要该权限的模块,相册所需要的权限涉及隐私我们需要得到用户的同意。

有些权限需要申请签名,这时我们可以测试的话自动签名即可。

image.png

现在我们要在module.json5里面添加相应权限并得到用户的同意

image.png

string.json里面加上申请的理由,让用户看到

image.png

现在我们需要些写段代码弹窗来得到用户的同意,下面是一个权限管理相关的类,只需要传入参数,即可申请,一次建议只申请一次权限,因为权限一旦拒绝一次,只能在设置页面申请权限。

import { abilityAccessCtrl, bundleManager, common, Permissions } from '@kit.AbilityKit';

class PermissionManager {

  // 检查是否授权
  checkPermissions(permissions: Permissions[]) {
    // 程序访问控制管理
    const atManager = abilityAccessCtrl.createAtManager();
    // 获取 bundle 信息
    const bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
    // 提取 tokenID 标识
    const tokenID = bundleInfo.appInfo.accessTokenId
    // 校验应用是否被授予权限
    const authResults = permissions.map((item) => atManager.checkAccessTokenSync(tokenID, item))
    // 返回是否已授权结果
    return authResults.every(v => v === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
  }

  // 动态申请授权(首次弹窗申请)
  async requestPermissions(permissions: Permissions[]) {
    // 程序访问控制管理
    const atManager = abilityAccessCtrl.createAtManager();
    // 拉起弹框请求用户授权
    const grantStatus = await atManager.requestPermissionsFromUser(getContext(), permissions)
    // 获取请求权限的结果
    const isAuth = grantStatus.authResults.every(item => item === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
    // 返回 Promise 授权结果
    return isAuth ? Promise.resolve(true) : Promise.reject(false)
  }

  // 打开系统设置的权限管理页(处理授权结果)
  openPermissionSettingsPage() {
    // 获取上下文
    const context = getContext() as common.UIAbilityContext
    // 获取包信息
    const bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
    // 打开系统设置页
    context.startAbility({
      bundleName: 'com.huawei.hmos.settings',
      abilityName: 'com.huawei.hmos.settings.MainAbility',
      uri: 'application_info_entry',
      parameters: {
        // 按照包名打开对应设置页
        pushParams: bundleInfo.name
      }
    })
  }
}

export const permissionManager = new PermissionManager()

编写测试页面申请照片权限

import { Permissions } from '@kit.AbilityKit'
import { permissionManager } from '../common/PermissionManager'
import { promptAction } from '@kit.ArkUI'

@Entry
@Component
struct PhotoTest {


  build() {
   Column(){
     Button('申请照片权限')
       .onClick(async ()=>{
         let permission:Permissions[]=["ohos.permission.READ_IMAGEVIDEO","ohos.permission.WRITE_IMAGEVIDEO"]
         const res= await permissionManager.requestPermissions(permission)
         if(res===true){
           promptAction.showDialog({message:'申请照片权限成功'})
         }else {
           promptAction.showDialog({message:'申请照片权限失败'})
         }
       })
   }
  }
}

点击按钮弹窗弹出

image.png

点击允许则授权应用访问照片权限

image.png

接下来就可以使用@ohos.file.photoAccessHelper 模块进行使用了

import photoAccessHelper from '@ohos.file.photoAccessHelper';
import { dataSharePredicates } from '@kit.ArkData';
import { BusinessError } from '@kit.BasicServicesKit';

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



export async function example() {
  console.info('getAssets');
  let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
  let fetchOptions: photoAccessHelper.FetchOptions = {
    fetchColumns: [],
    predicates: predicates
  };
  //使用getAssets获取图片资源
  phAccessHelper.getAssets(fetchOptions, async (err, fetchResult) => {
    if (fetchResult !== undefined) {
      console.info('fetchResult success');
      //获取第一张图片
      let photoAsset: photoAccessHelper.PhotoAsset = await fetchResult.getFirstObject();
      if (photoAsset !== undefined) {
        console.info('photoAsset.displayName : ' + photoAsset.displayName);
      }
    } else {
      console.error(`fetchResult fail with error: ${err.code}, ${err.message}`);
    }
  });
}

export async function createExample() {
  console.info('createAssetDemo');
  let photoType: photoAccessHelper.PhotoType = photoAccessHelper.PhotoType.IMAGE;
  let extension:string = 'jpg';
  let options: photoAccessHelper.CreateOptions = {
    title: 'testPhoto'
  }
  phAccessHelper.createAsset(photoType, extension, options, (err, uri) => {
    if (uri !== undefined) {
      console.info('createAsset uri' + uri);
      console.info('createAsset successfully');
    } else {
      console.error(`createAsset failed, error: ${err.code}, ${err.message}`);
    }
  });
}

export async function deleteExample() {
  console.info('createDeleteRequestDemo');
  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 asset: photoAccessHelper.PhotoAsset = await fetchResult.getFirstObject();
    if (asset === undefined) {
      console.error('asset not exist');
      return;
    }
    phAccessHelper.createDeleteRequest([asset.uri], (err) => {
      if (err === undefined) {
        console.info('createDeleteRequest successfully');
      } else {
        console.error(`createDeleteRequest failed with error: ${err.code}, ${err.message}`);
      }
    });
  } catch (err) {
    console.error(`fetch failed, error: ${err.code}, ${err.message}`);
  }
}

export async function pickerExample() {
  try {
    let photoPicker = new photoAccessHelper.PhotoViewPicker();
    photoPicker.select((err: BusinessError, PhotoSelectResult: photoAccessHelper.PhotoSelectResult) => {
      if (err) {
        console.error(`PhotoViewPicker.select failed with err: ${err.code}, ${err.message}`);
        return;
      }
      console.info('PhotoViewPicker.select successfully, PhotoSelectResult uri: ' + JSON.stringify(PhotoSelectResult));
    });
  } catch (error) {
    let err: BusinessError = error as BusinessError;
    console.error(`PhotoViewPicker failed with err: ${err.code}, ${err.message}`);
  }
}

export async function allExample() {
  console.info('getAllObjectDemo');
  let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
  let fetchOption: photoAccessHelper.FetchOptions = {
    fetchColumns: [],
    predicates: predicates
  };
  let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await phAccessHelper.getAssets(fetchOption);
  fetchResult.getAllObjects((err, photoAssetList) => {
    if (photoAssetList !== undefined) {
      console.info('photoAssetList length: ', photoAssetList.length);
      photoAssetList.forEach(item=>{
        console.log('name:'+item.displayName)
      })
    } else {
      console.error(`photoAssetList failed with err:${err.code}, ${err.message}`);
    }
  });
}

测试页面代码

import { Permissions } from '@kit.AbilityKit'
import { permissionManager } from '../common/PermissionManager'
import { promptAction } from '@kit.ArkUI'
import { createExample, deleteExample, example } from '../common/photoAccessHelper'

@Entry
@Component
struct PhotoTest {


  build() {
   Column({space:10}){
     Button('申请照片权限')
       .onClick(async ()=>{
         let permission:Permissions[]=["ohos.permission.READ_IMAGEVIDEO","ohos.permission.WRITE_IMAGEVIDEO"]
         const res= await permissionManager.requestPermissions(permission)
         if(res===true){
           promptAction.showDialog({message:'申请照片权限成功'})
         }else {
           promptAction.showDialog({message:'申请照片权限失败'})
         }
       })

     Button('example')
       .onClick(()=>{
         //查询第一个图片
         example()
       })
     Button('create photo')
       .onClick(()=>{
       createExample()
     })
     Button('delete photo')
       .onClick(()=>{
       deleteExample()
     })
   }.justifyContent(FlexAlign.Center)
    .alignItems(HorizontalAlign.Center)
    .height('100%')
    .width('100%')
  }
}

image.png

获取第一个图片的名字成功

image.png

创建一个图片成功

image.png

删除图片成功

image.png

image.png

选择照片

image.png

image.png

查找所有图片成功

image.png

总结,想要使用照片模块需要得到用户的同意,才能进行下一步的行动,更多的信息请查找官方文档