Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用libGDX在Android中加载音乐?_Java_Android_Libgdx - Fatal编程技术网

Java 如何使用libGDX在Android中加载音乐?

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

我想在带有libgdx库的android应用程序中加载mp3歌曲,但我找不到有效的方法。我不知道如何处理这个“问题”

Assets Manager可能是mp3歌曲作品的最佳选择

我也这样发现:

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();
        }
    }

    ...
}