Gluon Mobile VideoService не работает на iphone в фоновом режиме - PullRequest
0 голосов
/ 15 января 2019

Я использую VideoService для воспроизведения локального аудиофайла (mp3) в моем приложении, и он работает нормально, пока приложение активно, как на Android, так и на iPhone. Но на iPhone, когда приложение находится в фоновом режиме, оно не работает: ничего не происходит, когда вызывается service.play (). Код тривиален:

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

Я вижу «AVPlayer скрытый» и «AVPlayerStatusReadyToPlay» в консоли моей IDEA.

Если воспроизведение уже началось, и я переместил свое приложение в фоновый режим (используя кнопку «Домой» на iPhone или выключив экран) - оно прекращает воспроизведение и возобновляет работу только после того, как я верну приложение в активное состояние вручную.

JavaDocs говорит, что никакой конкретной конфигурации iOS не требуется, хотя я поместил «audio» в массив plist UIBackgroundModes (тоже не помогает).

iPhone 6, iOS 12.1 (16B92)

На Android один и тот же код работает без проблем как в активном, так и в фоновом режимах.

Чего мне не хватает?

1 Ответ

0 голосов
/ 17 января 2019

Чтобы иметь возможность воспроизводить аудио в фоновом режиме и на основе этого ответа , кажется, что текущая служба Charm Down Видео требует некоторых модификаций, чтобы установить категорию на AVAudioSessionCategory.Playback.

Один из возможных способов сделать это - изменить applicationDidFinishLaunching из класса iOS Launcher. Плагин jfxmobile 1.3.16 создает этот модуль запуска здесь .

Таким образом, мы можем изменить этот класс и создать собственную версию плагина jfxmobile, или, как указано в комментариях к ОП, можно создать пользовательский модуль запуска.

Другой возможный способ - добавить это непосредственно в видеосервис Charm Down, но для этого потребуется скомпилировать новую версию.

Давайте попробуем пользовательский лаунчер, так как он не потребует создания новых версий.

Создание CustomLauncher

Давайте скопируем средство запуска по умолчанию в наш проект, в папку 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>

Тест

Давайте добавим mp3-файл к src/main/resources/, например 1.mp3, и включим этот вызов в наш код Java:

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

Время для развертывания на устройстве iOS:

./gradlew launchIOSDevice

Приложение должно воспроизводить звук как в переднем, так и в фоновом режиме, как и ожидалось.

...