拍摄照片后,Ionic cordova 相机插件间歇性崩溃(使用 Firebase 图像上传)

Posted

技术标签:

【中文标题】拍摄照片后,Ionic cordova 相机插件间歇性崩溃(使用 Firebase 图像上传)【英文标题】:Ionic cordova camera plugin crashes intermittently after a picture is taken (with Firebase image upload) 【发布时间】:2018-08-24 18:44:55 【问题描述】:
uploadImage(filePath: string, camera: boolean = false) 
try 
  let options: CameraOptions;
  if (camera) 
    options = 
      quality: 40,
      destinationType: this._camera.DestinationType.DATA_URL,
      encodingType: this._camera.EncodingType.JPEG,
      mediaType: this._camera.MediaType.PICTURE,
      correctOrientation: true
    
   else 
    options = 
      destinationType: this._camera.DestinationType.DATA_URL,
      sourceType: this._camera.PictureSourceType.PHOTOLIBRARY,
      encodingType: this._camera.EncodingType.JPEG,
      mediaType: this._camera.MediaType.PICTURE
    
  

  this._camera.getPicture(options).then((imageData) => 
    const photo = `data:image/jpeg;base64,$imageData`;
    const fileRef = this._afs.ref(filePath);
    const task = fileRef.putString(photo, 'data_url');

    task.snapshotChanges().pipe(
      finalize(() => 
        // execute other actions
        fileRef.getDownloadURL().subscribe(url => 
          if (url) 
            this.fileUploadUrl.next(url);
          
        )
        let toast = this.toastCtrl.create(
          message: 'Image upload successfully',
          position: 'bottom',
          duration: 3000
        );
        toast.present();
      )
    ).subscribe();
  )

 catch (e) 
  console.error(e);
  let toast = this.toastCtrl.create(
    message: 'Image upload cancelled',
    position: 'bottom',
    duration: 3000
  );
  toast.present();

拍摄照片后(从实际的 ios 设备)有时会崩溃,有时却可以正常工作。如果我使用前置摄像头,它总是可以工作。 但是如果我使用后置摄像头,在选择图片后,它会闪烁白屏,然后应用程序重新启动。我怀疑这是否与图像大小或分辨率有关。有时,如果我用后置摄像头拍摄了一张非常低分辨率的照片(比如在弱光环境中),它上传得很好。我在网上研究了一下,有人建议使用 --prod 标志以生产模式运行应用程序,但这并没有解决它。 我还尝试将质量值降低到一个较低的数字,但这仍然不适用于后置摄像头。

我很确定插件添加正确,隐私设置也正确,否则我将无法拍照。

【问题讨论】:

【参考方案1】:

是的,你是对的。使用带有 DataURL(即 Base64)的相机拍照时。由于图片大小和质量,我们可能会面临内存问题。你有'40'的质量很好。对于宽度和高度,您可以设置大约 300 像素。

图像尺寸越大,图像尺寸越大,会影响内存。

【讨论】:

我也尝试过只使用 FILE_URI 而不是 DATA_URL,但是从后置摄像头拍照时它仍然崩溃。 不,很遗憾。 那应该是你手机内存的问题。尝试在另一部具有良好内存的手机中验证【参考方案2】:

这不是您查询的正确解决方案,但是在浪费了我的夜晚之后,我尝试缩小图像并尝试将其保持在 2mb 以下并且效果很好。您可以通过提供 targetWidth 来减小图像大小和目标高度。我把它们都保持在500以下。

const options: CameraOptions = 
      quality: 30, // picture quality
      destinationType: this.camera.DestinationType.DATA_URL,
      sourceType: this.camera.PictureSourceType.CAMERA,
      encodingType: this.camera.EncodingType.PNG,
      mediaType: this.camera.MediaType.PICTURE,
      cameraDirection: this.camera.Direction.FRONT,
      allowEdit: true,
      correctOrientation    :false,
      targetWidth: 400,
      targetHeight: 400,
    

【讨论】:

以上是关于拍摄照片后,Ionic cordova 相机插件间歇性崩溃(使用 Firebase 图像上传)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Cordova 相机插件拍摄多张照片

如何更改 Cordova 相机插件选项

离子:每张照片/拍摄多张照片后,相机都会要求确认

Cordova 相机插件返回绿色图片 Windows Phone 8.1

使用相机插件拍摄新照片时,PhoneGap 应用程序崩溃

从图片中拍摄的照片不会显示在 android 的科尔多瓦相机插件中的裁剪