收藏
回答

createCameraContext后 调用ctx.takePhoto,纯血鸿蒙不执行?

let ctx = uni.createCameraContext();

try{

console.log('ctx', ctx)

ctx.takePhoto({

quality: "normal",

success: (res) => {

console.log('进入 ctx.takePhoto success')

const updateFile = () => {

console.log('uploadImages', res.tempImagePath)

// 处理网络异常时,直接用本地存储图片

const handleNetworkAnomaly = () => {

this.showCameraing = false // 拍照完成后,关掉相机组件

const newItem = {...item, scanImage:[{url:res.tempImagePath,mediaType:'IMAGE',mediaUrl: res.tempImagePath, createTime:this.$moment().format('YYYY-MM-DD HH:mm:ss')}] }

this.onNormalCheck(newItem, SIGN_TYPE.QRCODE_SCAN)

uni.hideLoading()

}

if(this.networkConnecting) { // 有网状态直接上传,无网状态暂存数据

try {

// #ifdef MP-WEIXIN

// wxLogs.error('uploadImages之前', {时间: new Date().getTime()})

// #endif

}catch (e) {}

uploadImages(res.tempImagePath).then((imgUrl)=>{

try {

// #ifdef MP-WEIXIN

// wxLogs.error('uploadImages之完成之后', {时间: new Date().getTime()})

// #endif

}catch (e) {}

this.showCameraing = false // 拍照完成后,关掉相机组件

const newItem = {...item, scanImage:[{url:imgUrl,mediaType:'IMAGE',mediaUrl: imgUrl, createTime:this.$moment().format('YYYY-MM-DD HH:mm:ss')}] }

this.onNormalCheck(newItem, SIGN_TYPE.QRCODE_SCAN)

}).catch(err => {

handleNetworkAnomaly()

})

} else {

handleNetworkAnomaly()

}

}

fileManage.getFileInfo({

filePath: res.tempImagePath,

success: (file) => {

console.log('进入 fileManage.getFileInfo success')

try {

// #ifdef MP-WEIXIN

wxLogs.error('getFileInfo,fileSize', {title: '判断文件大小', 'fileSize': file.size, '次数': this.cameraLoopNo})

// #endif

}catch (e) {}

// sizeFlag ios拍的黑屏图片也比较大,所以小于40K的认为需要重新拍,大于4OK的一般都是可以的

if(this.cameraLoopNo > 3 || file.size > sizeFlag) {

updateFile()

} else {

setTimeout(() => {

myTakePhoto(true)

}, 300)

this.cameraLoopNo = this.cameraLoopNo + 1

}

},

fail: (error) => {

console.log('进入 fileManage.getFileInfo fail')

if(this.cameraLoopNo >5 || file.size > 20*1024) {

updateFile()

} else {

setTimeout(() => {

myTakePhoto(true)

}, 300)

this.cameraLoopNo = this.cameraLoopNo + 1

}

}

})

},

fail: e => {

// 早期配置较差的机型,有时候200毫秒无法完全初始化,增加补偿机制

if(this.cameraLoopNo >5) {

this.showCameraing = false // 拍照是失败后,也关掉相机组件

this.onNormalCheck(item, SIGN_TYPE.QRCODE_SCAN)

} else {

setTimeout(myTakePhoto, this.cameraLoopNo * 150)

this.cameraLoopNo = this.cameraLoopNo + 1

}

console.log('fail1 e :', e)

try {

// #ifdef MP-WEIXIN

// wxLogs.error('sendOrderPatrol-takePhoto', {title: '拍照失败', error: e})

// #endif

}catch (e) {}

}

});

} catch(e) {

console.error('ctx.takePhoto catch', e)

}

回答关注问题邀请回答
收藏

1 个回答

  • 智能回答 智能回答 本次回答由AI生成
    01-08
    有用
    回复 4
    • 大鹏
      大鹏
      01-08
      您好 我经过测试发现了一个问题,就我是扫码后 然后重新创建createCameraContext。 然后直接执行ctx.takePhoto。 这时候可能 进入 fail方法, {"errMsg": "operateCamera:fail:camera has not been initialized"},我会在这里做补偿机制,一段时间以后再调用,这时候 createCameraContext就创建好了。
      但问题是,鸿蒙系统,当createCameraContext 未初始化成功时,调用ctx.takePhoto 没有进入fail的回调。多以后续不长机制就时效了。 
      请您针对这个问题 帮忙测一下可以吗?
      01-08
      回复
    • 智能回答 智能回答 本次回答由AI生成
      01-08回复大鹏
      1
    • 大鹏
      大鹏
      01-08
      我知道呀,问题是 鸿蒙系统 无法进入 fail回调。能不能有人帮忙解答一下?
      01-08
      回复
    • 社区技术运营专员-Jahozheng
      社区技术运营专员-Jahozheng
      01-08回复大鹏
      你好,麻烦提供出现问题的具体机型、微信版本号、系统版本号,以及能复现问题的代码片段(https://developers.weixin.qq.com/miniprogram/dev/devtools/minicode.html
      01-08
      回复
登录 后发表内容