我正在使用VideoService在我的应用程序中播放本地音频文件(mp3),并且在该应用程序处于活动状态时(在Android和iPhone上)都可以正常工作。但是在iPhone上,当应用程序在后台运行时将无法使用:调用service.play()时不会发生任何事情。 代码很简单:
Services.get(VideoService.class).ifPresent(service -> {
service.getPlaylist().add("1.mp3");
service.play();
});
我可以在我的IDEA控制台中看到“隐藏的AVPlayer”和“ AVPlayerStatusReadyToPlay”。
如果播放已经开始并且我将应用程序置于后台(使用iPhone的“主页”按钮或关闭屏幕),则该播放器将停止播放并仅在我手动将应用程序恢复为活动状态后恢复运行。
>JavaDocs表示不需要特定的iOS配置,尽管我在plist的UIBackgroundModes数组中放入了“音频”(也没有帮助)。
iPhone 6,iOS 12.1(16B92)
在Android上,相同的代码在活动模式和后台模式下都可以正常工作,而不会出现任何问题。
我想念什么?
答案 0 :(得分:1)
为了能够在后台播放音频,并基于此answer,似乎当前的Charm Down Video服务需要进行一些修改,以便将类别设置为{{1} }。
一种可行的方法是通过从iOS Launcher类中修改AVAudioSessionCategory.Playback
。 applicationDidFinishLaunching
插件1.3.16创建了启动器here。
因此,我们可以修改该类,并构建jfxmobile
插件的自定义版本,或者,正如注释中提到的OP一样,可以创建自定义启动器。
另一种可能的方法是将其直接添加到Charm Down视频服务中,但这将需要编译新版本。
让我们尝试自定义启动器,因为它不需要构建新版本。
创建CustomLauncher
让我们将默认启动器复制到我们的项目中,复制到jfxmobile
文件夹中,因为它需要iOS的某些特定依赖项。
然后添加所需的代码以设置src/ios/java
选项,从主类开始:
Playback
使用自定义启动器
如启动器类中所述,可以从private static final Class<? extends Application> mainClass = your.package.YourGluonApplication.class;
private static final Class<? extends Preloader> preloaderClass = null;
@Override
public boolean didFinishLaunching(UIApplication application,
UIApplicationLaunchOptions launchOptions) {
// Audio settings to play in background mode ---
try {
AVAudioSession session = AVAudioSession.getSharedInstance();
session.setActive(true);
session.setCategory(AVAudioSessionCategory.Playback);
} catch (NSErrorException nse) {
System.out.println("Error AVAudioSession " + nse);
nse.printStackTrace();
}
// --- End Audio settings
Thread launchThread = new Thread() { ... }
launchThread.setDaemon(true);
launchThread.start();
return true;
}
文件中加载自定义启动器:
build.gradle
允许背景音频
获取音频的最后一个必需步骤,不仅是在应用程序在前台运行时,而且还在后台运行时:修改plist文件。
我们需要将此密钥添加到jfxmobile {
downConfig {
version = '3.8.6'
plugins 'display', 'lifecycle', 'statusbar', 'storage', 'video'
}
ios {
javafxportsVersion = '8.60.11'
launcherClassName = 'your.package.CustomLauncher'
infoPList = file('src/ios/Default-Info.plist')
...
}
}
文件中:
Default-info.plist
测试
让我们像<key>UIBackgroundModes</key>
<array>
<string>audio</string>
</array>
一样向src/main/resources/
添加一个mp3文件,并将此调用包括在我们的Java代码中:
1.mp3
部署到iOS设备的时间:
Services.get(VideoService.class).ifPresent(service -> {
service.getPlaylist().add("1.mp3");
service.play();
});
应用程序应按预期在前景和背景模式下播放音频。