我正在使用Flutter构建一个音乐播放应用程序。它帮助我作为一个开发人员为两个平台构建一次应用程序。然而,我在两个平台上分别遇到了一些小问题。虽然我已经克服了其中一些道路颠簸,但我无法找出一个主要的错误/问题,只是出于制作音乐应用程序的目的。如果应用不在前台,音乐不会改变。
我正在使用这个包:audioplayers(https://pub.dartlang.org/packages/audioplayers)。我的应用程序是流媒体歌曲,mp3文件在线托管并具有单独的链接。
当第一首歌完成播放时,AudioPlayerState.COMPLETED。我用新歌的网址打电话来玩。如果应用程序在前台,这可以正常工作,但如果应用程序在后台,则无效。这发生在最新版本的iOS上,我在Android 5.0上发现了这一点(不是在Android 8.0+上)。在Android Studio的RUN选项卡中,当我测试它时,它确实显示我正在进行通话,但是歌曲没有播放但是当我打开应用程序时它确实显示更新的专辑封面,它也位于网址上(不在歌元数据)。如果我打电话给简历,在从后台打开应用程序后,歌曲就会开始播放。
我不知道这是包的问题还是iOS的问题,我在包Github上打开了一个问题。但是我相信它是iOS的东西,因为如果应用程序被最小化直到我检查Xcode中的背景音频之前它没有播放歌曲。
import 'package:flutter/material.dart';
import 'package:audioplayers/audioplayers.dart';
import 'dart:math';
AudioPlayer audioPlayer = new AudioPlayer();
class MusicPlay {
MusicPlay() {
_initAudioPlayer();
}
play(String audioURL) async {
int result = await audioPlayer.play(audioURL);
if (result == 1) {
// success
}
}
nextSong() async {
play(String nextAudioURL)
}
void _initAudioPlayer() {
audioPlayer.audioPlayerStateChangeHandler = (AudioPlayerState state) {
switch (state) {
case AudioPlayerState.PLAYING:
break;
case AudioPlayerState.PAUSED:
break;
case AudioPlayerState.STOPPED:
break;
case AudioPlayerState.COMPLETED:
nextSong();
break;
}
};
}
}
解决方案是iOS端的单线程。
您需要在第一个视图控制器的init或viewDidLoad方法中使用此代码:
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
https://stackoverflow.com/a/9721032/6024667
斯威夫特3
UIApplication.sharedApplication().beginReceivingRemoteControlEvents()
斯威夫特4
UIApplication.shared.beginReceivingRemoteControlEvents()
将此代码添加到iOS / Runner目录中的AppDelegate.m / AppDelegate.swift,就在返回之前。