uni-app uts调用鸿蒙API读取文件ArrayBuffer时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
更多关于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,同时避免应用闪退。如果问题依旧存在,建议检查具体的错误日志,以便进一步调试和修复。