저는 현재 인터넷 라디오 방송국을 스트리밍하는 간단한 앱을 디자인하려고합니다. 방송국의 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
, OnPreparedListener
과 OnSeekCompletedListener
(전화 할 경우이 방법을 추구).
청취자는 간단하게 첨부 할 수 있습니다.
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가 대부분 재생 됨)을 시도하고 ..