Начало запуска проигрывателя мультимедиа
Я создаю новое приложение для Android. Я нажал кнопку для воспроизведения звука, когда я нажимаю на нее. Но я также хочу, чтобы он переставал воспроизводить звук, когда я нажимаю второй раз. Эта часть отлично работает, вот и проблема: когда я снова нажимаю кнопку, чтобы снова воспроизводить звук, она не воспроизводится, Media Player полностью остановлен. Я смотрел на форумах, но я не могу найти ответа, который мог бы мне помочь.
Вот моя работа:
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 исключение
Ответы
Ответ 1
Измените свой класс с помощью кода ниже:
удалите 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();
}
}
});
Ответ 2
Попробуйте использовать pause
вместо stop
.
Причина: если вы приостановите MediaPlayer
, вы можете продолжить его позже. Однако, если вы используете stop
, почти любой другой метод не будет работать, и вам придется снова подготовить MediaPlayer (или создать новый).
![enter image description here]()
Дополнительная информация: здесь и здесь
PS: не забудьте освободить память, когда вы закончите использовать ресурсы.
Ответ 3
Попробуйте следующее:
Вы должны использовать только один объект медиапланера.
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;
}
}
}
Ответ 4
Вы вызываете mpButtonClick1.reset() после mpButtonClick1.stop() - не делайте этого:
if (mpButtonClick1.isPlaying()) {
mpButtonClick1.stop();
mpButtonClick1.reset(); //<--------- calling reset(), remove this line
}
Документы для reset() говорят:
Сбрасывает MediaPlayer в неинициализированное состояние. После вызова этого метода вам придется снова инициализировать его, установив источник данных и вызов prepare().
Удалите файл mpButtonClick1.reset() и он должен работать.
Имейте в виду, что MediaPlayer работает как конечный автомат, а это значит, что если вы вызовете методы в неправильном порядке, у вас появятся проблемы. Пожалуйста, прочитайте о MediaPlayer здесь и здесь.
Ответ 5
По своему опыту, когда мне нужно играть несколько раз, и мне может понадобиться остановить одну игру, чтобы начать другую игру (как в случае с несколькими кнопками), я просто создаю другого игрока, следя за тем, чтобы освободить ресурсы для предыдущего, Чтобы перестать просто использовать
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();
это обеспечит правильное освобождение ресурсов, используемых медиаплеером.
Ответ 6
Простое решение - использовать паузу вместо остановки и поиск в начале песни.
Ответ 7
Я знаю, что этот вопрос довольно старый, но недавно, изучая 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);
}
}
Ответ 8
Эй, пожалуйста, используйте следующие
для остановки → медиаплеер mp.seekTo(0); mp.pause();
mp.seekTo(0); mp.pause();
для начала просто вызовите mp.start();