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 修改 applicationDidFinishLaunching
。 jfxmobile
插件 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
应用应按预期在前台和后台模式下播放音频。
我正在使用 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 修改 applicationDidFinishLaunching
。 jfxmobile
插件 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
应用应按预期在前台和后台模式下播放音频。