第一行代码-8.4 播放多媒体文件

1、播放音频
  播放音乐可以通过MediaPlayer实现,下面说明一下MediaPlayer的一些常用的类。

方法名 功能描述
setDataSource() 设置要播放的音频文件的位置
prepare() 在开始播放之前调用这个方法完成准备工作
start() 开始或继续播放音频
pause() 暂停播放音频
reset() 将MediaPlayer 对象重置到刚刚创建的状态
seekTo() 从指定的位置开始播放音频
stop() 停止播放音频。调用这个方法后的MediaPlayer 对象无法再播放音频
seekTo() 从指定的位置开始播放音频
release() 释放掉与MediaPlayer 对象相关的资源
isPlaying() 判断当前MediaPlayer 是否正在播放音频
getDuration() 获取载入的音频文件的时长

  所以用MediaPlayer播放音乐的流程是:先用setDataSource设置音乐的路径,然后调用prepare进入准备状态,再执行start开始播放音乐,之后调用pause可以暂停音乐,执行reset则可以停止播放。
  下面新建项目PlayAudioTest开始测试:


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">
    <Button android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:id="@+id/play"
        android:text="播放"
        android:onClick="play"/>
    <Button android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:id="@+id/pause"
        android:text="暂停"
        android:onClick="pause"/>
    <Button android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:id="@+id/stop"
        android:text="停止"
        android:onClick="stop"/>
LinearLayout>
// MainActivity.java
private Button mBPlay;
private Button mBPause;
private Button mBStop;

private MediaPlayer mediaPlayer = new MediaPlayer();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mBPlay = (Button) findViewById(R.id.play);
    mBPause = (Button) findViewById(R.id.pause);
    mBStop = (Button) findViewById(R.id.stop);
    initMediaPlayer();
}

private void initMediaPlayer() {
    try {
        File music = new File(Environment.getExternalStorageDirectory(), "Run Lads Run.mp3");
        mediaPlayer.setDataSource(music.getPath());
        mediaPlayer.prepare();
    }
    catch (Exception e) {e.printStackTrace();}
}

public void play(View view) {
    if (!mediaPlayer.isPlaying()) {
        mediaPlayer.start();
    }
}

public void pause(View view) {
    if (mediaPlayer.isPlaying()) {
        mediaPlayer.pause();
    }
}

public void stop(View view) {
    mediaPlayer.reset();
    initMediaPlayer(); // 注意!reset之后也要重新prepare才行
}

@Override
protected void onDestroy() {
    if (mediaPlayer != null) {
        mediaPlayer.stop();
        mediaPlayer.release();
    }
    super.onDestroy();
}

  说明几点需要注意的地方:首先是第三种设置按钮点击事件的方式,在xml里,函数名之后是不用括号的,还有执行了reset()函数之后也要重新设置mediaPlayer才可以重新播放。
  最后在手机上添加音乐就可以了:
第一行代码-8.4 播放多媒体文件_第1张图片
  扩展:播放进度条、结合service实现。这个在project回顾中会提到。

2、播放视频
  视频的播放则是用VideoView实现的,它的方法和MediaPlayer有点相似,如下:

方法名 功能描述
setVideoPath() 设置要播放的视频文件的位置
start() 开始或继续播放视频
pause() 暂停播放视频
resume() 将视频重头开始播放
seekTo() 从指定的位置开始播放视频
getDuration() 获取载入的视频文件的时长

  下面新建PlayVideoTest测试一下:


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent"
    android:orientation="vertical">
    <VideoView android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/videoview" />
    <LinearLayout android:layout_width="match_parent"
        android:layout_height="match_parent">
            <Button android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:id="@+id/play"
                android:text="播放"
                android:onClick="play"/>
            <Button android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:id="@+id/pause"
                android:text="暂停"
                android:onClick="pause"/>
            <Button android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:id="@+id/stop"
                android:text="停止"
                android:onClick="stop"/>
    LinearLayout>
LinearLayout>
// MainActivity.java
private VideoView videoView;
private Button mBPlay;
private Button mBPause;
private Button mBStop;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    videoView = (VideoView) findViewById(R.id.videoview);
    mBPlay = (Button) findViewById(R.id.play);
    mBStop = (Button) findViewById(R.id.stop);
    mBPause = (Button) findViewById(R.id.pause);
    mBPlay.setOnClickListener(this);
    mBPause.setOnClickListener(this);
    mBStop.setOnClickListener(this);
    initVideoView();
}

private void initVideoView() {
    File video = new File(Environment.getExternalStorageDirectory(), "animator.mp4");
    videoView.setVideoPath(video.getPath());
}

@Override
public void onClick(View view) {
    switch (view.getId()) {
    case R.id.play:
        if (!videoView.isPlaying()) videoView.start();
        break;
    case R.id.pause:
        if (videoView.isPlaying()) videoView.pause();
        break;
    case R.id.stop:
        videoView.resume();
        break;
    default:
        break;
    }
}

@Override
protected void onDestroy() {
    if (videoView != null) {
        videoView.suspend();
    }
    super.onDestroy();
}

  实现效果:
第一行代码-8.4 播放多媒体文件_第2张图片
  其实VideoView内部封装的也是MediaPlayer,所以两者的代码才很相似。另外VideoView其实不支持所有的视频,播放效率也不够高,但是应付一些游戏的片头动画,或者某个应用的视频宣传还是绰绰有余的。

你可能感兴趣的:(Android)