Java 如何使用libGDX在Android中加载音乐?
我想在带有libgdx库的android应用程序中加载mp3歌曲,但我找不到有效的方法。我不知道如何处理这个“问题” Assets Manager可能是mp3歌曲作品的最佳选择 我也这样发现:Java 如何使用libGDX在Android中加载音乐?,java,android,libgdx,Java,Android,Libgdx,我想在带有libgdx库的android应用程序中加载mp3歌曲,但我找不到有效的方法。我不知道如何处理这个“问题” Assets Manager可能是mp3歌曲作品的最佳选择 我也这样发现: Gdx.files.newMusic(file); 但在安卓系统中,不工作和桌面系统中,相同的代码工作 更新: 解析方法 public void parse() { JsonReader reader = new JsonReader(); JsonValue root
Gdx.files.newMusic(file);
但在安卓系统中,不工作和桌面系统中,相同的代码工作
更新:
解析方法
public void parse() {
JsonReader reader = new JsonReader();
JsonValue rootElem = reader.parse(file);
JsonValue songDataElem = rootElem.get("songData");
JsonValue notesDataElem = songDataElem.get("notes");
JsonValue barsDataElem = songDataElem.get("bars");
JsonValue keysDataElem = songDataElem.get("keys");
JsonValue audioDataElem = rootElem.get("audioData");
NoteData[] notes = new NoteData[notesDataElem.size];
for (int i = 0; i < notesDataElem.size; i++) {
notes[i] = new NoteData(notesDataElem.get(i).getInt("pitch"), notesDataElem.get(i).getFloat("time"));
}
BarData[] bars = new BarData[barsDataElem.size];
for (int i = 0; i < barsDataElem.size; i++) {
BarData bar = new BarData(barsDataElem.get(i).getFloat("time"));
bars[i] = bar;
}
char[] keys = new char[keysDataElem.size];
for (int i = 0; i < keysDataElem.size; i++) {
keys[i] = keysDataElem.getChar(i);
}
float tempo = songDataElem.getFloat("tempo");
String file = audioDataElem.getString("file");
songData = new SongData(notes, bars, keys, tempo);
parsed = true;
}
在主要类别中:
String file = "/storage/emulated/0/download/prueba.mp3";
SongFile songFile = new SongFile(new FileHandle(file));
songFile.parse();
song = songFile.makeSong();
要加载音乐实例,我们可以执行以下操作:
Music music = Gdx.audio.newMusic(Gdx.files.internal("data/mymusic.mp3"));
您还可以使用加载您的音乐
,以便以适当的方式管理您的资产
AssetManager manager = new AssetManager();
manager.load("data/mymusic.mp3", Music.class);
manager.finishLoading();
成功加载资产后,您可以获取音乐
Music music = manager.get("data/mymusic.mp3", Music.class);
可用于播放音乐的各种播放
music.play();
如果你在Android上有什么特别的问题,请检查这个。有时,声音
可能无法在Android设备上播放,但在桌面上,它确实可以播放
编辑
将此权限添加到AndroidMainfest.xml文件
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
编辑2
这段代码对我来说很好,希望它能对你起作用
//create()中的代码ApplicationListener的方法
if(Gdx.app.getType()== Application.ApplicationType.Android) {
String file = "/download/prueba.mp3";
FileHandle fileHandle = Gdx.files.external(file);
SongFile songFile = new SongFile(fileHandle);
songFile.parse();
song = songFile.makeSong();
}
SongFile
类的构造函数
public class SongFile {
AssetManager manager;
Music music;
public SongFile(FileHandle file){
manager = new AssetManager(new ExternalFileHandleResolver());
if (file.exists()) {
manager.load(file.path(), Music.class);
manager.finishLoading();
music = manager.get(file.path(), Music.class);
music.setLooping(true);
music.play();
}
}
...
}
这可能与代码无关,而是LibGDX中的方法。检查文件的扩展名、采样率和其他几个属性。有一些关于android没有在LibGDX中播放某些文件的线程。我也有这种想法,但我使用LibGDX已经有一段时间了,所以我可以准确地记住。@fatih ozcan的意思是检查android是否支持这种采样率和格式?而且我想只需要把文件放在某个文件夹里。也许可以使用流行的libgdxgithub项目中的音乐文件进行测试,这样您就知道它可以工作了。是的,您应该检查文件属性。这里和LibGDX论坛中也有一些相关的帖子。它与AssetManager或您放置它们的文件夹无关。它们可以直接位于资产文件夹中。但为了保持整洁,我将它们放在音频文件夹B中的资产文件夹中。AssetManager用于在加载过程中以非同步方式加载资产,以保持应用程序运行,而不是等待所有文件加载。你能指出一个好的github项目来说明这一点吗?因此,您可以查看如何只执行一次Assetmanager。(2) 对我来说,这里还有一条评论,展示了如何实现谷歌支付?谢谢@abhishek Aryangogle pay implementation与这个问题的主题不同,因此您需要为同一主题创建另一个主题。我不知道任何GitHub项目特别演示了如何使用AssetManager
使用Music
,您可以轻松地使用它,大部分代码都在回答中,还可以查看一下。如果你还有什么问题,可以在这里问。我不明白你的第一个问题。据我说,你不能在你的原生安卓系统的背景下播放youtube播放器的声音。Youtube是第三方应用程序,有自己的活动和服务,在他自己的环境下工作,你无法获得他的服务和使用。我解释说我在手机上写的非常糟糕,无法显示代码示例。我试试你的代码,谢谢你:D
if(Gdx.app.getType()== Application.ApplicationType.Android) {
String file = "/download/prueba.mp3";
FileHandle fileHandle = Gdx.files.external(file);
SongFile songFile = new SongFile(fileHandle);
songFile.parse();
song = songFile.makeSong();
}
public class SongFile {
AssetManager manager;
Music music;
public SongFile(FileHandle file){
manager = new AssetManager(new ExternalFileHandleResolver());
if (file.exists()) {
manager.load(file.path(), Music.class);
manager.finishLoading();
music = manager.get(file.path(), Music.class);
music.setLooping(true);
music.play();
}
}
...
}