HarmonyOS 鸿蒙Next获取到相册照片的uri在image中无法展示

HarmonyOS 鸿蒙Next获取到相册照片的uri在image中无法展示 我已经获取到了照片的uri,但是在image中不能展示,我申请不到受限权限。

aboutToAppear() {
  this.getLatestPhoto();
}

async getLatestPhoto() {
  const context = getContext(this);
  let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);

  let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
  predicates.orderByDesc(photoAccessHelper.PhotoKeys.DATE_MODIFIED_MS);
  let fetchOptions: photoAccessHelper.FetchOptions = {
    fetchColumns: ['uri'],
    predicates: predicates
  };

  try {
    let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> =
      await phAccessHelper.getAssets(fetchOptions);
    let photoAsset: photoAccessHelper.PhotoAsset = await fetchResult.getFirstObject();
    if (photoAsset) {
      console.info('Latest photo URI: ' + photoAsset.uri);
      this.latestPhotoUri = photoAsset.uri;
    } else {
      console.info('No photos found');
    }
    fetchResult.close();
  } catch (err) {
    console.error('Failed to get latest photo:', err);
  }
}
if (this.latestPhotoUri) {
  Image(this.latestPhotoUri)
    .width('100%')
    .height('100%')
    .objectFit(ImageFit.Cover)
    .borderRadius(20)
    .rotate({
      x: 0,
      y: 1,
      z: 0,
      angle: this.rotationAngle
    })
    .onError((err) => {
      console.error('Image load failed:', err.message)
    })
    .onComplete(() => {
      console.info('Image load complete')
    })
}

更多关于HarmonyOS 鸿蒙Next获取到相册照片的uri在image中无法展示的实战教程也可以访问 https://www.itying.com/category-93-b0.html

10 回复

首先确定一点,

这种权限三方应用一般申请不到,只限于系统应用

看你的回答,图片是能正常读取到的,我这边复制代码之后,无法读取相关权限

Failed to get latest photo: Error: without medialibrary permission

能读取到的话 你可以在这个地方改造一下


```javascript
if (photoAsset) {
  console.info('Latest photo URI: ' + photoAsset.uri);
  this.latestPhotoUri = fileUri.getUriFromPath(photoAsset.uri);
}

更多关于HarmonyOS 鸿蒙Next获取到相册照片的uri在image中无法展示的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


大佬,你把ohos.permission.READ_MEDIA这个权限加上,试试呢。

我使用了你提供的转换代码,还是未能显示。

HarmonyOS的社区里有很多技术大牛分享经验,学到了很多有用的知识。

我这边这种权限加了也没有效果,

大概率是权限问题,这些接口就算给了这些权限,相关的属性可以拿到,但是根本找不到对应的路径地址,使用fileIo.openSync(this.latestPhotoUri, fileIo.OpenMode.READ_ONLY),不允许操作,正常来说是可以读取,然后获取文件大小。建议提工单咨询一下,

Latest photo URI: file://media/Photo/15/IMG_1739503986_014/image.jpg

我如果没看错的话, 这个应该就是你获取到的 url 地址, 但是 Image() 是无法识别这个地址的, 你应该把它读取出来, 给到 PixelMap

Image(src: PixelMap | ResourceStr | DrawableDescriptor)

参考链接: https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-basic-components-image-V5

试试这个呢,印象里好像要转沙盒目录

fileUri.getUriFromPath(path)

首先确认是否真的获取到了 url? 能不能打印出来? 是什么格式? 如果是网络图片, url 在浏览器中是否可以得到响应图片, 如果能得到响应图片, 就证明你的项目没有开通网络权限

真的是获取到了,相册的照片的uri,照片在手机上也是存在的。

打印的日志如下:

02-14 14:14:02.715   10893-10893   A03d00/JSAPP                    com.examp...otograph  I     photoAccessHelper getPhotoAccessHelper inner add createDeleteRequest and showAssetsCreationDialog
02-14 14:14:02.753   10893-10893   A03d00/JSAPP                    com.examp...otograph  I     Latest photo URI: file://media/Photo/15/IMG_1739503986_014/image.jpg
02-14 14:14:02.804   10893-10893   A03d00/JSAPP                    com.examp...otograph  E     Image load failed: file://media/Photo/15/IMG_1739503986_014/image.jpg,

在HarmonyOS(鸿蒙)Next中,获取到相册照片的URI后无法在Image组件中展示,可能是因为URI的格式或权限问题。首先,确保你已正确申请了相册访问权限,并在代码中明确声明了这些权限。其次,检查URI的格式是否正确,通常相册照片的URI应该是content://格式的,而不是file://格式的。

如果你使用的是PhotoViewPickerImagePicker等组件获取照片URI,确保你正确地处理了返回的URI。在鸿蒙系统中,直接使用Image组件的src属性设置URI时,可能需要使用Image组件的setPixelMap方法,并传入URI的路径。

示例代码如下:

import picker from '@ohos.file.picker';
import image from '@ohos.multimedia.image';

let photoSelectOptions = new picker.PhotoSelectOptions();
photoSelectOptions.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE;
photoSelectOptions.maxSelectNumber = 1;

let photoPicker = new picker.PhotoViewPicker();
photoPicker.select(photoSelectOptions).then((PhotoSelectResult) => {
    let uri = PhotoSelectResult.photoUris[0];
    image.createPixelMap(uri).then((pixelMap) => {
        this.imageComponent.setPixelMap(pixelMap);
    });
}).catch((err) => {
    console.error('PhotoPicker failed: ' + err);
});

确保在config.json中声明了相应的权限:

"reqPermissions": [
    {
        "name": "ohos.permission.READ_MEDIA"
    }
]

如果仍然无法展示,检查URI是否有效,或尝试使用其他方式加载图片。

回到顶部