【问题标题】:Media Player start stop start媒体播放器 开始 停止 开始
【发布时间】:2013-12-13 10:05:15
【问题描述】:

我正在制作一个新的 android 声音应用程序。当我点击它时,我制作了一个可点击的按钮来播放声音。但我也希望它在我第二次单击时停止播放声音。该部分现在工作正常,这是问题所在,当我再次单击按钮再次播放声音时,它不播放,媒体播放器完全停止。我在看论坛,但似乎找不到可以帮助我的答案。 这是我的活动:

  MediaPlayer mpButtonClick1;
MediaPlayer mpButtonClick2;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.prvi);

    final MediaPlayer mpButtonClick1 = MediaPlayer.create(this, R.raw.spalshm);
    final MediaPlayer mpButtonClick2 = MediaPlayer.create(this, R.raw.splashs);


    Button dugme = (Button) findViewById(R.id.dugme);
    dugme.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            if (mpButtonClick1.isPlaying()) {
                mpButtonClick1.stop();
                mpButtonClick1.reset();

            }
            else {              
                mpButtonClick1.start();

            }


        }   

    });

当我尝试编写 mpButtonClick1.prepare();我收到错误未处理的异常类型 IOE 异常

【问题讨论】:

    标签: android media-player


    【解决方案1】:

    尝试使用pause 而不是stop

    原因:如果您暂停MediaPlayer,那么您可以稍后恢复它。但是,如果您使用stop,几乎任何其他方法都不起作用,您将不得不重新准备 MediaPlayer(或创建一个新的)。

    更多信息:herehere

    PS:资源用完别忘了释放内存。

    【讨论】:

    • 干净的答案,这应该是最重要的。谢谢
    【解决方案2】:

    试试这个: 您应该只使用一个媒体播放器对象

        public class PlayaudioActivity extends Activity {
    
        private MediaPlayer mp;
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button b = (Button) findViewById(R.id.button1);
        Button b2 = (Button) findViewById(R.id.button2);
        final TextView t = (TextView) findViewById(R.id.textView1);
    
        b.setOnClickListener(new View.OnClickListener() {
    
            @Override
            public void onClick(View v) {
            stopPlaying();
            mp = MediaPlayer.create(PlayaudioActivity.this, R.raw.far);
            mp.start();
            }
    
        });
    
        b2.setOnClickListener(new View.OnClickListener() {
    
            @Override
            public void onClick(View v) {
            stopPlaying();
            mp = MediaPlayer.create(PlayaudioActivity.this, R.raw.beet);
            mp.start();
            }
        });
        }
    
        private void stopPlaying() {
            if (mp != null) {
                mp.stop();
                mp.release();
                mp = null;
           }
        }
    }
    

    【讨论】:

    • 每次都重新实例化播放器对我有用。这很简单,没有明显的开销..谢谢!
    • 你是真正的救星谢谢你的回答:)
    • @Rahul 很高兴,它帮助了你。
    【解决方案3】:

    使用以下代码更改您的课程:

    删除reset();

    初始化所有组件:

    MediaPlayer mpButtonClick1;
    MediaPlayer mpButtonClick2;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.prvi);
    
         mpButtonClick1 = MediaPlayer.create(this, R.raw.spalshm);
         mpButtonClick2 = MediaPlayer.create(this, R.raw.splashs);
    
    
        Button dugme = (Button) findViewById(R.id.dugme);
        dugme.setOnClickListener(new View.OnClickListener() {
    
            @Override
            public void onClick(View v) {
                if (mpButtonClick1.isPlaying()) {
                    mpButtonClick1.stop();
                 }
                else {              
                    mpButtonClick1.start();
                }
             }   
    
        });
    

    【讨论】:

    • 当我尝试这个时,我得到“不幸的是 Splashzor 已停止。错误
    • prntscr.com/2atb96 这里是日志猫。不知道怎么发,所以截图了。
    • 重置后不再播放:(
    【解决方案4】:

    您在 mpButtonClick1.stop() 之后调用 mpButtonClick1.reset() - 不要那样做:

    if (mpButtonClick1.isPlaying()) {
        mpButtonClick1.stop();
        mpButtonClick1.reset(); //<--------- calling reset(), remove this line
    }
    

    reset() 的文档说:

    将 MediaPlayer 重置为未初始化状态。调用该方法后,需要通过设置数据源并调用prepare()重新初始化。

    删除 mpButtonClick1.reset() 它应该可以工作。

    请记住,MediaPlayer 作为状态机工作,这意味着如果您以错误的顺序调用方法,就会出现问题。请阅读有关 MediaPlayer herehere 的信息。

    【讨论】:

      【解决方案5】:

      嘿,请使用以下

      停止 -> 媒体播放器 mp.seekTo(0); mp.pause();

      再次开始只是调用 mp.start();

      【讨论】:

        【解决方案6】:

        根据我的经验,当我需要多次播放并且可能需要停止一次播放以开始另一次播放时(例如在多个按钮的情况下),我只是创建另一个播放器,并确保我释放资源上一个。要停止使用

        mediaPlayer.stop(); 
        

        但是为了玩,使用类似的东西(根据您的特定需求调整日志记录)来创建/重新创建您的播放器:

        private boolean createMediaPlayer()
        {
            if (mediaPlayer!=null)
            {
                if(mediaPlayer.isPlaying())
                {
                    mediaPlayer.stop();
                    mediaPlayer.reset();
                    mediaPlayer.release();
                    mediaPlayer=null;
                }
        
            }
            mediaPlayer = new MediaPlayer();
            mediaPlayer.setVolume(1f, 1f);
            try
            {
                mediaPlayer.setAudioStreamType(Interop.PRIMARY_STREAM);
                mediaPlayer.setDataSource(m_soundFile);
                mediaPlayer.prepare();
                return true;
                // Interop.logDebug(TAG + "-loadAudio: SUCCESS" + m_soundFile);
            } catch (Exception e)
            {
                Interop.logError(TAG + "-LoadAudio for Clic Sound: audioPlayer prepare failed for current file: " + m_soundFile);
                Interop.logError(TAG + "-Exception: " , e);
                return false;
            }
        }
        

        比使用

        if (createMediaPlayer())
            mediaPlayer.start();
        

        这将确保正确释放媒体播放器使用的资源。

        【讨论】:

          【解决方案7】:

          一个简单的解决方案是使用暂停而不是停止并寻找到歌曲的开头。

          【讨论】:

            【解决方案8】:

            我知道这个问题很老了,但是最近在学习Android时,我也卡在了这一点上,找到了一个非常简单的解决方案,我想与大家分享。

            您可以返回起始位置,而不是尝试停止重置媒体.

            mediaPlayer.seekTo(0);
            

            作为参考,我也在下面发布我的代码:

            public class MainActivity extends AppCompatActivity {
            
                MediaPlayer mp;
            
                public void play(View view) {
                    mp.start();
                }
            
                public void pause(View view) {
                    mp.pause();
                }
            
                public void stop(View view) {
                    // this seeks to the beginning of the file
                    mp.seekTo(0);
                }
            
                @Override
                protected void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.activity_main);
                    mp = MediaPlayer.create(this, R.raw.sample_audio);
                }
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多