Gluon Mobile VideoService在后台的iPhone上不起作用

时间:2019-01-14 22:42:59

标签: ios iphone playback gluon-mobile

我正在使用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上,相同的代码在活动模式和后台模式下都可以正常工作,而不会出现任何问题。

我想念什么?

1 个答案:

答案 0 :(得分:1)

为了能够在后台播放音频,并基于此answer,似乎当前的Charm Down Video服务需要进行一些修改,以便将类别设置为{{1} }。

一种可行的方法是通过从iOS Launcher类中修改AVAudioSessionCategory.PlaybackapplicationDidFinishLaunching插件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();
        });

应用程序应按预期在前景和背景模式下播放音频。