Media Player가 상태 0에서 호출되었습니다. 오류 (-38,0)


105

저는 현재 인터넷 라디오 방송국을 스트리밍하는 간단한 앱을 디자인하려고합니다. 방송국의 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)

이것이 무엇을 의미하는지 아는 사람이 있습니까?

이 상태 오류에 대해 조금 읽었지만 내 프로젝트에 적용되는 것을 찾을 수 없습니다.




@SmashCode 내 답변이 완전히 쓸모가 없으므로 다른 답변을 수락 된 것으로 표시하십시오.
tidbeck

답변:


120

당신은 호출 할 필요가 mediaPlayer.start()onPrepared리스너를 사용하는 방법. mediaPlayer.start()준비 상태에 도달하기 전에 호출 하기 때문에이 오류가 발생합니다 .

방법은 다음과 같습니다.

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

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

바로 시작하지 않으려면 어떻게해야합니까? 내 플레이어를 초기화하고, 그래서 그것을 재생하려고 처음 분을 기다리거나해도, 내가 onPrepared에 .start ()를 호출하지 않는 한이 오류가
Elliptica

1
당신은 전에 그것을 준비하고 당신이 그것을 준비한 것을 기억합니다. 동시에 실행 하려는지 기억하려고합니다. 준비가되어 있고 실행하고 싶을 때 시작합니다.
Victor Paléologue

33

오류 -38은 상태 예외를 의미하는 것 같습니다 (오류 메시지에서 알 수 있듯이). 예를 들어 start(), 노래가 준비되기 전 또는으로 전화를 걸면 pause()노래가 전혀 재생되지 않는 경우에도 마찬가지입니다.

이 문제를 해결하려면 메서드를 호출하기 전에 mediaPlayer의 상태를 확인하십시오. 예를 들면 :

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

또한 MediaPlayer는 이벤트 메시지를 보냅니다. 준비된 이벤트가 필요하지 않더라도 (이 이벤트가 시작되기 전에 재생을 시작하지 않는 것이 좋지만) 콜백 수신기를 설정해야합니다. 이것은 또한 마찬가지입니다 OnErrorListener, OnCompletionListener, OnPreparedListenerOnSeekCompletedListener(전화 할 경우이 방법을 추구).

청취자는 간단하게 첨부 할 수 있습니다.

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

내 경우가 재생 플레이어의 일시 정지 () 된 호출
stevo.mit

잘못된 상태에서 mediaPlayer.isPlaying ()을 호출하면 미디어 플레이어가 오류 상태가됩니다. 상태를 유지하기 위해 명시적인 열거 형을 유지하는 것이 좋습니다.
Madeyedexter

14

미디어 플레이어의 현재 위치 (MediaPlayer.getCurrentPosition ())가 준비된 상태가 아닐 때 가져 오려고 할 때이 오류가 발생했습니다. 상태를 추적하고 onPreparedListener가 호출 된 후에 만 ​​getCurrentPosition () 메서드를 호출하여이 문제를 해결했습니다.


그 이유를 어떻게 알았습니까?
AdamMc331

9

이것은 내 코드이며 테스트를 거쳐 잘 작동합니다.

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);
        }
      }
    });
  }
}

4

코드 아래에서 테스트했습니다. 잘 작동

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;
}
}

SetAudioStreamType(..)사용 및 업데이트SetAudioAttributes(...)
Pierre

4

며칠 전에 같은 문제가 발생했습니다. 내 오디오 MediaPlayer는 처리 능력이 높은 장치에서 잘 작동하지만 느린 장치의 경우 미디어 플레이어가 잠시 재생되지 않았고 LogCat에서 잘못된 상태로 호출되는 것에 대해 많은 불만이있었습니다. 그래서 다음과 같이 OnPreparedListener ()onPrepared () 메서드 에서 start () , pause () , ... 호출을 호출하여 해결했습니다 .

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) {
                            ............

                        }
                    });
                }
            });

또한 더 이상 필요하지 않은 미디어 플레이어를 출시하십시오. 예를 들어 백그라운드에서 오디오 또는 비디오를 재생하지 않으려면 onPause () 에서 mediaPlayer.release () 를 호출해야합니다 .


3

Android에서 디코딩 할 수없는 방식으로 파일이 인코딩되는 경우가 있습니다. 일부 mp4 파일도 재생할 수 없습니다. 다른 파일 형식 (.3gp가 대부분 재생 됨)을 시도하고 ..


46
인터넷 라디오 방송국에 파일 형식 변경을 요청할 수 없습니다.
SmashCode

"이 비디오를 재생할 수 없습니다"팝업이 표시됩니까? 어떻게 처리합니까? 나는 오류를 잡았지만이 모달은 상관없이 얻고 공개 API에서 오는 미디어 소스를 제어 할 수 없습니다. "이 비디오를 재생할 수 없습니다"모달을 방지하는 방법을 아는 사람이 있다면 감사하겠습니다.
Krafty 2014

오류 리스너를 설정하려고 했습니까? MediaPlayer mp = new MediaPlayer () {@Override public void setOnErrorListener (android.media.MediaPlayer.OnErrorListener listener) {// 여기서 작업을 수행합니다 ..}}; mp.setDataSource (..
Rukmal Dias 2014

1

여기에 이미지 설명 입력

그림 위에 올바른 방법을 얻을 수 있습니다.


0

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미디어 플레이어가이 속성을 호출 할 수없는 상태에있을 때 호출 한 메서드 였습니다.


0

재생하기 전에 매번 MediaPlayer의 새 개체를 만들고 그 후에 릴리스하여 오류 (-19,0) 및 (-38,0)을 모두 해결했습니다.

이전 :

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();
        }
    });

}

}


0
  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();

0

매우 실망했습니다. 그래서 나에게 맞는 솔루션을 얻었습니다.

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();
                    }


0

또한 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();

-1

직전에 같은 문제를 만났는데, 1 층에있는 친구가 옳았 고, start()잘못된 시간에 전화를 걸었습니다 . prepare () 또는 prepareSync()이 메서드 를 사용하여 리스너를 설정해야합니다 mediaPlayer.setOnPreparedListener(this). 준비하기 전에이 콜백 호출에서 start()문제를 해결할 수 있습니다. 나는 이미 시도했다.


좀 더 구체적으로 말씀해 주시겠습니까?
Karthik AMR

죄송합니다. 영어는 제 모국어가 아니고 저도 잘 못합니다.하지만 같은 질문을 가진 다른 사람들을 돕고 싶습니다. 그게 전부입니다.
peerless2012

-1

나는 안드로이드 프로그래밍에 익숙하지 않으며 이것과 같은 오류가 발생했습니다. 그래서 간단히 mp.createmediaPlayer = MediaPlayer.create (getApplicationContext (), Settings.System.DEFAULT_RINGTONE_URI)를 재정의했습니다. 진정한 방법은 아닐지 모르지만 벌금이 부과되었습니다.

try {
  mp = MediaPlayer.create(getApplicationContext(), Settings.System.DEFAULT_RINGTONE_URI);
} catch (Exception e) {
  e.printStackTrace();
}

mp.start();

-2
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();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.