Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
爱奥尼亚3在Android中读取URL为base64_Android_Ionic Framework_Ionic3_Cordova Plugins - Fatal编程技术网

爱奥尼亚3在Android中读取URL为base64

爱奥尼亚3在Android中读取URL为base64,android,ionic-framework,ionic3,cordova-plugins,Android,Ionic Framework,Ionic3,Cordova Plugins,我正在使用Ionic 3摄像头和文件插件来处理用户Android gallery应用程序中的图像选择。该插件返回一个文件uri,我想使用该文件uri使用该文件插件提取base64编码的图像,但当我尝试从缓存目录读取该文件时,会出现NOT_FOUND_错误。下面是我的代码示例和一些日志输出: this.camera.getPicture(this.getCameraOptionsForPhotoLibrary()).then((fileUri: string) => { const f

我正在使用Ionic 3摄像头和文件插件来处理用户Android gallery应用程序中的图像选择。该插件返回一个文件uri,我想使用该文件uri使用该文件插件提取base64编码的图像,但当我尝试从缓存目录读取该文件时,会出现NOT_FOUND_错误。下面是我的代码示例和一些日志输出:

this.camera.getPicture(this.getCameraOptionsForPhotoLibrary()).then((fileUri: string) => {

  const fileNameIndex: number = fileUri.lastIndexOf('/') + 1;

  // file:///storage/emulated/0/Android/data/com.myDomain.myApp/cache/
  const cacheDirectoryFromFileUri = fileUri.substring(0, fileNameIndex );

  //  FB_IMG_1532921240445.jpg?1532982282636 
  const fileName = fileUri.substring(fileNameIndex);

  this.file.readAsDataURL(cacheDirectoryFromFileUri, fileName).then(base64 => {
    alert('base64 cacheDirectoryFromFileUri success: ' + JSON.stringify(base64));
  }, err => {
    alert('base64 cacheDirectoryFromFileUri err: ' + JSON.stringify(err));
  });

请让我知道我可以提供更多信息来帮助进行故障排除。

在尝试复制您的错误时,我没有收到“未找到”错误

尽管如此,这个代码块

this.camera.getPicture(this.getCameraOptionsForPhotoLibrary()).then((fileUri: string) => {

  const fileNameIndex: number = fileUri.lastIndexOf('/') + 1;

  // file:///storage/emulated/0/Android/data/com.myDomain.myApp/cache/
  const cacheDirectoryFromFileUri = fileUri.substring(0, fileNameIndex );

  //  FB_IMG_1532921240445.jpg?1532982282636 
  const fileName = fileUri.substring(fileNameIndex);

  this.file.readAsDataURL(cacheDirectoryFromFileUri, fileName).then(base64 => {
    alert('base64 cacheDirectoryFromFileUri success: ' + JSON.stringify(base64));
  }, err => {
    alert('base64 cacheDirectoryFromFileUri err: ' + JSON.stringify(err));
  });
}
给了我这个错误

base64 cacheDirectoryFromFileUri err: {"code":5,"message":"ENCODING_ERR"}
我在使用这些选项

{
  quality: 100,
  destinationType: this.camera.DestinationType.FILE_URI,
  encodingType: this.camera.EncodingType.JPEG,
  mediaType: this.camera.MediaType.ALLMEDIA,
  sourceType: this.camera.PictureSourceType.PHOTOLIBRARY
}
下一行

const cacheDirectoryFromFileUri = fileUri.substring(0, fileNameIndex );
给了我这样的东西

/storage/emulated/0/WhatsApp/Media/WhatsApp Images/
将该行更改为以下内容时

const cacheDirectoryFromFileUri = 'file://'+fileUri.substring(0, fileNameIndex );
解决了这个问题

或者,如果您在从相机获取图像后试图从缓存中获取图像,并希望获取base64编码字符串,则可以使用:DATA\u URL

destinationType: this.camera.DestinationType.DATA_URL

我无法按照描述的方式复制Patra的答案,但自从我第一次发布以来,我确实设法通过测试提取了一些有用的信息

在某些情况下,我发现如果我删除了后面的数字?(FB_IMG_1532921240445.jpg?1532982282636),结果已成功返回。但这取决于几个设备/配置场景。例如,如果我释放APK,它在像素2上的Oreo上失败。事实上,它在没有调用错误回调的情况下失败,所以我甚至无法处理失败。但由于某些原因,如果我在同一设备上使用-lc标志从CLI构建,它将按预期返回base64结果

在测试7.0和7.1仿真设备时,无论构建配置如何,它都能按预期工作

令人沮丧的是,设备和配置之间的行为明显不同。我对livereload的差异特别好奇,如果有人知道为什么文件插件行为会基于这个标志发生变化,那就太好了

我仍在努力解决这个问题,虽然除了打开插件,我不知道该去哪里。我尝试过Base64本机插件,它一开始似乎可以工作,但它似乎没有被积极管理,根据github页面,还有很多未解决的问题。我可能最终使用文件和Base64插件的组合来获得我现在需要的东西

/**更新**/

我们团队的一名成员在这里找到了问题的具体答案:

如果此链接曾经中断,我们将采取以下措施修复它:

将cordova.js放在index.html中polyfills.js之后


多可怕的虫子啊

看起来相机返回了不同的文件路径,这取决于设备。但是我看不出我的readAsDataUrl参数和你的有什么不同。你得到的完整文件名是什么?