javafxports如何调用android原生Media Player

Mik*_*phy 1 android javafx android-mediaplayer javafxports

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

Jos*_*eda 5

如果您在这里查看GoNative示例(文档代码),您将找到一种方法将Android本机代码添加到JavaFX项目中.

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

基于Single View项目,我们首先添加一个包含所需音频方法签名的界面:

public interface NativeAudioService {
    void play();
    void pause();
    void resume();
    void stop();
}
Run Code Online (Sandbox Code Playgroud)

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

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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