【问题标题】:How to start MediaPlayer after it has been stopped in android在android中停止后如何启动MediaPlayer
【发布时间】:2016-11-18 09:36:02
【问题描述】:

我是 Android 新手,在我的应用中我正在使用 MediaPlayer

当我第一次点击开始按钮时,歌曲会播放,但是当我点击停止按钮然后再次点击开始按钮时,歌曲不会再次开始播放。到目前为止,这是我所拥有的:

public class PlayngUrlFiles extends AppCompatActivity {

    Button start, pause, stop;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.playingurls_layout);

        start = (Button) findViewById(R.id.button1);
        pause = (Button) findViewById(R.id.button2);
        stop = (Button) findViewById(R.id.button3);

        final MediaPlayer mp = new MediaPlayer();

        try {
            mp.setDataSource("http://programmerguru.com/android-tutorial/wp-content/uploads/2013/04/hosannatelugu.mp3");
            mp.prepare();
        } catch (Exception e) {
            e.printStackTrace();
        }

        start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mp.start();
            }
        });
        pause.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mp.pause();
            }
        });
        stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mp.stop();
            }
        });
    }
}

【问题讨论】:

  • stackoverflow.com/questions/34592596/… 嘿,你可以试试这个.. 它可能对你有帮助
  • 你试过我的建议了吗?
  • 很多人都想帮忙。最好标记一下是否解决了您的问题。提供最新情况。

标签: android android-mediaplayer


【解决方案1】:

试试这个:

stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mp != null) {
                    mp.stop();
                    mp.release();
                }
            }
        });

【讨论】:

  • @@~ if(mp!=null){ }
  • 当我停止播放器并再次播放时出现异常
  • 进程:com.example.venkat.audiorecordingapp,PID:2 java.lang.IllegalStateExcept at android.media.MediaPlayer._start(Native Method)
  • @AbhiRam after mp.release() 你需要mp.prepare() 才能再次播放。
【解决方案2】:

解决方案 1

对于这个解决方案,我从here获取了一些信息

public class PlayngUrlFiles extends AppCompatActivity {

    Button start, pause, stop;
    MediaPlayer mp;
    /**
     * remain false till media is not completed, inside OnCompletionListener make it true.
     */
    private boolean initialStage = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.playingurls_layout);

        start = (Button) findViewById(R.id.button1);
        pause = (Button) findViewById(R.id.button2);
        stop = (Button) findViewById(R.id.button3);

        start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (initialStage) {
                    mp = new MediaPlayer();
                    mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
                    new Player()
                            .execute("http://programmerguru.com/android-tutorial/wp-content/uploads/2013/04/hosannatelugu.mp3");
                } else {
                    if (mp && !mp.isPlaying())
                        mp.start();
                }
            }
        });
        pause.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(mp && mp.isPlaying())
                    mp.pause();
            }
        });
        stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(mp) {
                    mp.stop();
                    mp.release();
                    mp = null;
                    initialStage = true;
                }
            }
        });
    }

    /**
     * preparing mediaplayer will take sometime to buffer the content so prepare it inside the background thread and starting it on UI thread.
     * @author piyush
     *
     */

    class Player extends AsyncTask<String, Void, Boolean> {
        private ProgressDialog progress;

        @Override
        protected Boolean doInBackground(String... params) {
            // TODO Auto-generated method stub
            Boolean prepared;
            try {

                mp.setDataSource(params[0]);

                mp.setOnCompletionListener(new OnCompletionListener() {

                @Override
                public void onCompletion(MediaPlayer mp) {
                    // TODO Auto-generated method stub
                    initialStage = true;
                    mp.stop();
                    mp.reset();
                }
            }); 
            mp.prepare();
            prepared = true;
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                Log.d("IllegarArgument", e.getMessage());
                prepared = false;
                e.printStackTrace();
            } catch (SecurityException e) {
                // TODO Auto-generated catch block
                prepared = false;
                e.printStackTrace();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                prepared = false;   
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                prepared = false;
                e.printStackTrace();
            }
            return prepared;
        }

        @Override
        protected void onPostExecute(Boolean result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            if (progress.isShowing()) {
                progress.cancel();
            }
            Log.d("Prepared", "//" + result);
            mp.start();

            initialStage = false;
        }

        public Player() {
            progress = new ProgressDialog(PlayngUrlFiles.this);
        }

        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();
            this.progress.setMessage("Buffering...");
            this.progress.show();

        }
    }

}

解决方案 2

为了避免数据下载,试试这个

public class PlayngUrlFiles extends AppCompatActivity {

    Button start, pause, stop;
    boolean prepared;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.playingurls_layout);

        start = (Button) findViewById(R.id.button1);
        pause = (Button) findViewById(R.id.button2);
        stop = (Button) findViewById(R.id.button3);
        final MediaPlayer mp = new MediaPlayer();
        mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
        prepared = false;

        mp.setOnPreparedListener(new OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                prepared = true;
                mp.start();
            }
        });

        try {
            mp.setDataSource("http://programmerguru.com/android-tutorial/wp-content/uploads/2013/04/hosannatelugu.mp3");
        } catch (Exception e) {
            e.printStackTrace();
        }

        start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(mp) {
                    try {
                        if(!prepared) {
                            mp.prepareAsync();
                            prepared = true;
                        } else {
                            mp.start();
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        pause.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(mp) {
                    mp.pause();
                }
            }
        });
        stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(mp) {
                    mp.stop();
                    prepared = false;
                }
            }
        });
    }
}

【讨论】:

  • @AbhiRam,请尝试使用我发布的代码而不是您的代码,让我知道它是否有效
  • 等待我检查
  • 请检查您的代码一次并给出正确的解决方案
  • 嗯,问题是你是从互联网上获取一个mp3,因此它没有播放它,因为它仍然没有被下载......我会正确修改代码
  • 你有提供解决方案吗?
【解决方案3】:

就这样检查

if(mdpl.isPlaying()){
    mdpl.pause();
} else {
    mdpl.start();
}

【讨论】:

    【解决方案4】:

    您不能调用启动,它的媒体播放器处于停止状态。看一下媒体播放器MediaPlayer state diagram的状态图。

    当你调用 stop 时,你必须调用 release(),然后你会得到一个新的媒体播放器,或者只是调用 reset。

    【讨论】:

      【解决方案5】:

      试试这个

      public void onStopBtnClick(View view) {
          if (mAudioHelper != null) {
              mAudioHelper.stop();
              displayMessage("Stopping!");
          }
      }
      

      【讨论】:

        【解决方案6】:

        这是设置声音文件的代码。

        if (mPlayer != null) {
             mPlayer.stop();
             mPlayer.release();
        }
        mPlayer = new MediaPlayer();
        AppLog.d("Created new Media player");
        try {
             mPlayer.setDataSource(fileName);
        } catch (IOException e) {
             AppLog.e("Can't open " + fileName + " file", e);
        }
        

        在玩之前你应该调用mPlayer.prepareAsync() 函数。 如果你想暂停/播放,你必须使用这个代码:

        if (mediaPlayer.isPlaying()){
            mediaPlayer.pause();
        } else {
            mediaPlayer.start();
        }
        

        如果你想停止播放器使用这个:

        if (mPlayer != null){
            mPlayer.stop();
            mPlayer.release();
        }
        mPlayer = null;
        

        如果您想再次开始歌曲,请使用第一个功能,然后按照此步骤进行下一步

        【讨论】:

        • 我对你的代码完全感到困惑,并且非常初学者在 android 请提供你的解决方案并编辑我的答案
        【解决方案7】:

        此代码可能会对您有所帮助..

         @Override
            protected void onDestroy() {
                super.onDestroy();
                destroyMediaPlayer();
            }
        
            private void destroyMediaPlayer() {
                if (mediaPlayer != null) {
                    try {
        
                        mediaPlayer.release();
                        Log.d("here", "destroy");
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            } 
        

        【讨论】:

          【解决方案8】:

          @MRodrigues 关于媒体播放器状态是正确的。但不要在停止后调用 release() ,而是如下修改您的代码。

          目前,

          try {
                      mp.setDataSource("http://programmerguru.com/android-tutorial/wp-content/uploads/2013/04/hosannatelugu.mp3");
                      mp.prepare();
                  } catch (Exception e) {
                      e.printStackTrace();
                  }
          
                  start.setOnClickListener(new View.OnClickListener() {
                      @Override
                      public void onClick(View v) {
                          mp.start();
                      }
                  });
          

          修改为,

          try {
                      mp.setDataSource("http://programmerguru.com/android-tutorial/wp-content/uploads/2013/04/hosannatelugu.mp3");
                  } catch (Exception e) {
                      e.printStackTrace();
                  }
          
                  start.setOnClickListener(new View.OnClickListener() {
                      @Override
                      public void onClick(View v) {
                          if (!mp.isPlaying()) {
                              mp.prepare();
                          }
                          mp.start();
                      }
                  });
          

          【讨论】:

            猜你喜欢
            • 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
            相关资源
            最近更新 更多