关闭

Android开发笔记之SeekBar 时间的显示 快进快退 Mediaplayer

标签: MediaplayeSeekbarHandler
1112人阅读 评论(0) 收藏 举报
分类:

播放器常用功能的demo

时间的显示 快进 后退 拖动等等

package com.example.mediaplayer_retry;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener{

MediaPlayer mMediaPlayer;
Button mPlayButton, mPauseButton, mStopButton, mForWard, mBackWard;
SeekBar mSeekBar;
TextView mTextView_one,mTextView_two;
Handler mHandler = new Handler(){
    public void handleMessage(android.os.Message msg) {
        int currentPosition = mMediaPlayer.getCurrentPosition();
        mSeekBar.setProgress(currentPosition);
        String time = formatTime(currentPosition);
        mTextView_one.setText(time);
        mHandler.sendEmptyMessageDelayed(0, 1000);
    };
};
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initView();
    setPlayListener();
    setPause();
    setStopListener();
    setSeekBarListener();
}

/********************************************************
 * 初始化控件
 */
private void initView() {
    mPlayButton = (Button) findViewById(R.id.media_play);
    mPauseButton = (Button) findViewById(R.id.media_pause);
    mStopButton = (Button) findViewById(R.id.media_stop);
    mForWard = (Button) findViewById(R.id.media_forward);
    mBackWard = (Button) findViewById(R.id.media_backwrad);
    mSeekBar = (SeekBar) findViewById(R.id.main_seekbar);
    mTextView_one = (TextView) findViewById(R.id.main_textview_time_one);
    mTextView_two = (TextView) findViewById(R.id.main_textview_time_two);
    mForWard.setOnClickListener(this);
    mBackWard.setOnClickListener(this);
}

/*******************************************************
 * 必须在方法中初始化mMediaPlayer对象
 * 播放音乐的初始化动作 setDataSource(path)设置音频的路径就是mp3的路径
 * mMediaPlayer.prepare()此方法就是装载音频文件
 * mMediaPlayer.start();此方法必须在上面的方法执行完毕后才可以
 * @param path 传入音频文件的路径参数
 */
public void play(String path) {
    if (mMediaPlayer == null) {
        try {
            mMediaPlayer = new MediaPlayer();
            mMediaPlayer.setDataSource(path);
            mMediaPlayer.prepare();
            mMediaPlayer.start();
            int position = mMediaPlayer.getDuration();
            mTextView_two.setText(formatTime(position));
            mSeekBar.setMax(position);
            mHandler.sendEmptyMessageDelayed(0, 1000);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }else if(mMediaPlayer != null && !mMediaPlayer.isPlaying()){
        mMediaPlayer.start();
    }
}

/**********************************************************
 * 设置播放按钮的点击事件 同时执行播放音乐方法 此点击事件采用的是匿名内部类的方式实现的
 */
public void setPlayListener() {
    mPlayButton.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            play("/sdcard/hello.mp3");
        }
    });
}

/*********************************************************
 * 暂停当前播放的音乐
 */
@SuppressLint("SdCardPath")
public void setPause() {
    if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
        mMediaPlayer.pause();
    }
}

/*************************************************
 * 设置点击暂停按钮的点击事件 同时执行mMediaPlayer的暂停pause方法
 * 此点击事件的方式是采用xml属性中设置onclick这个属性的方法
 */
public void pause(View v) {
    setPause();
}
/************************************************
 * 停止播放音乐的方法
 * 同时我们要释放内存,节约内存
 * 把mMediaPlayer赋值为空,返回到开始播放的状态
 */
public void stop(){
    if(mMediaPlayer != null){
        mMediaPlayer.stop();
        mMediaPlayer.release();
        mMediaPlayer = null;
    }
}
/*************************************************
 * 设置停止按钮的监听事件
 * 此按钮的监听事件采用第三种方式
 */
public void setStopListener(){
    mStopButton.setOnClickListener(listener);
}
OnClickListener listener = new OnClickListener() {
    @Override
    public void onClick(View v) {
        stop();
    }
};
/***************************************************
 * 设置快进10秒方法
 */
public void forWard(){
    if(mMediaPlayer != null){
        int position = mMediaPlayer.getCurrentPosition();
        mMediaPlayer.seekTo(position + 10000);
    }
}
/*****************************************************
 * 设置后退10秒的方法
 */
public void backWard(){
    if(mMediaPlayer != null){
        int position = mMediaPlayer.getCurrentPosition();
        if(position > 10000){
            position-=10000;
        }else{
            position = 0;
        }
        mMediaPlayer.seekTo(position);
    }
}
/********************************************************
 * 设置seekbar的拖动监听事件
 */
public void setSeekBarListener(){
    mSeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
        public void onStopTrackingTouch(SeekBar seekBar) {

        }

        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        public void onProgressChanged(SeekBar seekBar, int progress,
                boolean fromUser) {
            // TODO Auto-generated method stub
            if(mMediaPlayer != null && fromUser){
                mMediaPlayer.seekTo(progress);
            }
        }
    });
}
/*******************************************************
 * 关闭当前页面,停止播放
 */
protected void onDestroy() {
    super.onDestroy();
    stop();
}
/********************************************************
 * 设置快进和后退按钮的监听事件
 * @param v
 */
@Override
public void onClick(View v) {
    switch (v.getId()) {
    case R.id.media_forward:
        forWard();
        break;
    case R.id.media_backwrad:
        backWard();
        break;
    default:
        break;
    }
}
/********************************************************
 * 对时间的格式化
 * @param time
 * @return
 */
public static String formatTime(int time){
    if(time/1000%60 <10){
        return time/1000/60 + ":0" + time/1000%60;
    }else{
        return time/1000/60 + ":" + time/1000%60;
    }
}

}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:39180次
    • 积分:810
    • 等级:
    • 排名:千里之外
    • 原创:41篇
    • 转载:4篇
    • 译文:0篇
    • 评论:0条