无法在媒体播放器中将资产设置为数据源

Can't set asset as datasource in the mediaplayer

我目前正在构建音板应用程序作为我的第一个小 Android 应用程序项目。 我在我的应用程序的资产文件夹中保存了一堆 .mp3 文件,然后根据存储在其中的 .mp3 文件动态创建按钮。在每个按钮的标签中,我保存了它对应的.mp3文件名。

在每个按钮的 onClick() 事件中,我尝试将全局 MediaPlayerDataSource 设置为我资产中的文件。 FileDescriptor 完美地处理了 openFd 命令,但 mediaPlayer 无法设置数据源。

应用程序在执行该命令后崩溃了。这是 OnClickListener:

tempButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {                   
        mediaPlayer.release();
        String tag = v.getTag().toString();

        try {
            AssetFileDescriptor afd = getAssets().openFd(tag + ".mp3");
            mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
            afd.close();

            mediaPlayer.prepare();
            mediaPlayer.start();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
});

logcat 在执行 setDataSource() 方法时打印出以下崩溃:

05-22 16:23:45.191 4505-4505/com.development.alo.dasunterboard E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.development.alo.dasunterboard, PID: 4505
    java.lang.IllegalStateException
        at android.media.MediaPlayer._setDataSource(Native Method)
        at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1133)
        at com.development.alo.dasunterboard.MainActivity.onClick(MainActivity.java:79)
        at android.view.View.performClick(View.java:5198)
        at android.view.View$PerformClick.run(View.java:21147)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:5417)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

我查看了 MediaPlayer.java,因为崩溃似乎发生在那里。 看起来 FileDescriptor 无效。

您不应该 release() MediaPlayer 之前设置 DataSource,但应该 reset() 它。将 mediaPlayer.release(); 替换为 mediaPlayer.reset();