AudioPlayActivity.java 8.65 KB
package com.cnlive.demo.video;

import android.content.Context;
import android.media.AudioManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.cnlive.libs.video.video.MediaPlayer;
import com.cnlive.libs.video.video.base.IMediaPlayer;

import java.io.IOException;

public class AudioPlayActivity extends AppCompatActivity implements View.OnClickListener {

    private static final String TAG = "AudioPlayActivity";
    private Button startBtn, pauseBtn, continueBtn, stopBtn;
    private AudioManager mAudioManager;
    private MediaPlayer mMediaPlayer;
    private String mDataSource;
    private boolean isStoped = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_audio_play);
        mDataSource = getIntent().getStringExtra("path");
        initView();
        initMediaPlayer();
        mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    }

    private void initView() {
        startBtn = (Button) findViewById(R.id.start);
        pauseBtn = (Button) findViewById(R.id.pause);
        continueBtn = (Button) findViewById(R.id.continuep);
        stopBtn = (Button) findViewById(R.id.stop);
    }

    private void initMediaPlayer() {
        if (mMediaPlayer == null) {
            mMediaPlayer = new MediaPlayer(this);
            mMediaPlayer.setOnPreparedListener(mOnPreparedListener);
            mMediaPlayer.setOnCompletionListener(mOnCompletionListener);
            mMediaPlayer.setOnBufferingUpdateListener(mOnBufferingUpdateListener);
            mMediaPlayer.setOnErrorListener(mOnErrorListener);
            mMediaPlayer.setOnInfoListener(mOnInfoListener);
            mMediaPlayer.setOnPlayStateListener(mOnPlayStateListener);
            mMediaPlayer.setBufferTimeMax(3);
            mMediaPlayer.setTimeout(5, 30);
        }
        try {
            mMediaPlayer.setDataSource(mDataSource);
            mMediaPlayer.prepareAsync();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.start:
                if (isStoped) {
                    initMediaPlayer();
                } else {
                    if (mMediaPlayer != null)
                        mMediaPlayer.start();
                }
                break;
            case R.id.pause:
                if (mMediaPlayer != null)
                    mMediaPlayer.pause();
                break;
            case R.id.continuep:
                if (mMediaPlayer != null)
                    mMediaPlayer.reload(mDataSource, true);
                break;
            case R.id.stop:
                if (mMediaPlayer != null) {
                    mMediaPlayer.stop();
                    mMediaPlayer.release();
                }
                isStoped = true;
                mMediaPlayer = null;

                break;
        }
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            videoPlayEnd();
        }

        return super.onKeyDown(keyCode, event);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mAudioManager.abandonAudioFocus(mAudioFocusChange);
    }

    private void videoPlayEnd() {
        if (mMediaPlayer != null) {
            mMediaPlayer.release();
            mMediaPlayer = null;
        }

        finish();
    }

    private AudioManager.OnAudioFocusChangeListener mAudioFocusChange = new AudioManager.OnAudioFocusChangeListener() {
        @Override
        public void onAudioFocusChange(int focusChange) {
            switch (focusChange) {
                case AudioManager.AUDIOFOCUS_LOSS:
                    //长时间丢失焦点,当其他应用申请的焦点weiAUDIOFOCUS_GAIN时,会触发此回调事件,例如播放QQ音乐,网易云音乐等
                    //通常需要暂停音乐播放,若没有暂停播放就会出现和其他音乐同时输出声音
                    if (mMediaPlayer != null)
                        mMediaPlayer.pause();
                    //释放焦点,该方法可根据需要来决定是否调用
                    //若焦点释放掉之后,捡不回自动获取
                    mAudioManager.abandonAudioFocus(mAudioFocusChange);
                    break;
                case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
                    //短暂性丢失焦点,当其他应用申请AUDIOFOCUS_GAIN_TRANSIENT或AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE时会触发此回调事件
                    //例如播放短视频,拨打电话等。
                    //通常需要暂停音乐播放
                    if (mMediaPlayer != null)
                        mMediaPlayer.pause();
                    break;
                case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
                    //短暂性丢失焦点并作降音处理
                    break;
                case AudioManager.AUDIOFOCUS_GAIN:
                    //当其他应用申请焦点之后又释放焦点会触发此回调
                    //可重新播放音乐
                    if (mMediaPlayer != null)
                        mMediaPlayer.start();
                    break;
            }
        }
    };

    private IMediaPlayer.OnPreparedListener mOnPreparedListener = new IMediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(IMediaPlayer iMediaPlayer) {
            mMediaPlayer.start();
            isStoped = false;
        }
    };

    private IMediaPlayer.OnBufferingUpdateListener mOnBufferingUpdateListener = new IMediaPlayer.OnBufferingUpdateListener() {
        @Override
        public void onBufferingUpdate(IMediaPlayer iMediaPlayer, int i) {
            Log.d(TAG, "onBufferingUpdate : " + i + "%");
        }
    };

    private IMediaPlayer.OnCompletionListener mOnCompletionListener = new IMediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(IMediaPlayer iMediaPlayer) {
            Log.d(TAG, "Play Completed !");
            videoPlayEnd();
        }
    };

    private IMediaPlayer.OnErrorListener mOnErrorListener = new IMediaPlayer.OnErrorListener() {
        @Override
        public boolean onError(IMediaPlayer iMediaPlayer, int i, int i1) {
            switch (i) {
                case MediaPlayer.MEDIA_ERROR_UNKNOWN:
                    Log.e(TAG, "OnErrorListener, Error Unknown:" + i + ",extra:" + i1);
                    break;
                default:
                    Log.e(TAG, "OnErrorListener, Error:" + i + ",extra:" + i1);
            }

            videoPlayEnd();

            return false;
        }
    };

    public IMediaPlayer.OnInfoListener mOnInfoListener = new IMediaPlayer.OnInfoListener() {
        @Override
        public boolean onInfo(IMediaPlayer iMediaPlayer, int i, int i1) {
            switch (i) {
                case MediaPlayer.MEDIA_INFO_BUFFERING_START:
                    Log.d(TAG, "Buffering Start.");
                    break;
                case MediaPlayer.MEDIA_INFO_BUFFERING_END:
                    Log.d(TAG, "Buffering End.");
                    break;
                case MediaPlayer.MEDIA_INFO_AUDIO_RENDERING_START:
                    Toast.makeText(AudioPlayActivity.this, "Audio Rendering Start", Toast.LENGTH_SHORT).show();
                    break;
                case MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START:
                    Toast.makeText(AudioPlayActivity.this, "Video Rendering Start", Toast.LENGTH_SHORT).show();
                    break;
                case MediaPlayer.MEDIA_INFO_SUGGEST_RELOAD:
                    // Player find a new stream(video or audio), and we could reload the video.
                    if (mMediaPlayer != null)
                        mMediaPlayer.reload(mDataSource, false);
                    break;
                case MediaPlayer.MEDIA_INFO_RELOADED:
                    Toast.makeText(AudioPlayActivity.this, "Succeed to reload video.", Toast.LENGTH_SHORT).show();
                    Log.d(TAG, "Succeed to reload video.");
                    return false;
            }
            return false;
        }
    };

    private IMediaPlayer.OnPlayStateListener mOnPlayStateListener = new IMediaPlayer.OnPlayStateListener() {
        @Override
        public void onPlayState(boolean isPlay) {
            if (isPlay)
                mAudioManager.requestAudioFocus(mAudioFocusChange, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
        }
    };

}