我正在使用 Codename One 将一个 Java 游戏移植到移动设备上,并一直在尝试使用另一个线程的代码使用该框架制作一个音频播放器。我这样做遇到了很多麻烦,主要是使用 MediaManager。这是代码:
package com.example.audio;
import java.io.IOException;
import java.io.InputStream;
import com.codename1.io.FileSystemStorage;
import com.codename1.media.Media;
import com.codename1.media.MediaManager;
import com.codename1.ui.Display;
public class AudioPlayer {
private Media MEDIA = null;
public void playAudio(String fileName) {
try {
if (MEDIA == null) {
InputStream is = FileSystemStorage.getInstance().openInputStream(fileName);
MEDIA = MediaManager.createMedia(is, "audio/mp3", new Runnable() {
@Override
public void run() {
MEDIA = null;
}
});
}
if (MEDIA != null && MEDIA.isPlaying() == false) {
MEDIA.setVolume(100);
MEDIA.play();
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
AudioPlayer 实例化的类:
public AudioPlayer audioPlayer = new AudioPlayer(); //audio player
public Game() {
changeState(sceneNum);
audioPlayer.playAudio(FileSystemStorage.getInstance().getAppHomePath() + "res/Sounds/fluffingADuck.wav");
...
这就是堆栈跟踪给我的内容
java.io.IOException
at com.codename1.impl.javase.JavaSEPort.createMedia(JavaSEPort.java:9535)
at com.codename1.ui.Display.createMedia(Display.java:3705)
at com.codename1.media.MediaManager.createMedia(MediaManager.java:306)
at com.example.audio.AudioPlayer.playAudio(AudioPlayer.java:16)
at com.example.myapp.Game.<init>(Game.java:32)
at com.example.myapp.Game.getGame(Game.java:41)
at com.example.myapp.MyApp.runApp(MyApp.java:14)
at com.codename1.system.Lifecycle.start(Lifecycle.java:129)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at com.codename1.impl.javase.Executor$3$2.run(Executor.java:340)
at com.codename1.ui.Display.executeSerialCall(Display.java:1395)
at com.codename1.ui.Display.processSerialCalls(Display.java:1379)
at com.codename1.ui.Display.mainEDTLoop(Display.java:1166)
at com.codename1.ui.RunnableWrapper.run(RunnableWrapper.java:120)
at com.codename1.impl.CodenameOneThread.run(CodenameOneThread.java:176)
我将其中一个声音转换为 mp3,因为我认为 CN1 可能无法识别 wav,但这也没有解决问题。我使用几乎相同的方法来检索游戏图像,效果很好。不知道该怎么做,如果有人能给我指出正确的方向或提供任何帮助,那就意义重大。我对编程还是有点菜鸟。如果有人也想看一下,这里是 github 存储库:https://github.com/stefancohn/DuckWorldMobile
您似乎将
FileSystemStorage
与资源混淆了。这些是不同的概念。像您的声音这样的资源,作为最终捆绑包(例如 jar)的一部分打包到您的应用程序中,并且您可以在设备上使用 API 来获取资源。
FileSystemStorage
访问设备上可用的文件系统。在这里,您首先需要以某种方式编写或创建文件,以便您可以使用它。
还有其他问题:
您的资源处于层次结构中。 Codename One 不支持此功能,因为某些打包系统 (iOS) 的行为略有不同。所以你不能嵌套文件,需要将它们全部放在一个目录中。
您将该目录命名为
res
而不是 resources
。
它需要位于
main
和java
目录旁边的css
下
澄清一下,文件
fluffingADuck.wav
必须位于 common/src/main/resources/fluffingADuck.wav
中,以下代码才能正常工作。
现在您需要修复代码以使用资源,这实际上非常简单:
audioPlayer.playAudio("/fluffingADuck.wav");
注意开头的
/
。是故意的。
然后您需要做的就是将
InputStream
行更改为:
InputStream is = getClass().getResourceAsStream(fileName);