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

标签 java android libgdx

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

Assets Manager 可以作为 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();

最佳答案

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

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

您还可以使用AssetManager加载您的音乐,以便您可以以正确的方式管理您的 Assets 。

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

Assets 成功加载后,您就可以获取您的音乐了。

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

各种播放attributes可以用来播放音乐

music.play();

检查这个thread如果您在 Android 上遇到一些特殊问题。有时声音可能无法在Android设备上播放,但在桌面上却可以播放。

编辑

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

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

如果在继续与文件 IO 相关的任何工作之前未在运行时获得用户许可,请向 Android 明确说明您的 targetSdkVersion 小于 23。对于当前的 targetSdkVersion,请检查您的 android build.gradle 文件的 defaultConfig,如果没有,请检查 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

这段代码对我来说工作得很好,希望这对你也有用

//ApplicationListenercreate() 方法中的代码

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

    ...
}

关于java - 如何使用 libGDX 在 Android 中加载音乐?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43955604/

相关文章:

android - Play 商店中的下载数量图标未显示

java - AWS S3 以小于 5MB 的 block 部分上传文件

java - if 条件中的字符串比较总是出错

android - 如何通过adb清除文件?

java - 在eclipse上导入现有项目后突然报错ObjectSetting.java文件

java - libGDX 操作 : when they will execute

java - 我应该将 tomcat context.xml 数据放在 JBoss EAP 7.0.0 中的什么位置?

java - 在 Java 中,为什么 String 是非原始数据类型?

android - libgdx:android 应用程序找不到主游戏类

java - Libgdx - 检查是否按下了某个键?