MediaPlayer的使用

来源:互联网 发布:hadoop wordcount源码 编辑:程序博客网 时间:2024/06/15 15:00

MediaPlayer的使用

简介:Android应用程序中的音频和视频的播放通常有MediaPlayer类进行处理。使用MediaPlayer,能播放存储在应用程序资源、本地文件、ContentProvider、网络URL的流式传输中的媒体。

MediaPlaye对音频和视频文件以及数据流的管理是作为一个状态机来处理的。状态机详细资料,点击这里跳转简单来说,就是:

  1. 对将要播放媒体的MediaPlayer进行初始化;
  2. 使MediaPlayer进入准备状态;
  3. 开始播放;
  4. 在播放完成之前暂停或停止播放;
  5. 播放完成。

一、播放音频

以下是MediaPlayer中一些常用的方法:

示例:播放assetes文件夹下的音频资源,可以暂停/播放、随机切换、与SeekBar控件建立关联。

效果:

1.1 布局文件

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical">    <TextView        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_marginBottom="20dp"        android:background="#1E95D6"        android:gravity="center"        android:padding="10dp"        android:text="音频播放器"        android:textColor="#FFFFFF"        android:textSize="20sp" />    <TextView        android:id="@+id/audio_title"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:padding="10dp"        android:text="音频文件名"        android:textSize="16sp"        android:gravity="center"/>    <TextView        android:id="@+id/audio_singer"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="歌手"        android:padding="10dp"        android:textSize="14sp"        android:gravity="center"/>    <LinearLayout        android:id="@+id/lin_Media"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:gravity="center_vertical"        android:orientation="horizontal">        <TextView            android:id="@+id/time_current"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="1"            android:gravity="center"            android:text="0:0" />        <SeekBar            android:id="@+id/seekBar"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="5" />        <TextView            android:id="@+id/time_sum"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="1"            android:gravity="center"            android:text="0:0" />    </LinearLayout>    <LinearLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:orientation="horizontal">        <Button            android:id="@+id/play"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_margin="10dp"            android:layout_weight="1"            android:text="暂停" />        <Button            android:id="@+id/random"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_margin="10dp"            android:layout_weight="1"            android:text="随机切换" />    </LinearLayout></LinearLayout>

2.2 资源文件

2.3 代码

public class MediaMusicActivity extends Activity {    @BindView(R.id.audio_title)    TextView audioTitle;    @BindView(R.id.audio_singer)    TextView audioSinger;    @BindView(R.id.time_current)    TextView timeCurrent;    @BindView(R.id.seekBar)    SeekBar seekBar;    @BindView(R.id.time_sum)    TextView timeSum;    @BindView(R.id.play)    Button btnPlay;    private Context mContext = MediaMusicActivity.this;    private static MediaPlayer mMusicMediaPlayer;    private Timer mTimer = new Timer();    private int toProgress;    private int currentMusic;    private String[] arrMusicName = new String[]{"Stay With Me(中文版)", " Numb", "Apologize"};    private String[] arrMusicSinger = new String[]{"Jason Chen", "Linkin Park", "Kris Allen"};    private String[] arrMusicUri = new String[]{"_001.mp3", "_002.mp3", "_003.mp3"};    private final static int UPDATE = 01001;//更新    private Handler handler = new Handler(){    @Override    public void handleMessage(Message msg) {        switch (msg.what){        case UPDATE:            timeCurrent.setText(getTime(mMusicMediaPlayer.getCurrentPosition()));            seekBar.setProgress(mMusicMediaPlayer.getCurrentPosition());            break;        }    }    };    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_media_music);        ButterKnife.bind(this);        currentMusic = randomGenerator(0, arrMusicUri.length);        initMediaPlayer(mContext);        mTimer.schedule(new TimerTask() {            @Override            public void run() {            handler.sendEmptyMessage(UPDATE);            }        },0,1000);        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {            @Override            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {                timeCurrent.setText(getTime(progress));                toProgress = progress;            }            @Override            public void onStartTrackingTouch(SeekBar seekBar) {            }            @Override            public void onStopTrackingTouch(SeekBar seekBar) {                mMusicMediaPlayer.seekTo(toProgress);                mMusicMediaPlayer.start();            }        }); }    @OnClick({R.id.play, R.id.random})    public void onViewClicked(View view) {        switch (view.getId()) {            case R.id.play:                if(mMusicMediaPlayer.isPlaying()){                    mMusicMediaPlayer.pause();                    btnPlay.setText("播放");                }else {                    mMusicMediaPlayer.start();                    btnPlay.setText("暂停");                }                break;            case R.id.random:                initMediaPlayer(mContext);                break;        }    }    /**     * 创建MediaPlayer对象,并设置数据源     */    private void initMediaPlayer(Context context) {        int intRandom = randomMusic();        if (mMusicMediaPlayer == null) {            mMusicMediaPlayer = new MediaPlayer();        }        mMusicMediaPlayer.reset(); // 强制重置(针对非第一次播放)        AssetManager assetManager = context.getAssets();        try {            AssetFileDescriptor fileDescriptor = assetManager.openFd(arrMusicUri[intRandom]);            mMusicMediaPlayer                .setDataSource(fileDescriptor.getFileDescriptor(),                    fileDescriptor.getStartOffset(),                    fileDescriptor.getLength());            mMusicMediaPlayer.prepare();            mMusicMediaPlayer.start();//播放            updateViews(intRandom);//更新UI        } catch (IOException e) {            e.printStackTrace();        }    }    /**     * 随机切换(生成一个与当前值不同的随机数)     * @return     */    private int randomMusic(){        int intRandom = randomGenerator(0, arrMusicUri.length);        while (intRandom == currentMusic){            intRandom = randomGenerator(0, arrMusicUri.length);        }           return intRandom;    }    /**     * 重置播放器后更新UI     * @param position     */    private void updateViews(int position) {        audioTitle.setText(arrMusicName[position]);        audioSinger.setText(arrMusicSinger[position]);        timeSum.setText(getTime(mMusicMediaPlayer.getDuration()));        seekBar.setMax(mMusicMediaPlayer.getDuration());        seekBar.setProgress(0);        btnPlay.setText("暂停");        currentMusic = position;    }    /**     * 生成指定范围的随机数[min,max)     *     * @param min     * @param max     * @return     */    private int randomGenerator(int min, int max) {        return new Random().nextInt(max) % (max - min + 1) + min;    }    @Override    protected void onDestroy() {        super.onDestroy();        if (mMusicMediaPlayer != null) {            mMusicMediaPlayer.stop();        }        if(mTimer != null){            mTimer.cancel();        }    }    /**     * 转化时长     * @param duration     * @return     */    private String getTime(int duration) {        int intMinute = (duration / 1000) / 60;        int intSecond = (duration / 1000) % 60;        String strMinute = (intMinute < 10 ? "0" + intMinute : "" + intMinute);        String strSecond = (intSecond < 10 ? "0" + intSecond : "" + intSecond);        return strMinute + ":" + strSecond;    }}

二、播放视频

原创粉丝点击