【问题标题】:$cordovaFile.readAsArrayBuffer return error with Android Device$cordovaFile.readAsArrayBuffer 返回 Android 设备错误
【发布时间】:2017-07-07 23:32:47
【问题描述】:

我正在尝试将图像存储到 Firebase 存储,但我在使用 Android 设备时遇到了一些困难。它在 iOS 上运行良好。

问题是当我从库中选择图片时出现以下错误:

FileError {code: 1, message: "NOT_FOUND_ERR"}

这是我的代码:

$scope.fireStoreAvatar = function($sourceType) {

  if ($sourceType == 1) {

   var options = {
        quality: 100,
        destinationType: Camera.DestinationType.FILE_URI,
        sourceType: Camera.PictureSourceType.CAMERA,
        allowEdit: true,
        encodingType: Camera.EncodingType.JPEG,
        targetWidth: 1024,
        targetHeight: 1024,
        popoverOptions: CameraPopoverOptions,
        saveToPhotoAlbum: false,
        correctOrientation:true
      };

  } else {

    var options = {
          quality: 100,
          destinationType: Camera.DestinationType.FILE_URI,
          sourceType: Camera.PictureSourceType.PHOTOLIBRARY,
          allowEdit: true,
          encodingType: Camera.EncodingType.JPEG,
          targetWidth: 1024,
          targetHeight: 1024,
          popoverOptions: CameraPopoverOptions,
          saveToPhotoAlbum: false,
          correctOrientation:true
        };

  }
        // Get image from camera or library
        $cordovaCamera.getPicture(options).then(function(imageData) {


          var fileName = "";
          var path1 = "";
          var path2 = "";

          if ($ionicPlatform.is("android")) {

              $log.debug('android:');

              var path1     = cordova.file.cacheDirectory;
              var fileName  = imageData.replace(/^.*[\\\/]/,'');
              var path2     = imageData.replace(fileName,'');

          } else {

              $log.debug('ios:');

              path = cordova.file.tempDirectory;
              var fileName = imageData.replace(/^.*[\\\/]/,'');

          }

          $log.debug('$cordovaCamera.getPicture      => imageData:  ' + imageData);
          $log.debug('cordova.file.cacheDirectory    => path1:      ' + path1);
          $log.debug('imageData.replace(fileName,"") => path2:      ' + path2);
          $log.debug('                                  fileName:   ' + fileName);

          $cordovaFile.checkFile(path1, fileName)
           .then(function (data) {

              $log.info('checkFile(path1, fileName) => OK');
              $log.info(data);

           }, function (error) {

             $log.warn('checkFile(path1, fileName) => NOT OK');
             $log.error(error);

           });

           $cordovaFile.checkFile(path2, fileName)
            .then(function (data) {

               $log.info('checkFile(path2, fileName) => OK');
               $log.info(data);

            }, function (error) {

              $log.warn('checkFile(path2, fileName) => NOT OK');
              $log.error(error);

            });

          $cordovaFile.readAsArrayBuffer(path1, fileName)
          .then(function (data) {

            $log.info('readAsArrayBuffer(path1, fileName) => OK');
            $log.info(data);

            // success
          }, function (error) {
            // error
            $log.warn('readAsArrayBuffer(path1, fileName) => NOT OK');
            $log.error(error);

          });

          $cordovaFile.readAsArrayBuffer(path2, fileName)
          .then(function (data) {

            $log.info('readAsArrayBuffer(path2, fileName) => OK');
            $log.info(data);

            // success
          }, function (error) {
            // error
            $log.warn('readAsArrayBuffer(path2, fileName) => NOT OK');
            $log.error(error);

          });


      }, function(err) {
        // error
        $log.error("Upload error: " + err);
      });

}

我尝试了另一条路径 (path2),如果我使用设备相机拍照,则可以使用,但如果我从图库中选择图片,则无法使用。

从设备库中选择图片:

用设备相机拍照:

嗯,您可以观察到使用路径 2 和设备摄像头,$cordovaFile.readAsArrayBuffer 工作正常。

也许有人可以给我一些建议。 谢谢!

--

我试图按照 youtube 上的 Aaron Saunders 教程制作这个:

【问题讨论】:

  • 你发现这个问题了吗?

标签: angularjs firebase ionic-framework ngcordova


【解决方案1】:

再看看我的代码,你的实现中似乎缺少一些功能。

window.resolveLocalFileSystemURL(_imagePath, (fileEntry) => {})

https://github.com/aaronksaunders/firebaseStorage2/blob/master/src/pages/home/home.ts#L77

【讨论】:

  • 感谢您的回复亚伦。我正在使用 Ionic 1,在您的视频中您没有使用 window.resolveLocalFileSystemURL。我将尝试弄清楚 window.resolveLocalFileSystemURL 的工作原理并尝试实现它。我会回来回答的。再次感谢!
  • 我对使用 window.resolveLocalFileSystemURL 有一些疑问,因为在 Android 版本 >= 4.4 中引入了 MediaStore。媒体提供程序包含内部和外部存储设备上所有可用媒体的元数据,并返回 content:// URI。然后,如果您的文件浏览器提供 android 的本机 uri 内容,例如: content://com.google.android.apps.... 而不是 file:///path/to/myfile/ ,您将无法检索前一个路径的文件条目,因为cordova文件插件需要一个绝对文件路径。
  • 如果添加 将强制设备提供具有 file:/// 格式的 URI,我在徘徊。
  • 您找到解决问题的方法了吗?我有同样的错误:(imgur.com/a/FFgad
【解决方案2】:

我也尝试了 youtube 示例并得到了同样的错误。我已通过使用解决方法解决了此问题。请在下面找到详细信息。

下面的代码抛出了错误

$cordovaFile.readAsArrayBuffer(cordova.file.tempDirectory, fileName)

实际上 readAsArrayBuffer 需要 2 个参数 pathfile。所以我们可以使用一种解决方法,例如,在执行之前将 cordova.file.tempDirectory 替换为实际文件路径

data.replace(/^.*[\\\/]/, '');

示例:如果 data 的值为 file:///storage/sdcard0/Android/data/com.yourdomain/cache/1533902301139.jpg 然后使用下面的代码

$cordovaFile.readAsArrayBuffer('file:///storage/sdcard0/Android/data/com.yourdomain/cache', fileName)

对我来说只需更改一行代码即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-07
    • 2023-03-26
    • 2023-03-17
    相关资源
    最近更新 更多