#播放在線音頻問題 報錯MediaPlayer error
這裏對Android播放在線音頻報錯的情況做一下簡單經驗總結。
如果報錯:MediaPlayer error (1, -2147483648)
有兩種可能:
1、這個網址是不正確的
2、這個音頻文件的編碼格式,手機不支持
3、還有可能電腦端瀏覽器能訪問,但是都是手機端訪問返回403,這個我就遇到了。
上面的情況,一般播放在線音頻文件的預加載模式時間會比較久,有時候20多秒.才顯示播放失敗!
第一種情況和第三種情況其實都是差不多,都是訪問沒有返回200的訪問碼。
如果報錯:E/MediaPlayerNative: error (1, -19)
就是Media狀態不對的情況下播放
比如:
1、MediaPlayerNative 沒有回收
需要在播放完成或者停止的時候把對象釋放。
mediaPlayer.reset();
mediaPlayer.release();
2、設置錯誤的播放流類型
比如設置成播放鬧鈴類型,這個可能要特殊權限或者其他設置,反正會報錯。
MediaPlayer.setAudioStreamType(AudioAttributes.USAGE_NOTIFICATION_RINGTONE);
這個熟悉一般不設置或者設置成MUSIC類型就可以啦。
在線音頻播放前最好,判斷一下是否能接收數據,然後再播放。
如下判斷連接的url地址返回的狀態的代碼:
/**
* 判斷連接的url地址返回的狀態,必須在子線程運行否則報錯null
*
* @param address
* @return
*/
public int getUrlConnectionState(String address) {
int status = HttpURLConnection.HTTP_NOT_FOUND;
try {
URL urlObj = new URL(address);
HttpURLConnection oc = (HttpURLConnection) urlObj.openConnection();
oc.setUseCaches(false);
oc.setConnectTimeout(3000); // 設置超時時間
oc.connect();
status = oc.getResponseCode();// 請求狀態
if (HttpURLConnection.HTTP_OK == status) {
return status;
}
} catch (Exception e) {
Log.e(TAG, " Media getUrlConnectionState error=" + e.getMessage());
}
return status;
}
如果返回的值爲HttpURLConnection.HTTP_OK(200),說明能正常連通。
完整的控制在線音頻文件的示例代碼:
private staticTimer timer = new Timer();
private static MediaPlayer mOnlineMediaPlayer; //背景音頻文件對象
private IActionListener mOnlineMediaListener = null;
/**
* 播放在線音頻文件
*
* @param url
* @param loop
* @param iActionListener
*/
public void playOnlineMedia(final String url, final float volume, final boolean loop, final IActionListener iActionListener) {
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
playInnerOnlineMedia(url, volume, loop, iActionListener);
}
};
timer.schedule(timerTask, 0);
}
public void playInnerOnlineMedia(final String url, float volume, boolean loop, IActionListener iActionListener) {
Log.i(TAG, "playOnlineMedia url=" + url + ",volume=" + volume + ",loop=" + loop + ",iActionListener=" + iActionListener);
int state = getUrlConnectionState(url);
if (state != HttpURLConnection.HTTP_OK) {
Log.e(TAG, "playOnlineMedia visit url=" + url + " ,return state:" + state);
return;
}
stopOnlineMedia();
mOnlineMediaListener = iActionListener;
mOnlineMediaPlayer = new MediaPlayer();
try {
//音頻播放完畢,回調onCompletion方法
mOnlineMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
Log.i(TAG, "playOnlineMedia onCompletion url=" + url);
if (mOnlineMediaListener != null) {
onActionListener(true, mOnlineMediaListener);
}
mOnlineMediaListener = null;
}
});
mOnlineMediaPlayer.setDataSource(url);
mOnlineMediaPlayer.setLooping(loop);
mOnlineMediaPlayer.setVolume(volume, volume);
mOnlineMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
Log.e(TAG, "playOnlineMedia setOnErrorListener what=" + what + ",extra=" + extra);
return false;
}
});
mOnlineMediaPlayer.setAudioStreamType(AudioAttributes.USAGE_NOTIFICATION_RINGTONE);
mOnlineMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
Log.i(TAG, "playOnlineMedia onPrepared url=" + url);
if (mOnlineMediaPlayer != null) {
mp.start();
}
}
});
mOnlineMediaPlayer.prepareAsync();
onActionListener(false, iActionListener);
} catch (IOException e) {
Log.e(TAG, "playOnlineMedia.start error=" + e.getMessage());
e.printStackTrace();
}
}
/**
* 停止在線音頻文件播放
*/
public void stopOnlineMedia() {
Log.e(TAG, "stopOnlineMedia ");
if (mOnlineMediaPlayer != null) {
try {
if (mOnlineMediaPlayer.isPlaying()) {
mOnlineMediaPlayer.stop();
}
mOnlineMediaPlayer.release();
} catch (IllegalStateException e) {
Log.e(TAG, "stopOnlineMedia error=" + e.getMessage());
}
if (mOnlineMediaListener != null) {
onActionListener(true, mOnlineMediaListener);
}
mOnlineMediaPlayer = null;
mOnlineMediaListener = null;
}
}
/**
* 暫停在線音頻文件播放
*/
public void pauseOnlineMedia() {
Log.e(TAG, "pauseOnlineMedia ");
if (mOnlineMediaPlayer != null) {
try {
if (mOnlineMediaPlayer.isPlaying()) {
mOnlineMediaPlayer.pause();
}
} catch (IllegalStateException e) {
Log.e(TAG, "pauseOnlineMedia error=" + e.getMessage());
}
}
}
/**
* 恢復在線音頻文件播放
*/
public void resumeOnlineMedia() {
Log.e(TAG, "resumeOnlineMedia ");
if (mOnlineMediaPlayer != null) {
try {
if (!mOnlineMediaPlayer.isPlaying()) {
mOnlineMediaPlayer.start();
}
} catch (IllegalStateException e) {
Log.e(TAG, "resumeOnlineMedia error=" + e.getMessage());
}
}
}
/**
* 判斷音頻文件是否在播放
*
* @return
*/
public boolean isOnlineMediaPlaying() {
try {
if (mOnlineMediaPlayer != null && mOnlineMediaPlayer.isPlaying()) {
return true;
}
} catch (IllegalStateException e) {
Log.e(TAG, "isOnlineMediaPlaying error=" + e.getMessage());
}
return false;
}
/**
* 判斷連接的url地址返回的狀態,必須在子線程運行否則報錯null
*
* @param address
* @return
*/
public int getUrlConnectionState(String address) {
int status = HttpURLConnection.HTTP_NOT_FOUND;
try {
URL urlObj = new URL(address);
HttpURLConnection oc = (HttpURLConnection) urlObj.openConnection();
oc.setUseCaches(false);
oc.setConnectTimeout(3000); // 設置超時時間
oc.connect();
status = oc.getResponseCode();// 請求狀態
if (HttpURLConnection.HTTP_OK == status) {
return status;
}
} catch (Exception e) {
Log.e(TAG, " Media getUrlConnectionState error=" + e.getMessage());
}
return status;
}
播放狀態接口IActionListener
interface IActionListener {
/**
* 行爲開始
*/
void onStart();
/**
*行爲結束
*/
void onEnd();
}
#改變才能更加強大!