【问题标题】:MediaPlayer replays when other MediaPlayer startsMediaPlayer 在其他 MediaPlayer 启动时重播
【发布时间】:2016-02-23 05:38:09
【问题描述】:

所以在我的程序中,我有一个带有一系列按钮的 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);

每个媒体播放器

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

【问题讨论】:

    标签: android audio android-mediaplayer android-recyclerview


    【解决方案1】:

    如果一首歌曲已经在播放并且您选择了另一首歌曲,而不是执行 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();
    
                    }
                })
        );
    

    【讨论】:

    • 在大约 8 次不同的启动后,我收到 logcat 错误说“在状态 1 中调用”、“错误 (-38, 0)”
    • 我可以选择其他文件,但它们最终也会停止工作并产生相同的错误
    • 您还需要在启动媒体播放器之前设置数据源并调用 player.prepare()
    • 在这里developer.android.com/reference/android/media/MediaPlayer.html查看android中媒体播放器的活动周期。停止媒体播放器时,不会清除媒体播放器中的数据源。要清除上一首歌的数据源,您需要调用 reset()
    • 是否有替代 setDataSource 的方法?数据源是根据单击的列表项确定的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多