cordova 离子4原生音频找不到我的mp3文件

xxe27gdn  于 2022-11-15  发布在  其他
关注(0)|答案(5)|浏览(169)

我尝试使用@ionic-native/native-audio与下面的代码加载我的mp3文件
https://ionicframework.com/docs/native/native-audio/

this.nativeAudio.preloadSimple(‘sound2’, ‘assets/sound2.mp3’.then(() => {
  console.log(‘preload success’)
}, (err) => {
  console.log(err);
});

然而,我得到一个错误时,预加载的mp3 java.io.FileNotFoundException: www/assets/sound2.mp3,我敢肯定的sound2.mp3是放在/src/assets/sound2.mp3www/assets/sound2.mp3有人有什么想法吗?

iqih9akk

iqih9akk1#

快速修复

请访问:“您的应用程序\安卓\电容器-cordova-安卓插件\src\main\java\com\rjfun\cordova\插件\本机音频\本机音频. java”
然后:更改代码行

String fullPath = "www/".concat(assetPath)

String fullPath = "public/".concat(assetPath);
e3bfsja2

e3bfsja22#

Ionic 6.18.1cordova-plugin-nativeaudio@3.0.9Capacitor 3.3.2也有同样的问题。旧的Cordova插件经常出现这样的问题,所以最好添加一个钩子来修复,这样就不需要在每个sync之后手动修改它了。
scripts块中的package.json相加:
"capacitor:sync:after": "node ./scripts/fix-audio-plugin.js"
将新文件添加到scripts/fix-audio-plugin.js

const fs = require("fs");

const fixPathInFile = (filePath) => {
  let content = fs.readFileSync(filePath, 'utf8');
  if (content) {
    let replaced = false;
    content = content.replaceAll('www', () => {
      replaced = true;
      return 'public';
    });
    if (replaced) {
      fs.writeFileSync(filePath, content);
    }
  } else {
    console.error('file NativeAudio not found!');
  }
}

if (process.env.CAPACITOR_PLATFORM_NAME === 'android') {
  let filePath = './android/capacitor-cordova-android-plugins/src/main/java/com/rjfun/cordova/plugin/nativeaudio/NativeAudio.java';
  fixPathInFile(filePath);
} else if (process.env.CAPACITOR_PLATFORM_NAME === 'ios') {
  let filePath = './ios/capacitor-cordova-ios-plugins/sources/CordovaPluginNativeaudio/NativeAudio.m';
  fixPathInFile(filePath);
}

然后运行ionic cap sync

xpcnnkqh

xpcnnkqh3#

尝试以下方法访问Android设备的“www/assets”:

let filePath = this.file.applicationDirectory + 'public/assets/';

如果不工作,尝试复制文件之前与文件 cordova 插件:

import { File } from "@ionic-native/file/ngx";

constructor(private file: File) { }

yourFonction(){
if(this.platform.is('android')){
  let filePath = this.file.applicationDirectory + 'public/assets/';

  this.file.copyFile(filePath, fileName, this.file.externalCacheDirectory, fileName)
    .then( () => alert('File copied in :' +  this.file.externalCacheDirectory))
    .catch(e => alert("Error copying file => " + JSON.stringify(e));

    //then perform audio preload accessing the copied file in device storage

}else{
    IOS device action...
}
4dc9hkyq

4dc9hkyq4#

听起来像https://forum.ionicframework.com/t/native-audio-asset-not-found-ios/78817/16其中说的这个。

解决方案Cordova Native Audio插件需要一个assets“www”文件夹。但在Ionic Capacitor项目中,它被命名为“public”。由于插件将此值硬编码,下面链接中的解决方案告诉您深入每个平台中的插件源代码,并将“www”替换为“public”。

或者,将符号链接从“www”文件夹添加到平台main/assets位置中的“public”文件夹。
有关详细信息,请参阅本期:https://github.com/ionic-team/ionic-native/issues/2685

q8l4jmvw

q8l4jmvw5#

有时我们会遇到这类插件问题。要解决这个问题,我们必须编辑源文件夹中的本地代码。
1.电容器使用“public/...”而不是“www/...”(cordova使用的)。
1.希望你在电容器项目。
1.请转到{项目文件夹}/节点模块/cordova插件本机音频/源代码/android。
1.打开NativeAudio.java。搜索“字符串完整路径”并将“www”替换为“public”。运行“ionic cap sync android”。
1.就是这样。现在您的文件可以在原生应用程序中访问。
还有一个问题。我不能播放mp3文件。但是wav文件可以。它是如何工作的?

相关问题