[英]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 的“主頁”按鈕或通過關閉屏幕) - 它停止播放並僅在我手動將應用程序恢復到活動狀態后恢復。
JavaDocs 說不需要特定的 iOS 配置,盡管我將“音頻”放在 plist 的 UIBackgroundModes 數組中(也沒有幫助)。
iPhone 6,iOS 12.1 (16B92)
在 Android 上,相同的代碼在活動和后台模式下都可以正常工作,沒有任何問題。
我錯過了什么?
為了能夠在后台播放音頻,並基於此答案,似乎當前的 Charm Down Video Service 需要進行一些修改,以便將類別設置為AVAudioSessionCategory.Playback
。
一種可能的方法是從 iOS Launcher 類修改applicationDidFinishLaunching
。 jfxmobile
插件 1.3.16 在這里創建了這個啟動器。
所以我們可以修改那個類,並構建一個自定義版本的jfxmobile
插件,或者,正如評論中提到的 OP,可以創建一個自定義啟動器。
另一種可能的方法是將其直接添加到 Charm Down 視頻服務中,但這需要編譯一個新版本。
讓我們嘗試自定義啟動器,因為它不需要構建新版本。
創建自定義啟動器
讓我們將默認啟動器復制到我們的項目中,到src/ios/java
文件夾中,因為它需要一些特定的 iOS 依賴項。
然后添加所需的代碼來設置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
文件加載:
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
應用程序應按預期在前台和后台模式下播放音頻。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.