由于javafxports媒体尚未实现,我正在寻找使用Android本机MediaPlayer来代替。有谁知道如何做到这一点。javafxports如何调用android本机媒体播放器
1
A
回答
5
如果您看看GoNative示例here(docs和code),您会发现一种将Android本机代码添加到JavaFX项目的方法。
这是将android.media.MediaPlayer
添加到使用胶子插件的JavaFX项目中的一个简单示例。
基于一个单一的视图项目,让我们添加第一个接口与所需的音频方法签名:
public interface NativeAudioService {
void play();
void pause();
void resume();
void stop();
}
现在,在我们看来,我们可以创建按钮来调用基于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");
}
}
现在,我们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);
}
}
}
最后,我们可以将项目部署到运行gradlew androidInstall
Android设备。
1
本机的音频播放器在下面的示例中使用:
https://gist.github.com/bgmf/d87a2bac0a5623f359637a3da334f980
除了一些先决条件,代码如下所示:
package my.application;
import my.application.Constants;
import javafx.beans.property.ReadOnlyObjectProperty;
import javafx.beans.property.ReadOnlyObjectWrapper;
import org.robovm.apple.avfoundation.AVAudioPlayer;
import org.robovm.apple.foundation.NSErrorException;
import org.robovm.apple.foundation.NSURL;
import org.robovm.apple.foundation.NSURLScheme;
import java.io.File;
import java.util.logging.Level;
import java.util.logging.Logger;
public class NativeAudioServiceIOS extends PathHelperIOS implements NativeAudioService {
private static final Logger LOG = Logger.getLogger(NativeAudioServiceIOS.class.getName());
private static final String DIR_NAME = Constants.OBJECTS_BASE_PATH;
private final ReadOnlyObjectWrapper<Status> status = new ReadOnlyObjectWrapper<>(this, "status", Status.STOP);
private String filename = null;
private AVAudioPlayer player = null;
public NativeAudioServiceIOS() {
super();
}
@Override
public void init(String filename) throws NativeServiceException {
this.filename = filename.startsWith("/") ? filename.substring(1) : filename;
LOG.warning("Called with file: " + filename);
status.set(Status.STOP);
try {
if(!filename.startsWith("/")) filename = "/" + filename;
File fullfile = new File(pathBase.getAbsolutePath() + filename);
if(fullfile.exists()) {
NSURL fullurl = new NSURL(NSURLScheme.File, "", fullfile.getAbsolutePath());
LOG.log(Level.SEVERE, "Loading URL: " + fullurl);
// Create audio player object and initialize with URL to sound
player = new AVAudioPlayer(fullurl);
LOG.log(Level.SEVERE, "Player initialized: " + player);
status.set(Status.STOP);
} else {
LOG.log(Level.WARNING, String.format("Audiofile doesn't exist: %s (%s/%s)",
fullfile.getAbsolutePath(),
pathBase.getAbsolutePath(),
filename));
player = null;
status.set(Status.ERROR);
}
} catch(NSErrorException error) {
LOG.log(Level.SEVERE, "Audio Setup Failed: " + error.toString(), error);
status.set(Status.ERROR);
}
}
@Override
public void play() throws NativeServiceException {
if(player == null) return;
player.play();
status.set(Status.PLAY);
}
@Override
public void pause() throws NativeServiceException {
if(player == null) return;
player.pause();
status.set(Status.PAUSE);
}
@Override
public void resume() throws NativeServiceException {
if(player == null) return;
player.play();
status.set(Status.PLAY);
}
@Override
public void stop() throws NativeServiceException {
if(player == null) return;
player.stop();
player.setCurrentTime(0.0);
status.set(Status.STOP);
}
@Override
public ReadOnlyObjectProperty<Status> statusProperty() {
return status.getReadOnlyProperty();
}
@Override
public Status getStatus() {
return status.get();
}
}
相关问题
- 1. Android:如何调用媒体播放器
- 2. Android手机默认媒体播放器
- 3. Android媒体播放器流媒体
- 4. 调整Android中的媒体播放器
- 5. Android媒体播放器不播放
- 6. Android媒体播放器“停止播放”
- 7. Android媒体播放器
- 8. Android媒体播放器库
- 9. Android媒体播放器seekbar
- 10. Android媒体播放器bug
- 11. Android媒体播放器setdatasource
- 12. RTSP Android媒体播放器
- 13. Android媒体播放器流
- 14. Android媒体播放器:如何收听媒体播放器事件?
- 15. Android:使用媒体播放器播放本地视频
- 16. Android的HTTP流媒体播放器的URL使用媒体播放器
- 17. Android媒体播放器重播选项
- 18. 如何使用YouTube视频更改媒体播放器和媒体播放器?
- 19. 一些媒体播放器如何在Android上播放wma
- 20. 如何在媒体播放器播放高清视频android
- 21. 如何让android媒体播放器播放声音?
- 22. 如何获得无缝播放?在Android媒体播放器
- 23. 阻止媒体播放器调用onCompletionListener
- 24. 通用Android媒体播放器 - UAMP
- 25. 媒体播放器的监听器 - Android
- 26. 媒体播放器/录音机(声子)
- 27. 如何使用自己的媒体播放器播放媒体作为默认
- 28. 尝试在没有媒体播放器的有效媒体播放器上调用getDuration android
- 29. android媒体播放器媒体控制器超时
- 30. 在Android应用程序中播放媒体播放器
- 完美。很棒。 –
我目前尝试实现它,如您所说,@josé-pereda - 但我无法找到Android类“MediaPlayer”。我为FXActivity编写了'compile'org.javafxports:jfxdvk:8.60.8'',但未能理解,还需要什么。我猜'android.jar',对吧?但究竟在哪里? (顺便说一句:我使用的Eclipse插件,如果这很重要。) – dzim
我能够实现它,通过添加此依赖项:'编译文件('libs/android-22.jar')'(其中数字22标记目标SDK)。但我明确需要在构建应用程序之前对此行进行评论,否则Retrolambda会崩溃...此外,我听不到任何事情,并且卷按钮事件似乎不会触发通常的音量上/下行为。 #edit:我在设置中提升了音量,但仍然听不到任何声音。我没有收到任何错误,所以一切似乎都没有问题,但无法正常工作...... – dzim