Медиа-плеер, вызываемый в состоянии 0, ошибка (-38,0)
В настоящее время я пытаюсь создать простое приложение, которое транслирует интернет-радиостанцию. У меня есть URL для станции, и я настраиваю Media Player, например
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)
Кто-нибудь знает, что это значит?
Я немного читал об этих ошибках состояния, но не смог найти ничего, что применимо к моему проекту.
Ответы
Ответ 1
Вам нужно вызвать mediaPlayer.start()
в методе onPrepared
, используя прослушиватель.
Вы получаете эту ошибку, потому что вы вызываете mediaPlayer.start()
, пока не достигли подготовленного состояния.
Вот как вы можете это сделать:
mp.setDataSource(url);
mp.setOnPreparedListener(this);
mp.prepareAsync();
public void onPrepared(MediaPlayer player) {
player.start();
}
Ответ 2
Похоже, что ошибка -38 означает исключение состояния (как указывает сообщение об ошибке). Например, если вы вызываете start()
, прежде чем песня будет готова или когда вы вызовете pause()
, даже если песня вообще не воспроизводится.
Чтобы устранить эту проблему, проверьте состояние mediaPlayer перед вызовом методов. Например:
if(mediaPlayer.isPlaying()) {
mediaPlayer.pause();
}
Кроме того, MediaPlayer отправляет сообщения о событиях. Даже если вам не требуется подготовленное событие (хотя было бы неплохо не начать воспроизведение до того, как это событие было запущено), вы должны установить обратный вызов-прослушиватель. Это также справедливо для OnErrorListener
, OnCompletionListener
, OnPreparedListener
и OnSeekCompletedListener
(если вы вызываете метод поиска).
Слушатели могут быть прикреплены просто
mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// Do something. For example: playButton.setEnabled(true);
}
});
Ответ 3
У меня возникла эта ошибка, когда я пытался получить текущую позицию (MediaPlayer.getCurrentPosition()) медиа-плеера, когда это не было в подготовленном заявлении. Я обошел это, отслеживая его состояние и вызывая метод getCurrentPosition() после вызова onPreparedListener.
Ответ 4
Это мой код, проверенный и работоспособный:
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);
}
}
});
}
}
Ответ 5
Несколько раз файл кодируется так, что Android не может декодировать. Даже некоторые файлы mp4 не могут быть воспроизведены. Пожалуйста, попробуйте другой формат файла (.3gp проигрываются большую часть времени) и смотрите..
Ответ 6
i проверен ниже код. работает нормально
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;
}
}
Ответ 7
Я столкнулся с той же проблемой несколько дней назад. Мой аудио MediaPlayer отлично работает на устройствах с высокой вычислительной мощностью, но для медленных устройств медиаплеер просто не играл некоторое время, и от LogCat он много жаловался на вызванное в неправильном состоянии. Поэтому я разрешил его, вызвав вызов start(), pause(),... в 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) {
............
}
});
}
});
Также попробуйте освободить любой медиаплеер, который вам больше не нужен. Например, если вы не хотите воспроизводить аудио или видео на фоне, вы должны вызвать mediaPlayer.release() в onPause().
Ответ 8
Я решил как ошибки (-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();
}
});
}
}
Ответ 9
Вы получаете это сообщение в журналах, потому что вы делаете то, что не разрешено в текущем состоянии вашего экземпляра 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
, который я вызывал, когда медиаплеер находился в состоянии, где ему не разрешалось называть это свойство.
Ответ 10
Я также получил эту ошибку, которую я попробовал с onPreparedListener, но все еще получил эту ошибку. Наконец, я получил решение, что ошибка - это моя ошибка, потому что я забыл разрешение на доступ в Интернете в Android Manifest xml.:)
<uses-permission android:name="android.permission.INTERNET" />
Я использовал образец кодирования для медиапланера. Я использовал в StreamService.java
метод onCreate
String url = "http://s17.myradiostream.com:11474/";
mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(url);
mediaPlayer.prepare();
Ответ 11
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();
Ответ 12
Это было очень расстроено. Итак, у меня есть решение, которое работает для меня.
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();
}
Ответ 13
Для меня это сработало
mp.seekTo(0);
mp.start();
Ответ 14
Я встретил ту же проблему, что и раньше, друг на первом этаже был прав, вы вызвали start()
в неподходящее время, вы должны установить прослушиватель для подготовки() или prepareSync()
с помощью этого метода mediaPlayer.setOnPreparedListener(this)
; перед тем как подготовиться, в этом обратном вызове start()
. Он может решить вашу проблему. Я уже пробовал.
Ответ 15
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();