Медиаплеер вызывается в состоянии 0, ошибка (-38,0)


В настоящее время я пытаюсь создать простое приложение, которое транслирует интернет-радиостанцию. У меня есть URL для станции и я настраиваю медиаплеер, как

    MediaPlayer mediaPlayer = new MediaPlayer();
    try {
        mediaPlayer.setDataSource(URL);
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (SecurityException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        mediaPlayer.prepare();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    mediaPlayer.start();

программа не сбой при эмуляции, но ничего не играет, и я получаю следующую ошибку:

start called in state 0

и прямо под ним

Error (-38,0)

кто-нибудь знает, что это значит?

Я немного читал об этих ошибках состояния, но не смог найти ничего, что относится к моему проекту.

15 88

15 ответов:

нужно позвонить mediaPlayer.start() на onPrepared метод с помощью слушателя. Вы получаете эту ошибку, потому что вы вызываете mediaPlayer.start() до того, как он достигнет подготовленного состояния.

вот как вы можете сделать это :

mp.setDataSource(url); 
mp.setOnPreparedListener(this);
mp.prepareAsync();

public void onPrepared(MediaPlayer player) {
    player.start();
}

похоже, что ошибка -38 означает исключение состояния (как указывает сообщение об ошибке). Например, если вы вызываете start(), прежде чем песня была готова, или когда вы называете pause(), даже если песня не играет вообще.

чтобы устранить эту проблему, проверьте состояние медиаплеера перед вызовом методов. Например:

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

кроме того, MediaPlayer отправляет сообщения о событиях. Даже если вам не нужно подготовленное мероприятие (хотя было бы неплохо не делать этого начните воспроизведение до того, как это событие было запущено) вы должны установить callback-listener. Это также справедливо для OnErrorListener,OnCompletionListener,OnPreparedListener и OnSeekCompletedListener (если вы вызываете метод seek).

слушатели могут быть прикреплены просто

mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        // Do something. For example: playButton.setEnabled(true);
    }
});

Я получил эту ошибку, когда пытался получить текущую позицию (MediaPlayer.getCurrentPosition ()) медиаплеера, когда он не был в подготовленном состоянии. Я обошел это, отслеживая его состояние и вызывая только метод getCurrentPosition() после вызова onPreparedListener.

Это мой код, протестирован и работает нормально:

package com.example.com.mak.mediaplayer;

import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.app.Activity;

public class MainActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final MediaPlayer mpp = MediaPlayer.create(this, R.raw.red); //mp3 file in res/raw folder

    Button btnplay = (Button) findViewById(R.id.btnplay); //Play
    btnplay.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View vone) {
        mpp.start();
      }
    });

    Button btnpause = (Button) findViewById(R.id.btnpause); //Pause
    btnpause.setOnClickListener(new View.OnClickListener() {

      @Override
      public void onClick(View vtwo) {
        if (mpp.isPlaying()) {
          mpp.pause();
          mpp.seekTo(0);
        }
      }
    });
  }
}

несколько раз файл закодированы таким образом, что Android не может декодировать. Даже некоторые файлы mp4 не могут быть воспроизведены. Попробуйте другой формат файла (.3gp воспроизводятся большую часть времени) и смотрите..

Я проверил ниже код. работает нормально

public class test extends Activity implements OnErrorListener, OnPreparedListener {

private MediaPlayer player;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);


    player = new MediaPlayer();
    player.setAudioStreamType(AudioManager.STREAM_MUSIC);
    try {
        player.setDataSource("http://www.hubharp.com/web_sound/BachGavotte.mp3");
        player.setOnErrorListener(this);
        player.setOnPreparedListener(this);
        player.prepareAsync();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }       
}
@Override
public void onDestroy() {
    super.onDestroy();
    player.release();
    player = null;
}
@Override
public void onPrepared(MediaPlayer play) {
    play.start();
}
@Override
public boolean onError(MediaPlayer arg0, int arg1, int arg2) {
    return false;
}
}

я столкнулся с такой же проблемой несколько дней назад. Мой аудио медиаплеер отлично работает на устройствах с высокой вычислительной мощностью, но для медленных устройств медиаплеер просто не играл некоторое время, и из LogCat у него было много жалоб на вызов в неправильном состоянии. Поэтому я решил это, позвонив, поставив вызов start (),пауза(),... в onPrepared() метод OnPreparedListener() как показано ниже:

mediaPlayer.prepare();
mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    ........
                    mediaPlayer.start();
                    ....
                    songControlBtn.setOnClickListener(new OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            if (mediaPlayer.isPlaying()) {
                                mediaPlayer.pause();

                            } else {
                                mediaPlayer.start();

                            }
                        }
                    });

                    mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
                        @Override
                        public void onCompletion(MediaPlayer mp) {
                            ............

                        }
                    });
                }
            });

также попробуйте освободить любого медиаплеер, который вам больше не нужен. Например, если вы не хотите воспроизводить аудио или видео на фоне, то вам следует обратиться медиаплеер.release () на onPause ().

Я решил обе ошибки (-19,0) и (-38,0) , создавая новый объект MediaPlayer каждый раз перед игрой и выпуская его после этого.

перед :

void play(int resourceID) {
if (getActivity() != null) {

     //Using the same object - Problem persists
    player = MediaPlayer.create(getActivity(), resourceID);
    player.setAudioStreamType(AudioManager.STREAM_MUSIC);

    player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mp) {
            player.release();
        }
    });

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

}

}

после:

void play(int resourceID) {

if (getActivity() != null) {

    //Problem Solved
    //Creating new MediaPlayer object every time and releasing it after completion
    final MediaPlayer player = MediaPlayer.create(getActivity(), resourceID);
    player.setAudioStreamType(AudioManager.STREAM_MUSIC);

    player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mp) {
            player.release();
        }
    });

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

}

}

вы получаете это сообщение в журналах, потому что вы делаете что-то, что не разрешено в текущем состоянии вашего экземпляра MediaPlayer.

поэтому вы всегда должны зарегистрировать обработчик ошибок, чтобы поймать эти вещи (как предложил @tidbeck).

во-первых, я советую вам взглянуть на документацию MediaPlayer класс и получить представление о том, что это с состояниями означает. Видеть: http://developer.android.com/reference/android/media/MediaPlayer.html#StateDiagram

ваша ошибка здесь вполне может быть одной из распространенных, другие писали здесь, но в целом я бы взглянул на документацию о том, какие методы допустимы для вызова в каком состоянии: http://developer.android.com/reference/android/media/MediaPlayer.html#Valid_and_Invalid_States

в моем примере это был метод mediaPlayer.CurrentPosition, что я назвал в то время как медиаплеер находился в состоянии, когда не разрешалось вызывать это свойство.

Я также получил эту ошибку я пробовал с onPreparedListener но все еще получил эту ошибку. Наконец, я получил решение, что ошибка-это моя вина, потому что я забыл разрешение интернета в Android Manifest xml. :)

<uses-permission android:name="android.permission.INTERNET" />

я использовал пример кодирования для mediaplayer. Я использовал в StreamService.java
метод onCreate

        String url = "http://s17.myradiostream.com:11474/";
        mediaPlayer = new MediaPlayer();            
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mediaPlayer.setDataSource(url);
        mediaPlayer.prepare();
  if(length>0)
        {
            mediaPlayer = new MediaPlayer();
            Log.d("length",""+length);
            try {
                mediaPlayer.setDataSource(getApplication(),Uri.parse(uri));
            } catch(IOException e) {
                e.printStackTrace();
            }
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mediaPlayer) {
                    mediaPlayer.seekTo(length);
                    mediaPlayer.start();

                }
            });
            mediaPlayer.prepareAsync();

Это было сильно расстроен. Итак, я получил решение, которое работает для меня.

try {
                        if (mediaPlayer != null) {
                            mediaPlayer.release();
                            mediaPlayer = null;

                        }
                        mediaPlayer = new MediaPlayer();
                        mediaPlayer.setDataSource(file.getAbsolutePath());
                        mediaPlayer.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);
                        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                            @Override
                            public void onPrepared(MediaPlayer mediaPlayer) {
                                mediaPlayer.start();
                                mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                                    @Override
                                    public void onCompletion(MediaPlayer mediaPlayer) {
                                        mediaPlayer.stop();
                                        mediaPlayer.release();
                                        mediaPlayer = null;
                                    }
                                });
                            }
                        });
                        mediaPlayer.prepare();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

для меня это работал

mp.seekTo(0);
mp.start();

Я встретил ту же проблему только что,друг на первом этаже был прав,вы позвонили start() в неподходящее время вы должны установить прослушиватель для prepare() или prepareSync() С помощью этого метода mediaPlayer.setOnPreparedListener(this); перед подготовкой, в этом обратном вызове start(). это может решить вашу проблему. Я уже пробовал.

mp = new MediaPlayer();
        AssetFileDescriptor afd = mContext.getAssets().openFd(fileName);
        mp.reset();
        mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(),
                afd.getLength());
        mp.prepare();
        mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            public void onPrepared(MediaPlayer mp) {
                mp.start();
            }
        });
        mp.prepareAsync();