Android MediaPlayer не запускается снова после остановки - PullRequest
3 голосов
/ 29 марта 2011

Я хочу воспроизвести звук. В первый раз все работает хорошо, но если я остановлю его и захочу перезапустить, ничего не произойдет ... Есть идеи?

final MediaPlayer mp = MediaPlayer.create(getApplicationContext(), R.raw.sex);
ImageButton andvib = (ImageButton)findViewById(R.id.vib_toggle);
final AudioManager am = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
andvib.setOnClickListener(new View.OnClickListener(){
    @Override
    public void onClick(View v) {
        am.setStreamVolume(AudioManager.STREAM_MUSIC, vol, 0);
        Vibrator vibr = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);
        vibr.cancel();
        if(vibrating==false) {
            if(style == 0)
                vibr.vibrate(durat, 0);
            if(style == 1){
                vibr.vibrate(staccato, 0);
            }
            if(style == 2){
                vibr.vibrate(wild, 0);
            }
            try {
                mp.prepare();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            mp.start();
            mp.setLooping(true);
            vibrating = true;
        }
        else {
            vibrating = false;
            mp.stop();
            try {
                mp.prepare();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            vibr.cancel();
        }
    }
});

Ответы [ 2 ]

6 голосов
/ 29 марта 2011

При использовании MediaPlayer вы всегда должны обращаться к диаграмме изменения состояния, которую вы можете увидеть здесь:

http://developer.android.com/reference/android/media/MediaPlayer.html

Как видно из диаграммы, после вызова stop () на MediaPlayer он переходит в состояние «Остановлено», и вам необходимо снова вызвать prepare (), чтобы перевести его в состояние «Подготовлено» перед вызовом play ().

Помните, что подготовка может занять много времени, поэтому все это может привести к ухудшению взаимодействия с пользователем, особенно если вы делаете это из основного потока (пользовательский интерфейс будет зависать во время подготовки MediaPlayer). Если вы часто воспроизводите звук, вам нужно только подготовить его () один раз, а затем всегда держать его в состоянии «Запущено», «Приостановлено» или «Воспроизведение завершено».

Бруно Оливейра, инженер-разработчик программ, Google

0 голосов
/ 29 марта 2011

Возможно, вам придется позвонить mp.prepare(), прежде чем вы позвоните start() во второй раз.

...