使用变量播放和暂停Mediaplayer

时间:2018-03-17 19:48:45

标签: java android audio android-mediaplayer

我正在尝试构建一个Android应用程序,用户可以在其中播放标有数据库id的audiofiles。

//get id from database and turn it into a string, add letter a, because its a res file
        stringId = "a" + String.valueOf(standard.getId());
        //find playbutton
        final FloatingActionButton play = (FloatingActionButton) findViewById(R.id.play);
        play.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //to be able to feed mediaplayer a variable I put it in another function called playAudio
                playAudio(stringId, true);     }
        });

    final FloatingActionButton pause = (FloatingActionButton) findViewById(R.id.pause);
    play.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            playAudio(stringId, false);     }
    });

playAudio看起来像这样:

private void playAudio(String nameOfFile, Boolean booleanPlay){
        MediaPlayer mediaPlayer = MediaPlayer.create(this, getResources().getIdentifier(nameOfFile, "raw", getPackageName()));
        if (booleanPlay = true){
            if (!mediaPlayer.isPlaying())
            mediaPlayer.start();
        }
        if (booleanPlay = false){
            mediaPlayer.pause();
        }
    }

当我每次按下播放时运行我的代码时,它会创建一个新的媒体播放器,它与其他媒体播放器同时开始播放,暂停按钮由于同样的原因不起作用。我无法弄清楚如何使它发挥作用。

1 个答案:

答案 0 :(得分:0)

每次播放新文件时都不要创建新的MediaPlayer实例。在开头创建一个实例并重用它:

private static MediaPlayer mediaPlayer = new MediaPlayer ();

更改要播放的文件时,请尝试以下代码:

AssetFileDescriptor afd = getApplicationContext ().getResources ().openRawResourceFd (R.raw.sound);

if (afd != null)
{
    mediaPlayer.reset()
    mediaPlayer.setDataSource(afd.getFileDescriptor (), afd.getStartOffset (), afd.getLength ());
    mediaPlayer.setLooping (true);
    mediaPlayer.prepare ();
    mediaPlayer.start ();
}

R.raw.sound 替换为要播放的声音的文件名(这将在res / raw文件夹中)或使用不同的方式根据需要引用该文件。

这对我有用 - 在Android 8.1(目标)上测试过。希望这可以帮助。

已编辑添加:我刚注意到 if(booleanPlay = false) if(booleanPlay = true)中有错误的运算符声明。它们应该是==(比较,而不是分配)。 最后一件事:退出时,你应该调用 mediaPlayer.release()来释放资源,但你可能知道这一点。很高兴我能提供帮助。