让音乐应用程序在后台运行,iOS 和 Android?
Keep music app alive in background, iOS and Android?
我正在使用 Flutter 构建一个音乐播放应用程序。它帮助我作为一个单一的开发人员为两个平台构建一次应用程序。但是,我分别在两个平台上遇到了一些小问题。虽然我已经克服了其中的一些障碍,但我还是想不出一个主要的 bug/issue 只是为了制作音乐应用程序。如果应用程序不在前台,音乐不会改变。
我正在使用包:audioplayers (https://pub.dartlang.org/packages/audioplayers)。我的应用程序正在播放歌曲,mp3 文件在线托管并具有单独的链接。
第一首歌曲播放完毕后,AudioPlayerState.COMPLETED。我打个电话玩,新歌url。如果应用程序在前台,这可以正常工作,但如果应用程序在后台,则不起作用。这发生在最新版本的 iOS 上,我在 Android 5.0 上发现了这个问题(而不是在 Android 8.0+ 上)。在 Android Studio 的 运行 选项卡中,当我测试这个时,它确实显示已拨打电话,但歌曲没有播放,但是当我打开应用程序时,它确实显示更新的专辑封面,位于在 url 上(不在歌曲元数据中)。如果我调用 resume,从后台打开应用程序后,歌曲开始播放。
我不知道这是软件包的问题还是 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 一侧的单衬垫。
You need this code in either your first view controller's init or
viewDidLoad method:
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
Swift 3
UIApplication.sharedApplication().beginReceivingRemoteControlEvents()
Swift 4
UIApplication.shared.beginReceivingRemoteControlEvents()
将此代码添加到 iOS/Runner 目录中的 AppDelegate.m/AppDelegate.swift,就在 return.
之前
您只需在Xcode中启用“音频、Airplay 和画中画”,如下所示。您需要添加功能“后台模式”。您可以在“签名和功能”选项卡中找到它:
我正在使用 Flutter 构建一个音乐播放应用程序。它帮助我作为一个单一的开发人员为两个平台构建一次应用程序。但是,我分别在两个平台上遇到了一些小问题。虽然我已经克服了其中的一些障碍,但我还是想不出一个主要的 bug/issue 只是为了制作音乐应用程序。如果应用程序不在前台,音乐不会改变。
我正在使用包:audioplayers (https://pub.dartlang.org/packages/audioplayers)。我的应用程序正在播放歌曲,mp3 文件在线托管并具有单独的链接。
第一首歌曲播放完毕后,AudioPlayerState.COMPLETED。我打个电话玩,新歌url。如果应用程序在前台,这可以正常工作,但如果应用程序在后台,则不起作用。这发生在最新版本的 iOS 上,我在 Android 5.0 上发现了这个问题(而不是在 Android 8.0+ 上)。在 Android Studio 的 运行 选项卡中,当我测试这个时,它确实显示已拨打电话,但歌曲没有播放,但是当我打开应用程序时,它确实显示更新的专辑封面,位于在 url 上(不在歌曲元数据中)。如果我调用 resume,从后台打开应用程序后,歌曲开始播放。
我不知道这是软件包的问题还是 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 一侧的单衬垫。
You need this code in either your first view controller's init or viewDidLoad method:
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
Swift 3
UIApplication.sharedApplication().beginReceivingRemoteControlEvents()
Swift 4
UIApplication.shared.beginReceivingRemoteControlEvents()
将此代码添加到 iOS/Runner 目录中的 AppDelegate.m/AppDelegate.swift,就在 return.
之前您只需在Xcode中启用“音频、Airplay 和画中画”,如下所示。您需要添加功能“后台模式”。您可以在“签名和功能”选项卡中找到它: