HarmonyOS鸿蒙Next中photoAsset.get方法无效
HarmonyOS鸿蒙Next中photoAsset.get方法无效 对asset的get方法不是读取吗 为什么我加了photoTime 的赋值获取就获取不到资源了?
async saveToFile(uri: string) {
this.timeArr.push(uri)
AppStorage.set('times', this.timeArr)
console.log("111222 需要的uri " + uri)
let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates()
predicates.equalTo(photoAccessHelper.PhotoKeys.URI, uri)
let fetchOptions: photoAccessHelper.FetchOptions = {
fetchColumns: [photoAccessHelper.PhotoKeys.TITLE],
predicates: predicates
}
try {
let context: Context = this.getUIContext().getHostContext() as common.UIAbilityContext
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context)
let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await phAccessHelper.getAssets(fetchOptions)
let photoAsset: photoAccessHelper.PhotoAsset = await fetchResult.getFirstObject()
//获取时间
this.photoTime = photoAsset.get(photoAccessHelper.PhotoKeys.DATE_ADDED_MS).toLocaleString()
console.log("1111 time " + this.photoTime)
let requestOptions: photoAccessHelper.RequestOptions = {
deliveryMode: photoAccessHelper.DeliveryMode.HIGH_QUALITY_MODE,
}
await photoAccessHelper.MediaAssetManager.requestImageData(context, photoAsset, requestOptions, this.handler)
fetchResult.close()
} catch (err) {
let error:BusinessError = err as BusinessError
console.log('1111 getAssets failed with err: ' + error.code + ' message:' + error.message)
} //文件完全写入
}
更多关于HarmonyOS鸿蒙Next中photoAsset.get方法无效的实战教程也可以访问 https://www.itying.com/category-93-b0.html
上面并没有查询DATE_ADDED_MS这个值,导致下面get时传入的参数无效,所以无法得到需要的结果。将代码更改一下即可:
async saveToFile(uri: string) {
this.timeArr.push(uri)
AppStorage.set('times', this.timeArr)
console.log("111222 需要的uri " + uri)
let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates()
predicates.equalTo(photoAccessHelper.PhotoKeys.URI, uri)
let fetchOptions: photoAccessHelper.FetchOptions = {
fetchColumns: [photoAccessHelper.PhotoKeys.TITLE,photoAccessHelper.PhotoKeys.DATE_ADDED_MS],
predicates: predicates
}
try {
let context: Context = this.getUIContext().getHostContext() as common.UIAbilityContext
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context)
let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await phAccessHelper.getAssets(fetchOptions)
let photoAsset: photoAccessHelper.PhotoAsset = await fetchResult.getFirstObject()
//获取时间
this.photoTime = photoAsset.get(photoAccessHelper.PhotoKeys.DATE_ADDED_MS).toLocaleString()
console.log("1111 time " + this.photoTime)
let requestOptions: photoAccessHelper.RequestOptions = {
deliveryMode: photoAccessHelper.DeliveryMode.HIGH_QUALITY_MODE,
}
await photoAccessHelper.MediaAssetManager.requestImageData(context, photoAsset, requestOptions, this.handler)
fetchResult.close()
} catch (err) {
let error:BusinessError = err as BusinessError
console.log('1111 getAssets failed with err: ' + error.code + ' message:' + error.message)
} //文件完全写入
}
更多关于HarmonyOS鸿蒙Next中photoAsset.get方法无效的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,photoAsset.get方法无效通常是由于API变更或权限问题导致。请检查以下方面:
- 确认使用的API版本与HarmonyOS Next SDK匹配,部分旧版API可能已被移除或更名。
- 确保已正确申请并获取相册访问权限(
ohos.permission.READ_IMAGEVIDEO)。 - 验证
photoAsset对象是否有效,可通过日志输出对象属性进行调试。 - 查阅HarmonyOS Next官方API文档,确认
get方法的具体用法及参数要求。
问题出在 fetchColumns 的配置上。在 getAssets 的 FetchOptions 中,您只指定了 PhotoKeys.TITLE 这一个字段。
photoAsset.get 方法只能读取在 fetchColumns 中明确指定的字段。当您尝试获取 PhotoKeys.DATE_ADDED_MS 时,由于该字段未被包含在查询列中,get 方法将无法返回有效数据。
解决方案:
修改 fetchOptions 的 fetchColumns 数组,将您需要读取的字段(PhotoKeys.DATE_ADDED_MS)添加进去。
let fetchOptions: photoAccessHelper.FetchOptions = {
fetchColumns: [
photoAccessHelper.PhotoKeys.TITLE,
photoAccessHelper.PhotoKeys.DATE_ADDED_MS // 添加此行
],
predicates: predicates
}
关键点说明:
- 按需查询:
fetchColumns定义了查询结果集中包含的元数据字段,这是一种性能优化机制,避免获取不必要的数据。 get方法依赖:后续photoAsset.get(key)操作完全依赖于fetchColumns中包含的键值。查询中未包含的字段,get方法将返回undefined。- 最佳实践:在定义
fetchColumns时,应预先规划好后续所有需要访问的PhotoKeys字段,一次性将其全部加入数组。
修改后,您的 photoAsset.get(photoAccessHelper.PhotoKeys.DATE_ADDED_MS) 调用即可正常获取到时间戳数据。

