Gluon Mobile VideoService 无法在 iphone 后台运行

Gluon Mobile VideoService doesn't work on iphone in background

我正在使用 VideoService 在我的应用程序中播放本地音频文件 (mp3),并且在应用程序处于活动状态时它工作正常,在 Android 和 iPhone 上都是如此。但是在 iPhone 上,当应用程序在后台时它不起作用:调用 service.play() 时没有任何反应。 代码很简单:

            Services.get(VideoService.class).ifPresent(service -> {
                service.getPlaylist().add("1.mp3");
                service.play();
            });

我可以在我的 IDEA 控制台中看到 "AVPlayer hidden" 和 "AVPlayerStatusReadyToPlay"。

如果播放已经开始并且我将我的应用程序置于后台(使用 iPhone 的 "home" 按钮或通过关闭屏幕) - 它停止播放并仅在我将应用程序手动回到活动状态。

JavaDocs 说不需要特定的 iOS 配置,尽管我将 "audio" 放在 plist 的 UIBackgroundModes 数组中(也无济于事)。

iPhone6,iOS12.1 (16B92)

在 Android 上,相同的代码在活动模式和后台模式下都可以正常工作,没有任何问题。

我错过了什么?

为了能够在后台播放音频,并基于此 answer, it seems that the current Charm Down Video 服务需要进行一些修改,以便将类别设置为 AVAudioSessionCategory.Playback

一种可能的方法是通过 iOS 启动器 class 修改 applicationDidFinishLaunchingjfxmobile 插件 1.3.16 创建了这个启动器 here

所以我们可以修改 class,并构建一个自定义版本的 jfxmobile 插件,或者,正如评论中提到的 OP,可以创建一个自定义启动器。

另一种可能的方法是直接将其添加到 Charm Down 视频服务中,但这需要编译一个新版本。

让我们试试自定义启动器,因为它不需要构建新版本。

创建自定义启动器

让我们将默认启动器复制到我们的项目中,复制到 src/ios/java 文件夹中,因为它需要 iOS.

的一些特定依赖项

然后添加设置Playback选项所需的代码,从main class:

开始
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;
}

使用自定义启动器

如启动器 class 中所述,可以从 build.gradle 文件加载自定义启动器:

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')
        ...
    }
}

允许背景音频

要使应用程序 运行 在前台和后台播放音频,最后一个必要步骤是:修改 plist 文件。

我们需要将此密钥添加到 Default-info.plist 文件中:

<key>UIBackgroundModes</key>
        <array>
            <string>audio</string>
        </array>

测试

让我们向 src/main/resources/ 添加一个 mp3 文件,例如 1.mp3,并将此调用包含在我们的 Java 代码中:

Services.get(VideoService.class).ifPresent(service -> {
            service.getPlaylist().add("1.mp3");
            service.play();
        });

部署到 iOS 设备的时间:

./gradlew launchIOSDevice

应用应按预期在前台和后台模式下播放音频。