android - javafxports如何调用android原生的Media Player

标签 android javafx android-mediaplayer javafxports

由于 javafxports Media 尚未实现,我希望改用 Android Native MediaPlayer。有谁知道如何做到这一点。

最佳答案

如果您查看 GoNative 示例 here (docscode),您将找到一种将 Android native 代码添加到 JavaFX 项目的方法。

这是一个使用 Gluon 插件将 android.media.MediaPlayer 添加到 JavaFX 项目的简单示例。

基于单 View 项目,让我们先添加一个具有所需音频方法签名的接口(interface):

public interface NativeAudioService {
    void play();
    void pause();
    void resume();
    void stop();
}

现在,在我们的 View 中,我们可以创建按钮,以根据实现 NativeAudioService 接口(interface)的 AndroidNativeAudio 类的实例调用这些方法:

public class BasicView extends View {

    private NativeAudioService service;
    private boolean pause;

    public BasicView(String name) {
        super(name);

        try {
            service = (NativeAudioService) Class.forName("com.gluonhq.nativeaudio.AndroidNativeAudio").newInstance();
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException ex) {
            System.out.println("Error " + ex);
        }

        if (service != null) {
            final HBox hBox = new HBox(10, 
                    MaterialDesignIcon.PLAY_ARROW.button(e -> service.play()),
                    MaterialDesignIcon.PAUSE.button(e -> {
                        if (!pause) {
                            service.pause();
                            pause = true;
                        } else {
                            service.resume();
                            pause = false;
                        }
                    }),
                    MaterialDesignIcon.STOP.button(e -> service.stop()));
            hBox.setAlignment(Pos.CENTER);
            setCenter(new StackPane(hBox));
        } else {
            setCenter(new StackPane(new Label("Only for Android")));
        }
    }

    @Override
    protected void updateAppBar(AppBar appBar) {
        appBar.setNavIcon(MaterialDesignIcon.MUSIC_NOTE.button());
        appBar.setTitleText("Native Audio");
    }
}

现在,我们在 Android 文件夹下创建 native 类。它将使用 android API。它将尝试找到我们必须放在 /src/android/assets 文件夹下的音频文件 audio.mp3:

package com.gluonhq.nativeaudio;

import android.content.res.AssetFileDescriptor;
import android.media.AudioManager;
import android.media.MediaPlayer;
import java.io.IOException;
import javafxports.android.FXActivity;

public class AndroidNativeAudio implements NativeAudioService {

    private MediaPlayer mp;
    private int currentPosition;

    public AndroidNativeAudio() { }

    @Override
    public void play() {
        currentPosition = 0;
        try {
            if (mp != null) {
                stop();
            }
            mp = new MediaPlayer();
            AssetFileDescriptor afd = FXActivity.getInstance().getAssets().openFd("audio.mp3");

            mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
            mp.setAudioStreamType(AudioManager.STREAM_RING);
            mp.setOnCompletionListener(mp -> stop());
            mp.prepare();
            mp.start();
        } catch (IOException e) {
            System.out.println("Error playing audio resource " + e);
        }
    }

    @Override
    public void stop() {
        if (mp != null) {
            if (mp.isPlaying()) {
                mp.stop();
            }
            mp.release();
            mp = null;
        }
    }

    @Override
    public void pause() {
        if (mp != null) {
            mp.pause();
            currentPosition = mp.getCurrentPosition();
        }
    }

    @Override
    public void resume() {
        if (mp != null) {
            mp.start();
            mp.seekTo(currentPosition);
        }
    }
}

最后,我们可以将项目部署到运行 gradlew androidInstall 的 Android 设备上。

关于android - javafxports如何调用android原生的Media Player,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38419634/

相关文章:

java - 通过 Activity 传递对象 (Android)

java - 生产期间的 Logcat

tabs - JavaFX - TabPane/Tab 如何添加填充选项卡大小的内容?

java - 将 JSON 文件读入集合,最佳实践

java - Android Studio 中基本音乐播放器中的音频问题

Android MediaPlayer 问题 :"Error (-38 , 0) "和 "stop called in state 1"

android - 如何根据铃声音量设置android MediaPlayer音量?

android - 转到上一个 fragment 时如何避免关闭 Activity

android - 错误: Unable to fully sync the tree while cloning AOSP

JavaFX 11 : IllegalAccessError when creating Label