태그 보관물: android-mediaplayer

android-mediaplayer

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

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

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

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



답변

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

방법은 다음과 같습니다.

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

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

답변

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

답변

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


답변

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

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

답변

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

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

답변

며칠 전에 같은 문제가 발생했습니다. 내 오디오 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 () 를 호출해야합니다 .


답변

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