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