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

时间:2017-05-13 16:47:13

标签: java android libgdx

我想在带有libgdx库的Android应用程序中加载mp3歌曲,但我找不到工作方式。我不知道如何编程这个“问题”。

资产经理可以成为使用mp3歌曲的作品吗?

我也是这样找到的:

Gdx.files.newMusic(file); 

但在Android中不起作用,桌面代码也相同。

更新: 解析方法

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

和构造函数:

 public SongFile(FileHandle file) {
    manager = new AssetManager(new ExternalFileHandleResolver());
    file = Gdx.files.external(file.path());//30
    if (file.exists()) {
        manager.load(file.path(), Music.class);
        manager.finishLoading();
        music = manager.get(file.path(), Music.class);
        music.setLooping(true);
        music.play();
    }

}

在主要课程中:

String file = "/storage/emulated/0/download/prueba.mp3";
SongFile songFile = new SongFile(new FileHandle(file));
songFile.parse();
song = songFile.makeSong();

1 个答案:

答案 0 :(得分:2)

要加载音乐实例,我们可以执行以下操作:

Music music = Gdx.audio.newMusic(Gdx.files.internal("data/mymusic.mp3"));

您还可以使用AssetManager加载Music,以便以适当的方式管理资产。

AssetManager manager = new AssetManager();
manager.load("data/mymusic.mp3", Music.class);
manager.finishLoading();

您可以在成功加载资源后获取音乐。

Music music = manager.get("data/mymusic.mp3", Music.class);

可用于播放音乐的各种播放attributes

music.play();

如果您在Android上遇到某些特定问题,请检查此thread。有些时候Sound可能无法在Android设备上播放,但在桌面设备上,它确实可以播放。

修改

将此权限添加到AndroidMainfest.xml文件中。

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

在继续执行与文件IO相关的任何工作之前,如果没有在用户运行时获取权限,则说明Android的targetSdkVersion小于23。对于当前的targetSdkVersion,检查你的default build.gradle文件的defaultConfig,如果没有出现他们的check AndroidManifest.xml文件。

外部目的地是我们保留自己的数据的地址,如视频,音乐等。

Gdx.files.getExternalStoragePath()在Android上提供路径/storage/emulated/0/,在桌面上提供用户目录,如C:\Users\Abhishek Aryan\

/storage/emulated/0/表示内置存储和下载位于内置存储中。

if(Gdx.app.type==Application.ApplicationType.Android) {

     var assetManager = AssetManager(ExternalFileHandleResolver())
     var fileHandle = Gdx.files.external("/Download/WorldmapTheme.mp3")

     if (fileHandle.exists()) {

        assetManager.load(fileHandle.path(), Music::class.java)
        assetManager.finishLoading();

        var music = assetManager.get<Music>(fileHandle.path())
        music.setLooping(true)
        music.play()
     }
}

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

    ...
}