简介
该模块提供相册管理模块能力,包括创建相册以及访问、修改相册中的媒体数据信息等。
在使用该模块之前我们需要申请用户权限
根据授权方式的不同,权限类型可分为 system_grant 和 user_grant。
system_grant(系统授权)
system_grant指的是系统授权类型,在该类型的权限许可下,应用被允许访问的数据不会涉及到用户或设备的敏感信息,应用被允许执行的操作对系统或者其他应用产生的影响可控。
如果在应用中申请了system_grant 权限,那么系统会在用户安装应用时,自动把相应权限授予给应用。
user_grant(用户授权)
user_grant指的是用户授权类型,在该类型的权限许可下,应用被允许访问的数据将会涉及到用户或设备的敏感信息,应用被允许执行的操作可能对系统或者其他应用产生严重的影响。
该类型权限不仅需要在安装包中申请权限,还需要在应用动态运行时,通过发送弹窗的方式请求用户授权。在用户手动允许授权后,应用才会真正获取相应权限,从而成功访问操作目标对象。
当应用申请系统权限时,系统权限会自动授权,比如网络权限INTERNET,当应用申请网络权限时,需要得到用户的同意才能正常使用需要该权限的模块,相册所需要的权限涉及隐私我们需要得到用户的同意。
有些权限需要申请签名,这时我们可以测试的话自动签名即可。
现在我们要在module.json5里面添加相应权限并得到用户的同意
string.json里面加上申请的理由,让用户看到
现在我们需要些写段代码弹窗来得到用户的同意,下面是一个权限管理相关的类,只需要传入参数,即可申请,一次建议只申请一次权限,因为权限一旦拒绝一次,只能在设置页面申请权限。
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:'申请照片权限失败'})
}
})
}
}
}
点击按钮弹窗弹出
点击允许则授权应用访问照片权限
接下来就可以使用@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%')
}
}