首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >使用Android MediaPlayer播放媒体文件

使用Android MediaPlayer播放媒体文件

作者头像
指点
发布2019-01-18 17:20:35
发布2019-01-18 17:20:35
3.1K0
举报
文章被收录于专栏:指点的专栏指点的专栏

我们平时利用Android手机娱乐最常见的方式莫过于听歌和看电影了,当然还有玩游戏,当然,这里我要说的是针对Android对于媒体文件播放的支持。Android里面提供了MediaPlayer类来播放媒体文件,下面来看一下怎样用MediaPlayer对象来播放媒体文件: 一般来说,用MediaPlayer类来播放媒体文件有以下几个步骤:

1、新建一个MediaPlayer对象。 2、调用setDataSource方法设置MediaPlayer对象播放的媒体文件的路径 3、调用prepare() 方法准备媒体文件播放 4、调用start() 方法播放媒体文件

这里给出MediaPlayer类常用的方法:

setDatasource(String path) 用于设置要播放的媒体文件的位置path 是媒体文件的绝对路径。这个方法有多个重载版本,适应于不同的情况,既可以对使用文件路径作为参数,也可以使用描述文件位置的Uri作为参数

prepare() 在开始播放之前调用这个方法完成媒体文件的准备工作

start() 开始播放媒体文件文件

pause() 暂停播放

reset() 将MediaPlayer对象重置为刚刚被创建的状态

seekTo(int msec) 从指定的位置开始播放视频,参数单位:秒

stop() 停止播放音频,调用之后MediaPlayer对象必须重新准备,不然无法继续播放媒体文件

release() 释放MediaPlayer对象占用的资源

isPlaying() 判断MediaPlayer对象是否正在播放媒体文件

getDuration() 获得载入的媒体文件的时长

接下来仍然以一个小例子来看一下使用MediaPlayer对象播放媒体文件,新建一个Android工程: activity_main.xm:

代码语言:javascript
复制
<?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:gravity="center_horizontal"
    android:orientation="vertical" >

    <EditText 
        android:id="@+id/editTextPathInput"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="/sdcard/With Me.mp3" />
    <TableRow 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal" >
        <Button 
            android:id="@+id/buttonPlayMusic"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="开始"/>
        <Button 
            android:id="@+id/buttonPauseMusic"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="暂停"/>
        <Button 
            android:id="@+id/buttonStopMusic"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="停止"/>


    </TableRow>
    <SurfaceView 
            android:id="@+id/sufaceViewVideoPlay"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

</LinearLayout>

整体是一个竖向布局,最上面是一个EditText用于输入媒体文件的路径,接下来是三个按钮控制播放状态,最后是一个SurfaceView组件用于作为视频文件的输出控件,后面会介绍。接下来是MainAcitvity.java:

代码语言:javascript
复制
import java.io.File;
import java.io.IOException;

import android.app.Activity;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.media.MediaPlayer;
import android.opengl.Visibility;
import android.os.Bundle;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.SurfaceHolder.Callback;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {

    private EditText editText = null;
    private Button button = null;
    private MediaPlayer mediaPlayer = null;
    private String path = null;
    /*
     * 设定MediaPlayer对象的三种播放状态、正在播放 、暂停播放、
     * 停止播放 的对应常量
     */
    private static final int MEDIAPLAYER_IS_PLAYING = 1; 
    private static final int MEDIAPLAYER_IS_PAUSE = 2;
    private static final int MEDIAPLAYER_IS_STOP = 3;
    private static int MEDIAPLAYER_STATE = 
        MEDIAPLAYER_IS_STOP; // 开始的时候MediaPlayer对象处于停止状态

    @Override 
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.play_activity);

        mediaPlayer = new MediaPlayer();
        editText = (EditText) findViewById(R.id.editTextPathInput);
        button = (Button) findViewById(R.id.buttonPlayMusic);
        button.setOnClickListener(listener);
        button = (Button) findViewById(R.id.buttonPauseMusic);
        button.setOnClickListener(listener);
        button = (Button) findViewById(R.id.buttonStopMusic);
        button.setOnClickListener(listener);
        initMediaPlayer(); // 初始化MediaPayer对象
    }

    private View.OnClickListener listener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            switch(v.getId())
            {
            case R.id.buttonPlayMusic:
                if(MEDIAPLAYER_STATE == MEDIAPLAYER_IS_STOP) 
                {
                    /*
                     * 如果MediaPlayer对象处于停止状态那么初始化MediaPlayer对象
                     */
                    initMediaPlayer(); 
                }
                playMedia();
                break;
            case R.id.buttonPauseMusic:
                pauseMedia();
                break;
            case R.id.buttonStopMusic:
                stopMedia();
                break;
            }
        }
    };

    private void initMediaPlayer() // 初始化MediaPlayer对象
    {
        path = editText.getText().toString();
        if(path != null)
        {
            if(!(new File(path)).exists()) // 判断媒体文件是否存在
            {
                Toast.makeText(this, "指定媒体文件不存在!", Toast.LENGTH_SHORT).show();
                return ;
            }
            try {
                mediaPlayer.setDataSource(path); // 设置播放的文件位置
                mediaPlayer.prepare(); // 准备文件
                /*
                 * 这里是对文件后缀名进行判断,如果是 .mp4 文
                 * 件,那么就播放视频,因为MediaPlayer类的
                 * setDisplay方法接收的是一个SurfaceHolder
                 * 对象所以先要得到我们布局文件中的
                 * SurfaceView的SurfaceHolder对象,之后
                 * 设置长和宽,最后设置视频输出源
                 */
                if(path.substring(path.length() - 4, path.length()).equals(".mp4"))
                {
                    SurfaceHolder surfaceHolder = (((SurfaceView ) 
                            findViewById(R.id.sufaceViewVideoPlay)).getHolder());
                    surfaceHolder.setFixedSize(mediaPlayer.getVideoWidth(),
                            mediaPlayer.getVideoHeight());
                    mediaPlayer.setDisplay(surfaceHolder);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    private void playMedia() // 开始播放
    {
        mediaPlayer.start();
        MEDIAPLAYER_STATE = MEDIAPLAYER_IS_PLAYING;
        updateButtonState(MEDIAPLAYER_STATE);
    }

    private void pauseMedia() // 暂停播放
    {
        if(mediaPlayer.isPlaying())
        {
            mediaPlayer.pause();
            MEDIAPLAYER_STATE = MEDIAPLAYER_IS_PAUSE; // 更新播放状态
            updateButtonState(MEDIAPLAYER_STATE); // 更新按钮状态
        }

    }

    private void stopMedia() // 停止播放
    {
        mediaPlayer.reset();
        MEDIAPLAYER_STATE = MEDIAPLAYER_IS_STOP; // 更新播放状态
        updateButtonState(MEDIAPLAYER_IS_STOP); // 更新按钮状态

    }

    /*
     * 根据 mediaPlayer 的状态来更新按钮的状态,分别是播放、暂
     * 停、停止
     */
    private void updateButtonState(int mediaPlayerState)
    {
        Button button1 = null, button2 = null, button3 = null;
        button1 = (Button) findViewById(R.id.buttonPlayMusic);
        button2 = (Button) findViewById(R.id.buttonPauseMusic);
        button3 = (Button) findViewById(R.id.buttonStopMusic);
        if(mediaPlayerState == MEDIAPLAYER_IS_PLAYING) // 正在播放状态
        {
            button1.setEnabled(false);
            button2.setEnabled(true);
            button3.setEnabled(true);
        }
        else if(mediaPlayerState == MEDIAPLAYER_IS_PAUSE) // 暂停状态
        {
            button1.setEnabled(true);
            button2.setEnabled(false);
            button3.setEnabled(true);
        }
        else if(mediaPlayerState == MEDIAPLAYER_IS_STOP) // 停止状态
        {
            button1.setEnabled(true);
            button2.setEnabled(false);
            button3.setEnabled(false);
        }
    }

    @Override 
    public void onPause()
    {
        super.onPause();
        pauseMedia();
    }

    @Override 
    public void onResume()
    {
        super.onResume();
        if(MEDIAPLAYER_STATE == MEDIAPLAYER_IS_PAUSE)
        {
            mediaPlayer.start();
            MEDIAPLAYER_STATE = MEDIAPLAYER_IS_PLAYING; // 更新播放状态
            updateButtonState(MEDIAPLAYER_STATE); // 更新按钮状态
        }
    }

    @Override 
    public void onDestroy()
    {
        super.onDestroy();
        stopMedia();
        mediaPlayer.release();
    }
}

在MainActivity.java中主要是先进行MediaPlayer的初始化(设定媒体文件路径、准备媒体文件、判断是音频还是视频),之后就是控制播放状态和进行相关按钮状态UI的更新,逻辑并不复杂。最后我们来看一下运行结果:

因为模拟器中没有媒体文件,所以用的真机进行的测试,单击“开始”按钮:

单击“暂停”按钮:

单击“停止”按钮之后又变成了第一幅图。接下来在媒体文件路径输入控件EditText中输入一个视频的绝对路径:

成功的播放出来了视频!

最后,其实播放视频也可以使用VideoView控件,这个控件将MediaPlayer类封装在内部,是一个视频专用播放控件,有兴趣的小伙伴可以自己尝试一下。

如果博客中有什么不正确的地方,还请多多指点。 谢谢观看。。。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017年02月14日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档