MediaPlayer在其他MediaPlayer启动时重放

时间:2016-02-22 08:59:45

标签: android audio android-mediaplayer android-recyclerview

所以在我的程序中,我有一个带有一系列按钮的recyclerview,当点击一个按钮时,它应该播放一个声音文件。但是如果有任何其他声音播放它应该先停止它们并播放当前声音。

然而,当我选择一个并快速选择另一个时,它将重放第一个,然后播放第二个。

编辑:所以我注意到当第一个重放时,它会相对快速地停止,因此它不会播放整个文件,但它仍然会启动

recyclerView.addOnItemTouchListener(
            new RecyclerItemClickListener(this, new RecyclerItemClickListener.OnItemClickListener() {
                @Override
                public void onItemClick(View view, int position) {
                    for(MediaPlayer player : mediaPlayerList){
                        if(player.isPlaying()){
                            player.pause();
                            player.seekTo(0);
                        }
                    }

                    mediaPlayerList.get(position).start();

                }
            })
    );
}

一切正常,它只是第一个被选中的声音出于某种奇怪的原因播放了两次,我放置了一个pause()和seekTo(0),这样它就会停止它并允许它从头开始重放

我不确定这是否相关,但我也收到了一个logcat错误:getSlotFromBufferLocked:unknown buffer:0xab80f170。

MediaplayerList包含

final List<MediaPlayer> mediaPlayerList = new ArrayList<MediaPlayer>();
        mediaPlayerList.add(0,mediaPlayer0);mediaPlayerList.add(1,mediaPlayer1);
        mediaPlayerList.add(2,mediaPlayer2);mediaPlayerList.add(3,mediaPlayer3);
        mediaPlayerList.add(4,mediaPlayer4);mediaPlayerList.add(5,mediaPlayer5);

每个MediaPlayer

final MediaPlayer mediaPlayer0 = MediaPlayer.create(this, R.raw.sound);

1 个答案:

答案 0 :(得分:0)

如果歌曲已播放并且您选择了另一首歌曲,而不是播放player.pause(),则需要停止并重置媒体播放器,如

而不是

player.pause();
player.seekTo(0);

待办事项

player.stop();
player.reset();

编辑:尝试做这样的事情。制作像

这样的全球媒体播放器对象
private MediaPlayer player;

然后播放歌曲

recyclerView.addOnItemTouchListener(
        new RecyclerItemClickListener(this, new RecyclerItemClickListener.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                if(player.isPlaying()){
                     player.stop();
                     player.reset();
                }
                player = mediaPlayerList.get(position);
                player.start();
            }

编辑2:确定试试这个

recyclerView= (RecyclerView) findViewById(R.id.meme_list);
adapter = new Adapter(this,getData());
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        public void onPrepared(MediaPlayer player) { 
            player.start();  
        }
});
recyclerView.addOnItemTouchListener(
            new RecyclerItemClickListener(this, new RecyclerItemClickListener.OnItemClickListener() {
                @Override
                public void onItemClick(View view, int position) {

                       if (player.isPlaying())
                       {
                           player.stop();
                           player.reset();

                       }


                    player= mediaPlayerList.get(position);
                    player.prepare();

                }
            })
    );