Android播放在線音頻問題,報錯MediaPlayer error

#播放在線音頻問題 報錯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();
}


#改變才能更加強大!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章