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