由于 javafxports Media 尚未实现,我希望改用 Android Native MediaPlayer。有谁知道如何做到这一点。
最佳答案
如果您查看 GoNative 示例 here (docs 和 code),您将找到一种将 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/