Медиаплеер вызывается в состоянии 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 ответов:
нужно позвонить
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
метод onCreateString 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(); }
Я встретил ту же проблему только что,друг на первом этаже был прав,вы позвонили
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();