Ionic 7 -下载并播放带有音频控件的MP3文件

ego6inou  于 2023-06-20  发布在  Ionic
关注(0)|答案(1)|浏览(202)

我的服务器有一些MP3文件存储。
我希望我的应用程序能够下载并存储它们。
然后,用户可以选择播放哪个文件。我希望它能像Spotify一样。音频列表,用户单击以播放音频。
我使用Ionic's native File plugin将文件保存在this.file.dataDirectory

    • 正在下载文件**
this.http.sendRequest(url, {method: "get", responseType: "arraybuffer"}).then(
    res => {
      let blob = new Blob([res.data], {type: 'audio/mp3'});
      this.saveFile(blob);
    }
);
    • 正在保存文件**
this.file.createFile(folderPath, fileName, true).then(
    _ => {
      if(blob == null) {
        console.error("Downloaded file is null");
        reject(false);
      } else {
        this.file.writeFile(folderPath, fileName, blob, {replace: true}).then(_ => {
          console.log("File created");
        });
      }
})

我收到“文件已创建”的消息。很好!但是,我在“内部存储-> Android-> io. ionic. starter-> data”中看不到这些文件,但是如果我使用this.file.checkFile(folderPath, filename),它会返回true

    • 播放音频**

这是噩梦的一部分。当我给Javascript的Audio一个URL时,它工作得很好,就像:

let audioAsset = new Audio(audioLink);
audioAsset.play();

但它不适用于本地文件!

Not allowed to load local resource: file:///data/user/0/io.ionic.starter/files/myfile.mp3

我尝试NativeAudio,但收到“FileNotFoundException”。它的工作时,我有我的音频文件已经添加到资产文件夹,但不是那些我下载到“数据目录”。
一些论坛提到MediaObject,就像THIS ONE一样。但是,现在已经没有@ionic-native/media包了。现在好像是Enterprise Feature
这应该是一个非常简单的任务,但它正在成为一个噩梦与离子!谁能帮帮我?

igetnqfo

igetnqfo1#

几个小时后解决了这个问题。这里有一些提示,使离子开发人员的生活更容易。

**下载文件:**使用Native HTTP

import { HTTP } from '@awesome-cordova-plugins/http/ngx';

constructor(private http: HTTP) { }

this.http.sendRequest(url, {method: "get", responseType: "arraybuffer"}).then(
  res => { this.saveFile(new Blob([res.data], {type: 'audio/mp3')) }
);

**保存文件:**使用Native FileexternalApplicationStorageDirectory 作为文件夹

import { File } from '@awesome-cordova-plugins/file/ngx';

constructor(private file: File) {}

saveFile(blob) {
  let path = this.file.externalApplicationStorageDirectory;
  let filename = 'myfile.mp3';
  this.file.writeFile(path, filename, blob, {replace: true}).then(res => {/*code here*/})
}

最后,**播放音频:**原来 * 媒体 * 不仅是企业功能。HERE是社区版本。很难找到。干得不好,爱奥尼克...

import { Media, MediaObject } from '@awesome-cordova-plugins/media/ngx';
import { File } from '@awesome-cordova-plugins/file/ngx';

constructor(private media: Media, private file: File) {}

playSound() {
  let path = this.file.externalApplicationStorageDirectory;
  let filepath = `${path}/myfile.mp3`;
  let file: MediaObject = this.media.create(filepath);
  file.play();
}

不要忘记设置权限。以下是我的:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>

**BONUS ROUND:**通知栏上的音频控制很棒,对吧?有一个MediaSession API插件用于cordova HERE。感谢THIS GUY

相关问题