Начало запуска проигрывателя мультимедиа

Я создаю новое приложение для 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();