gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 14:45:51 26 4
gpt4 key购买 nike

由于 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com