uni-app开发鸿蒙唤起前置相机拍照的时候出现问题

uni-app开发鸿蒙唤起前置相机拍照的时候出现问题

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

示例代码:

// 调用鸿蒙摄像头插件  
export function openCamera(): Promise<string> {  
    console.log('####################################   调用成功')  
    return new Promise(async (resolve, reject) => {  
        try {  
            const pickerProfile : picker.PickerProfile = {  
                cameraPosition: camera.CameraPosition.CAMERA_POSITION_FRONT  
            };  
            const pickerResult : picker.PickerResult = await picker.pick(getContext(),  
                [picker.PickerMediaType.PHOTO], pickerProfile);  
            if (pickerResult.resultCode === 0) {  
                // 文件复制和读取逻辑  
                const file = fs.openSync(pickerResult.resultUri, fs.OpenMode.READ_ONLY)  
                const photoSize = fs.statSync(file.fd).size;  
                const buffer1 = new ArrayBuffer(photoSize);  
                fs.readSync(file.fd, buffer1);  
                const base64Str : string = buffer.from(buffer1).toString('base64')  
                resolve(base64Str);  
                console.log('####################################   调用成功', base64Str)  
                fs.closeSync(file);  
            } else {  
                console.error('Picker 调用失败,resultCode:', pickerResult.resultCode);  
                reject(new Error(`Picker 调用失败,resultCode: ${pickerResult.resultCode}`));  
            }  
        } catch (error) {  
            let err = error as BusinessError;  
            console.error('调用摄像头或读取文件时出错:', err);  
            reject(error);  
        }  
    });  
}

操作步骤:

// 调用鸿蒙摄像头插件  
export function openCamera(): Promise<string> {  
    console.log('####################################   调用成功')  
    return new Promise(async (resolve, reject) => {  
        try {  
            const pickerProfile : picker.PickerProfile = {  
                cameraPosition: camera.CameraPosition.CAMERA_POSITION_FRONT  
            };  
            const pickerResult : picker.PickerResult = await picker.pick(getContext(),  
                [picker.PickerMediaType.PHOTO], pickerProfile);  
            if (pickerResult.resultCode === 0) {  
                // 文件复制和读取逻辑  
                const file = fs.openSync(pickerResult.resultUri, fs.OpenMode.READ_ONLY)  
                const photoSize = fs.statSync(file.fd).size;  
                const buffer1 = new ArrayBuffer(photoSize);  
                fs.readSync(file.fd, buffer1);  
                const base64Str : string = buffer.from(buffer1).toString('base64')  
                resolve(base64Str);  
                console.log('####################################   调用成功', base64Str)  
                fs.closeSync(file);  
            } else {  
                console.error('Picker 调用失败,resultCode:', pickerResult.resultCode);  
                reject(new Error(`Picker 调用失败,resultCode: ${pickerResult.resultCode}`));  
            }  
        } catch (error) {  
            let err = error as BusinessError;  
            console.error('调用摄像头或读取文件时出错:', err);  
            reject(error);  
        }  
    });  
}

更多关于uni-app开发鸿蒙唤起前置相机拍照的时候出现问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

如之前沟通,目前发现返回的字符串数据量比较大,初步测试有 600w 的长度,无法正确返回。
目前返回的 arraybuffer 看起来有问题,导致不能正确转成 base64。
可以看到返回临时文件的 url 可以进行 upload
目前会跟进此问题。

更多关于uni-app开发鸿蒙唤起前置相机拍照的时候出现问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


根据提供的代码和问题描述,这里有几个需要注意的点:

  1. 鸿蒙相机权限检查是否已配置?需要在config.json中添加ohos.permission.CAMERA权限声明。

  2. 前置摄像头可能在某些鸿蒙设备上不可用,建议添加设备能力检查:

const cameraManager = camera.getCameraManager(getContext());
const cameras = cameraManager.getSupportedCameras();
const hasFrontCamera = cameras.some(cam => cam.position === camera.CameraPosition.CAMERA_POSITION_FRONT);
  1. 文件读取部分可以优化为:
const file = await fs.promises.open(pickerResult.resultUri, fs.OpenMode.READ_ONLY);
const stats = await fs.promises.fstat(file.fd);
const buffer = new Uint8Array(stats.size);
await fs.promises.read(file.fd, buffer);
const base64Str = buffer.from(buffer).toString('base64');
回到顶部