关于MediaPlayer使用的一些积累

这个主要是记录一下。。。

public class DynamicItemAdapter extends BaseAdapter {

    private int mLastVoiceIndex;
    WeakReference<AudioController> mAudioControllerWeakReference;


    public void stopPlayer() {
        mLastVoiceIndex = -1;
        if (mAudioControllerWeakReference != null && mAudioControllerWeakReference.get() != null) {
            mAudioControllerWeakReference.get().stop();
            mAudioControllerWeakReference.clear();
            mAudioControllerWeakReference = null;
        }
    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // 音频
        final AudioController controller = new AudioController(audioIv, audioTv, audioUrl, audioSize);
        if (!TextUtils.isEmpty(audioUrl)) {
            audioFl.setVisibility(View.VISIBLE);
            controller.resetAnim();
            audioFl.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (mLastVoiceIndex != index) {
                        stopPlayer();
                        mAudioControllerWeakReference = new WeakReference<>(controller);
                        mLastVoiceIndex = index;
                        mAudioControllerWeakReference.get().handle();
                    } else {
                        stopPlayer();
                    }
                }
            });

        return convertView;
    }
}
public class AudioController {
    /**
     * 语音图标
     */
    private ImageView mImageView;
    /**
     * 时间文字
     */
    private TextView mTextView;
    /**
     * 音频总长度
     */
    private long millisInFuture;
    /**
     * 播放间隔
     */
    private long countDownInterval = 1000;
    private MediaPlayer mediaPlayer;
    private AnimationDrawable mAnimationDrawable;
    private String mAudioUrl;
    private AudioTimeCount mAudioTimeCount;

    public AudioController(ImageView imageView, TextView textView, String audioUrl, int millisInFuture) {
        this.mImageView = imageView;
        this.mTextView = textView;
        mAudioUrl = audioUrl;
        this.millisInFuture = millisInFuture * 1000;
    }

    public void handle() {
        // 这里需要重新获取src,因为每次动画结束都会重新设置src
        mAnimationDrawable = (AnimationDrawable) mImageView.getDrawable();
        toPlayAudio(mAudioUrl);
        mAnimationDrawable.stop();
        mAnimationDrawable.start();
        mAudioTimeCount = new AudioTimeCount(millisInFuture, countDownInterval);
        mAudioTimeCount.cancel();
        mAudioTimeCount.start();
    }

    public void resetAnim() {
        mAnimationDrawable = (AnimationDrawable) mImageView.getDrawable();
        mAnimationDrawable.stop();
    }

    public void stop() {
        mAudioTimeCount.cancel();
        completeAnim();
        releaseMediaPlayer();
    }

    /**
     * stopping MediaPlayer in separate thread because it can take a time
     */
    public void releaseMediaPlayer() {
        final long time = System.currentTimeMillis();
        new Thread(new Runnable() {
            @Override
            public void run() {
                if (mediaPlayer != null) {
                    mediaPlayer.stop();
                    mediaPlayer.release();
                    mediaPlayer = null;
                }
                long dy3 = System.currentTimeMillis() - time;
                Log.d("AudioController", "======releaseMediaPlayer() taste time ========" + dy3);
            }
        }).start();
    }

    private void completeAnim() {
        mTextView.setText(millisInFuture / 1000 + "\"");
        // 这里需要重新设置src,否则会出现图片效果错误
        mImageView.setImageDrawable(mImageView.getResources().getDrawable(R.anim.anim_audio_play));
        resetAnim();
    }

    /**
     * 播放音频
     * start MediaPlayer in separate thread because it can take a time
     */
    private void toPlayAudio(final String url) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                toPlay(url);
            }
        }).start();
    }

    private void createMediaPlayerIfNeeded() {
        if (mediaPlayer == null) {
            mediaPlayer = new MediaPlayer();
        }
    }

    private void toPlay(String url) {
        try {
            createMediaPlayerIfNeeded();
            mediaPlayer.setDataSource(url);
            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer player) {
                    mediaPlayer.start();
                }
            });
            mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer player) {
                    releaseMediaPlayer();
                }
            });
            mediaPlayer.setOnErrorListener(new OnErrorListener() {
                @Override
                public boolean onError(MediaPlayer player, int what, int extra) {
                    releaseMediaPlayer();
                    return false;
                }
            });
            mediaPlayer.prepareAsync();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 定时器去更新语音里面的文字信息
     */
    class AudioTimeCount extends CountDownTimer {

        public AudioTimeCount(long millisInFuture, long countDownInterval) {
            super(millisInFuture, countDownInterval);
        }

        @Override
        public void onTick(long millisUntilFinished) {
            int time = (int) (millisUntilFinished / 1000);
            mTextView.setText(time + "\"");
        }

        @Override
        public void onFinish() {
            completeAnim();
        }
    }

}

这里mediaPlayer.prepareAsync()以及releaseMediaPlayer都使用了线程,因为很耗时(网上找了一圈都没有找到好的解决办法,如果你知道请告诉我)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值