uni-app uts调用鸿蒙API读取文件ArrayBuffer时APP闪退

发布于 1周前 作者 itying888 来自 Uni-App

uni-app uts调用鸿蒙API读取文件ArrayBuffer时APP闪退

开发环境 版本号 项目创建方式
Windows win10 HBuilderX

产品分类:uniapp/App

PC开发环境操作系统:Windows

HBuilderX类型:Alpha

HBuilderX版本号:4.42

手机系统:HarmonyOS NEXT

手机系统版本号:HarmonyOS NEXT Developer Beta2

手机厂商:华为

手机机型:Mate 60

页面类型:vue

vue版本:vue3

打包方式:离线

示例代码:

import {
	ReadFileOptions,
	ReadFileCallback
} from '../interface.uts';

import { fileIo as fs, ReadOptions } from '@kit.CoreFileKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { buffer, util } from '@kit.ArkTS';

export function hsReadFile(tempFilePath: string, options: ReadFileCallback) {
	try {
		if (!fs.accessSync(tempFilePath)) {
			console.log('检测图片不存在')
			throw new Error(`Temporary image does not exist at path: ${tempFilePath}`);
		}

		let sourceFileFd = fs.openSync(tempFilePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
		let pathSize = fs.statSync(sourceFileFd.fd).size;

		if (sourceFileFd.fd >= 0) {
			try {
				let arrayBuffer = new ArrayBuffer(pathSize);

				let buffSize: number = 4096;

				let buf = new ArrayBuffer(buffSize);

				let off: number = 0;
				let len: number = 0;
				let readedLen: number = 0;

				const targetBuffer = new Uint8Array(arrayBuffer);

				while ((len = fs.readSync(sourceFileFd.fd, buf, { offset: off, length: buffSize } as ReadOptions)) > 0) {

					readedLen += len;

					const result = new Uint8Array(buf, 0, len);

					targetBuffer.set(result, off);

					off += len;
				}

				const helper = new util.Base64Helper();
				let base64 = helper.encodeToStringSync(targetBuffer)

				let res: ReadFileOptions = {
					int8array: base64,
					videoSize: pathSize,
					readLen: readedLen
				};

				options?.(res);
			} finally {
				// 确保在操作完成后关闭文件描述符
				fs.closeSync(sourceFileFd);
			}
		} else {
			// 如果文件打开失败(例如,由于路径无效或权限问题),则抛出异常
			throw new Error('Failed to open files for copying');
		}
	} catch (error) {
		// 捕获并处理异常
		console.error('Error saving temporary image to local storage:', error);
		throw new Error(error); // 重新抛出异常,以便调用者可以处理
	}
}

操作步骤:

uni.chooseImage({
	count: 1,
	sizeType: ['original', 'compressed'],
	sourceType: ['album'],
	success: res => {
		console.log("res" , res)
		let tempFilePath = res.tempFilePaths[0];
		uni.saveFile({
			tempFilePath: tempFilePath,
			success: (res) => {
				hsReadFile(res.savedFilePath, (res) => {});
			}
		})
	}
});

预期结果:

正常返回

实际结果:

返回一半或闪退

bug描述:

uts 调用鸿蒙API读取图片ArrayBuffer APP闪退,手机上选择压缩图片读取返回base64,图片只显示一半。返回ArrayBuffer 闪退。选择原图无论返回base64还是ArrayBuffer 都闪退


更多关于uni-app uts调用鸿蒙API读取文件ArrayBuffer时APP闪退的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于uni-app uts调用鸿蒙API读取文件ArrayBuffer时APP闪退的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在处理uni-app调用鸿蒙API读取文件时遇到APP闪退的问题,通常是由于调用方式不正确、权限问题或者API使用不当导致的。以下是一个示例代码,展示了如何在uni-app中通过uts(Uni-app TypeScript Support)调用鸿蒙API读取文件的ArrayBuffer,并处理可能的错误以防止应用闪退。

首先,确保你的项目已经配置了uts,并且已经在manifest.json中声明了必要的权限(如读取文件的权限)。

1. 配置权限

manifest.json中添加文件读取权限:

"mp-huawei": {
  "app": {
    "permissions": [
      "ohos.permission.READ_EXTERNAL_STORAGE"
    ]
  }
}

2. 调用鸿蒙API读取文件

以下是一个在uni-app中使用TypeScript调用鸿蒙API读取文件的示例代码:

// 引入鸿蒙的文件管理器模块
import fileio from '@ohos.fileio';

async function readFileToArrayBuffer(filePath: string): Promise<ArrayBuffer | null> {
  try {
    // 打开文件
    const fileStream = await fileio.open(filePath, 0o666, fileio.constants.OpenFlag.RDONLY);
    if (!fileStream) {
      console.error('Failed to open file');
      return null;
    }

    // 获取文件大小
    const fileInfo = await fileStream.stat();
    const fileSize = fileInfo.size;

    // 创建一个ArrayBuffer来存储文件内容
    const buffer = new ArrayBuffer(fileSize);
    const dataView = new Uint8Array(buffer);

    // 读取文件内容到ArrayBuffer
    let bytesRead = 0;
    while (bytesRead < fileSize) {
      const { bytesRead: readBytes } = await fileStream.read(dataView.subarray(bytesRead), 0, fileSize - bytesRead);
      bytesRead += readBytes;
    }

    // 关闭文件
    await fileStream.close();

    return buffer;
  } catch (error) {
    console.error('Error reading file:', error);
    return null;
  }
}

// 使用示例
readFileToArrayBuffer('/path/to/your/file.txt').then(buffer => {
  if (buffer) {
    console.log('File read successfully:', buffer);
  } else {
    console.log('Failed to read file');
  }
}).catch(error => {
  console.error('Unhandled error:', error);
});

注意事项

  • 确保文件路径正确。
  • 捕获并处理所有可能的异常,防止应用崩溃。
  • 检查文件读取权限是否已正确配置并授予。
  • 使用try...catch块来捕获和处理错误,这是防止应用闪退的关键。

通过上述代码示例,你应该能够在uni-app中安全地调用鸿蒙API读取文件并处理为ArrayBuffer,同时避免应用闪退。如果问题依旧存在,建议检查具体的错误日志,以便进一步调试和修复。

回到顶部