Ionic 2 / iOS - 本机音频在cordova.file.dataDirectory中找不到文件

问题描述 投票:4回答:2

我正在使用cordova-plugin-nativeaudio在应用程序中播放音频。当我尝试使用iOS设备预加载文件时:

preload('testsound', cordova.file.dataDirectory + "audio/0/Hello.mp3");

我收到的错误是:

错误:未处理的承诺拒绝:( NATIVE AUDIO)未找到资产。 (file:/// var / mobile / Containers / Data / Application /“[GUID] /Library/NoCloud/audio/0/Hello.mp3); Zone :;任务:setTimeout;值:(NATIVE AUDIO)未找到资产。(file:/// var / mobile / Containers / Data / Application / [GUID] /Library/NoCloud/audio/0/Hello.mp3)

目标文件

目标文件(audio / 0 / Hello.mp3)从外部URL下载并存储在cordova.file.dataDirectory中。它已成功下载为以下控制台输出:

下载完成:file:/// var / mobile / Containers / Data / Application / [GUID] /Library/NoCloud/audio/0/Hello.mp3

为了确保它确实存储在预期的位置,我检查了:

this.file.checkFile(cordova.file.dataDirectory, "audio/0/Hello.mp3")

控制台输出显示它已成功存储:

file:/// var / mobile / Containers / Data / Application / [GUID] /Library/NoCloud/audio/0/Hello.mp3文件确实存在!

现在我尝试用本机音频预加载文件,我得到上面的错误(这个问题中的第一个错误)。

问题似乎是存储文件的位置

我也尝试从本地applicationDirectory(/www/assets/audio/0/Hello.mp3)预加载,预加载工作正常。但是applicationDirectory是只读目录,因此我无法从外部URL下载音频并将其保存在那里。

本机音频应支持从url(不仅是本地applicationDirectory)预加载,因为它在Ionic API文档中声明。

screenshot of the API doc of preload function

我在模拟器和iOS设备上都遇到了同样的错误。

有没有人遇到同样的问题,并设法解决它?

谢谢你的帮助。 BR /

cordova audio ionic-framework ionic2 ionic3
2个回答
3
投票

在iOS中,如果您需要在序列或转换过程中同步播放声音,那么对我来说唯一有用的是Native Audio preloadComplex和my / asset中的文件。

import { NativeAudio } from '@ionic-native/native-audio';

...

let id = new Date().toISOString();
this.nativeAudio.preloadComplex(id, 'assets/file.m4a', 1, 1, 0).then(() => {
  this.nativeAudio.play(id, () => {
    this.nativeAudio.unload(id).then(() => {
      // Next step
    });
  });
});

如果声音可以异步播放并且是用户录制的,那么对我来说唯一有用的就是Media Plugin。

import { Media, MediaObject } from '@ionic-native/media';

...

if (this.mediaObject) {
  this.mediaObject.release();
}      
this.mediaObject = this.media.create('../Library/NoCloud/MediaFiles/file.m4a');
this.mediaObject.play();

...

ionViewDidLeave() {
  if (this.mediaObject) {
    this.mediaObject.release();
  }
}

2
投票

我找到了一个解决方法,即使用Media plugin而不是Native音频来播放mp3文件。

虽然Media插件似乎有同样的问题 - 你无法访问带有iOS的cordova.file.dataDirectory,并且在this Jira中讨论过 - 至少有一个解决方法,即使用.toInternalURL()。

toInternalURL:返回表单文件中的路径:/// persistent / path / to / entry(Firefox,IE)。 Chrome以cdvfile:// localhost / persistent / file格式返回路径。

cordova.file.dataDirectory(file:/// var / mobile / Containers / Data / Application / [GUID] / Library / NoCloud)的internalURL是“cdvfile:// localhost / library-nosync /”

所以通过替换:

storageDirectory = cordova.file.dataDirectory;

有:

storageDirectory = "cdvfile://localhost/library-nosync/"

现在媒体插件可以加载和播放下载并存储在带有iOS设备的cordova.file.dataDirectory中的mp3文件。

audioMedia = new MediaPlugin(storageDirectory + "test.mp3");

audioMedia.play();

P.S.1截至2017年6月,这是一个有效的解决方案。

P.2.2我曾尝试将internalURL与Native Audio一起使用,但是没有用。