【问题标题】:Android MediaPlayer Checking instancesAndroid MediaPlayer 检查实例
【发布时间】:2013-10-20 06:10:36
【问题描述】:

我的布局 xml 文件显示如下:

Song1    playbutton
Song2    playbutton
Song3     playbutton

当用户点击 Song1 播放按钮时,我需要播放 Song1,中间如果用户点击 Song2 播放按钮,我需要检查 Song2 和 Song3 mediapalyer 实例

我收到 IllegalStateException 和有时 NullPointerException 怎么查,有大神帮忙看看吗?

这是我的代码:

MediaPlayer mp1=new MediaPlayer();
MediaPlayer mp2=new MediaPlayer();

playbtn.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                if(mp2!=null){
                if(mp2.isPlaying()){
                    mp2.stop();
                    mp2.release();
                    mp2=null;

                    play20.setVisibility(View.VISIBLE);




                }
                }
                playbtn.setVisibility(View.INVISIBLE);
                pausebtn.setVisibility(View.VISIBLE);

                try {

                    Log.d("Start Media Player", "Start Media Player");
                    AssetFileDescriptor descriptor = MediaActivity.this
                            .getApplicationContext().getAssets()
                            .openFd("volumc.mp3");
                    mp1.setDataSource(descriptor.getFileDescriptor(),
                            descriptor.getStartOffset(), descriptor.getLength());
                    // descriptor.close();
                    mp1.prepare();
                    mp1.setLooping(true);
                    mp1.start();


                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (IllegalStateException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });

        pausebtn.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                Log.d("pausebtn", "pausebtn");
                playbtn.setVisibility(View.VISIBLE);
                pausebtn.setVisibility(View.INVISIBLE);

                mp1.stop();
                mp1.release();
                mp1=null;


            }
        });

        // 20

        play20.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                if(mp1!=null){
                if(mp1.isPlaying()){
                    mp1.stop();
                    mp1.release();
                    mp1=null;
                    playbtn.setVisibility(View.VISIBLE);



                }
                }
                play20.setVisibility(View.INVISIBLE);
                pause20.setVisibility(View.VISIBLE);

                try {

                    Log.d("Start Media Player", "Start Media Player");
                    AssetFileDescriptor descriptor = MediaActivity.this
                            .getApplicationContext().getAssets()
                            .openFd("volumc.mp3");
                    mp2.setDataSource(descriptor.getFileDescriptor(),
                            descriptor.getStartOffset(), descriptor.getLength());
                    // descriptor.close();
                    mp2.prepare();
                    mp2.setLooping(true);
                    mp2.start();

                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (IllegalStateException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });

        pause20.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                Log.d("pausebtn", "pausebtn");
                play20.setVisibility(View.VISIBLE);
                pause20.setVisibility(View.INVISIBLE);

                mp2.stop();
                mp2.release();


            }
        });

【问题讨论】:

  • 请查看答案,如果有帮助,请将其标记为已接受。

标签: android android-layout android-intent android-mediaplayer


【解决方案1】:

不要为每个按钮使用一个 Mediaplayer 实例。创建许多实例不会受益。而是只创建一个媒体播放器实例并检查音乐是否正在播放。
您总是可以制作一种方法来停止播放媒体播放器,例如

private void stopAndStartMediaPlayer(String datasource)
{
    if(mp.isPlaying())
        mp.stop();
    mp.reset();
    mp.setDataSource(datasource);
    mp.prepare();
    mp.start();
}   

【讨论】:

  • 您应该在setDataSource(...) 之前添加对reset() 的调用,在start() 之前添加对prepare() 的调用。还有一个问题是isPlaying()在暂停时返回false,但可能他没有在这个应用程序中使用pause()
  • @Dave 我只是建议 user2580568 他应该采用这样的方法。这不是确切的代码,但他可以做这样的事情。所以在你DOWNVOTE之前仔细阅读。我已经提到他可以在代码上方做一些“喜欢”的事情。
猜你喜欢
  • 1970-01-01
  • 2012-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多