HarmonyOS鸿蒙Next中通过系统相机拍照和录像(CameraPicker)示例获取resultUri后,Image能正常显示但图片链接转base64失败问题

HarmonyOS鸿蒙Next中通过系统相机拍照和录像(CameraPicker)示例获取resultUri后,Image能正常显示但图片链接转base64失败问题 通过官方示例,成功获取拍照结果result

cke_4605.png

再根据示例将图片转换为base64图片,然后了解到必须要将file://com.example.myapptest/data/storage/el2/base/haps/entry/files/1755244017721.tmp去掉file://com.example.myapptest/以data开头再传入方法处理才行,不然会进程中断,无法得到arrayBuffer,

cke_8202.png

cke_462.png

传入路径,但得到了空对象,导致后续转换的base64文件无法正常显示,想问已经按照官方示例,但是出现这样的问题,是我漏了什么没注意还是因为什么原因,

cke_83990.png


更多关于HarmonyOS鸿蒙Next中通过系统相机拍照和录像(CameraPicker)示例获取resultUri后,Image能正常显示但图片链接转base64失败问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS Next中,使用CameraPicker获取resultUri后,若Image能显示但转base64失败,可能是文件权限或URI解析问题。需检查:

  1. 确保使用正确的uri转换API:globalThis.context.resourceManager.getMediaContent处理媒体URI
  2. 验证文件读取权限:在module.json5中声明ohos.permission.READ_MEDIA权限
  3. 使用fileIo接口读取文件时,确认URI有效性,可通过fs.accessSync(uri)检查

典型代码片段:

const file = fs.openSync(uri, fs.OpenMode.READ_ONLY);
const buffer = new ArrayBuffer(file.length);
fs.readSync(file.fd, buffer);
const base64 = base64.encodeFromArrayBuffer(buffer);
fs.closeSync(file);

更多关于HarmonyOS鸿蒙Next中通过系统相机拍照和录像(CameraPicker)示例获取resultUri后,Image能正常显示但图片链接转base64失败问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


这个问题是由于文件路径处理不当导致的。在HarmonyOS Next中,CameraPicker返回的URI需要正确处理才能获取到文件内容。

关键点:

  1. 不要手动拼接或修改URI路径,应该使用官方提供的API来获取文件内容
  2. 正确的处理方式应该是:
import fs from '@ohos.file.fs';

async function getFileBase64(uri: string) {
  try {
    // 直接使用uri打开文件
    let file = fs.openSync(uri, fs.OpenMode.READ_ONLY);
    let stat = fs.statSync(uri);
    let arrayBuffer = new ArrayBuffer(stat.size);
    fs.readSync(file.fd, arrayBuffer);
    fs.closeSync(file);
    
    // 转换为base64
    let base64 = arrayBufferToBase64(arrayBuffer);
    return base64;
  } catch (error) {
    console.error('Failed to read file: ' + JSON.stringify(error));
    return null;
  }
}

function arrayBufferToBase64(buffer: ArrayBuffer) {
  let binary = '';
  let bytes = new Uint8Array(buffer);
  for (let i = 0; i < bytes.byteLength; i++) {
    binary += String.fromCharCode(bytes[i]);
  }
  return window.btoa(binary);
}

调用方式:

let base64 = await getFileBase64(resultUri); // 直接传入CameraPicker返回的URI

这样处理可以避免路径转换问题,直接使用系统API读取文件内容。如果仍然遇到问题,可能是权限配置不正确,请检查是否在config.json中声明了所需的文件访问权限。

回到顶部