MediaPlayer

本文详细介绍了一个基于Android平台的自定义音视频播放器开发过程。该播放器使用了MediaPlayer进行音频播放,并通过SeekBar实现播放进度控制。文章还介绍了如何处理播放状态的变化,包括播放、暂停、进度更新等,并实现了通过Handler机制更新UI显示播放进度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class VoiceNavigationActivity extends BaseActivity implements SeekBar.OnSeekBarChangeListener {

    private MediaPlayer mMediaPlayer = null;//媒体播放器
    private AudioManager mAudioManager = null;//声音管理器

    private SeekBar mSoundSeekBar = null;
    private int maxStreamVolume;//最大音量
    private int currentStreamVolume;//当前音量
    private int setStreamVolume;//设置的音量
    private CheckBox bt;
    private TextView text;
    private Timer mTimer;
    private TimerTask mTimerTask;
    private ProgressBar progressBar2;
    private TextView time_text;
    private String url="http://ssapi.shaolinsi.gov.cn/admin/../uploadfile/intro/1-1.mp3";

    private Handler handler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);


            time_text.setText(FormatUtil.formatTime(mMediaPlayer.getCurrentPosition()) + "/" + FormatUtil.formatTime(mMediaPlayer.getDuration()));

            if (mMediaPlayer.getCurrentPosition() == mMediaPlayer.getDuration()) {
                bt.setChecked(true);
                time_text.setText("00:00/"+mMediaPlayer.getDuration());
                mMediaPlayer.seekTo(0);
                
            }

        }
    };

    private boolean isChanging = false;//互斥变量,防止定时器与SeekBar拖动时进度冲突

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_voice_navigation);
        text = (TextView) findViewById(R.id.text);
        bt = (CheckBox) findViewById(R.id.bt);
        time_text = (TextView) findViewById(R.id.time_text);
//        mMediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.kalimba);

        progressBar2= (ProgressBar) findViewById(R.id.progressBar2);
        setplayer();


    }

    private void setplayer() {

        mMediaPlayer=new MediaPlayer();

        mAudioManager = (AudioManager) this.getSystemService(AUDIO_SERVICE);
        mSoundSeekBar = (SeekBar) findViewById(R.id.SoundSeekBar);
        progressBar2.setVisibility(View.VISIBLE);
        bt.setVisibility(View.INVISIBLE);
        try {

            mMediaPlayer.reset();
            mMediaPlayer.setDataSource(url);
            mMediaPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() {
                @Override
                public void onBufferingUpdate(MediaPlayer mp, int percent) {

                

                    mSoundSeekBar.setSecondaryProgress(percent);
                }
            });

            mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {

                    progressBar2.setVisibility(View.INVISIBLE);
                    bt.setVisibility(View.VISIBLE);
                    ;
                    setmMediaPlayer();

                }


            });
            mMediaPlayer.prepareAsync();

        } catch (IOException e) {
            e.printStackTrace();
            
        }



    }
    private void setmMediaPlayer() {

        bt.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                if (isChecked) {//  没有播放


                    if (mMediaPlayer.isPlaying()) {
                        mMediaPlayer.pause();
                    }
                } else {


                    mMediaPlayer.start();
                    if (mTimer == null) {
                        mTimer = new Timer();
                    }

                    if (mTimerTask == null) {

                        mTimerTask = new TimerTask() {
                            @Override
                            public void run() {
                                if (isChanging == true) {
                                    return;
                                }
                                Message message = handler.obtainMessage();


                                if (mMediaPlayer.getDuration() > mMediaPlayer.getCurrentPosition()) {
                                    handler.sendMessage(message);
                                    mSoundSeekBar.setProgress(mMediaPlayer.getCurrentPosition() * 100 / mMediaPlayer.getDuration());
                                } else {
                                    handler.sendMessage(message);
                                    mMediaPlayer.pause();
                                    mSoundSeekBar.setProgress(0);
                                    mTimer.cancel();
                                    mTimer = null;
                                    mTimerTask.cancel();
                                    mTimerTask = null;
                                   
                                    return;
                                }

                            }
                        };
                        mTimer.schedule(mTimerTask, 0, 1000);
                    }

                }

            }
        });


        maxStreamVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
        currentStreamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
        mSoundSeekBar.setProgress(0);
        mSoundSeekBar.setOnSeekBarChangeListener(this);


    }


    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
        mMediaPlayer.seekTo(seekBar.getProgress() * mMediaPlayer.getDuration() / 100);
        isChanging = true;
    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
        mMediaPlayer.seekTo(seekBar.getProgress() * mMediaPlayer.getDuration() / 100);
        isChanging = false;
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mMediaPlayer.pause();
        if (mMediaPlayer.isPlaying()) {
            mMediaPlayer.stop();
            mMediaPlayer.release();
            if(mTimerTask!=null){
                mTimerTask.cancel();
            }
        }
    }

    @Override
    public void onBackPressed() {

        mMediaPlayer.pause();
        if (mMediaPlayer.isPlaying()) {
            mMediaPlayer.stop();
            mMediaPlayer.release();
            if(mTimerTask!=null){
                mTimerTask.cancel();
            }
        }
        super.onBackPressed();
    }

}

MediaPlayer是Android中用于播放音频和视频的类。它提供了一系列方法和回调函数,可以控制媒体的播放、暂停、停止以及获取和更新播放进度等操作。 在使用MediaPlayer之前,需要先创建一个MediaPlayer对象,并设置数据源。有两种方式可以创建MediaPlayer对象,一种是直接使用new关键字创建一个实例,然后调用setDataSource()方法设置数据源;另一种是使用MediaPlayerUtil类进行封装,通过init()方法进行初始化,并设置回调函数监听媒体状态的变化。 使用MediaPlayer时,可以通过调用start()方法开始播放音频,通过onPrepared()回调函数监听音频加载完成的事件,在此方法中可以取消加载进度条并开始播放。通过onSeekUpdate()回调函数可以更新播放进度条的状态。onCompletion()回调函数可以监听音频播放完成的事件。如果发生错误,可以调用reset()方法重置UI状态,并返回true表示处理错误。 关于MediaPlayer的更多详细信息,可以参考MediaPlayer的官方文档。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Android 使用MediaPlayer播放音频详解](https://blog.csdn.net/baidu_38627723/article/details/120429916)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值