使用Android(安卓)MediaPlayer播放媒体文件
我们平时利用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:
<?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:
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类封装在内部,是一个视频专用播放控件,有兴趣的小伙伴可以自己尝试一下。
如果博客中有什么不正确的地方,还请多多指点。
谢谢观看。。。
更多相关文章
- Android(安卓)实现简单音乐播放器(二)
- Android实现系统状态栏的隐藏和显示功能
- 慎用原生MediaPlayer类播放音频
- Broadcast监听网络状态,ping判断网络是否可用
- 纪念为“第九维”而死的脑细胞
- Android之Wifi学习(2)------连接Wifi
- Android(安卓)RecyclerView 监听滑动
- Android多用户之UserManagerService源码分析
- Android实现简单的音乐播放