8.4 播放多媒体文件
8.4.1 播放音频
在Android中播放音频文件一般都是使用MediaPlayer类来实现的,它对多种格式的音频文件提供了非常全面的控制方法。
| 方法名 | 功能描述 |
| setDataSource() | 设置要播放的音频文件的位置 |
| prepare() | 在开始播放之前调用这个方法来完成准备工作 |
| start() | 开始或继续播放音频 |
| pause() | 暂停播放音频 |
| reset() | 将MediaPlayer对象重置到刚刚创建的状态,若在播放状态也会停止播放 |
| seekTo() | 从指定的位置开始播放音频 |
| stop() | 停止播放音频,调用这个方法后MediaPlayer对象无法再播放音频 |
| release() | 释放掉与MediaPlayer对象的相关资源 |
| isPlaying() | 判断当前MediaPlayer是否正在播放音频 |
| getDuration() | 获取载入的音频文件的时长 |
MediaPlayer的工作流程:1)首先需要创建一个MediaPlayer对象
2)调用MediaPlayer对象的setDataSource()方法来设置音频文件路径
3)再调用prepare()使MediaPlayer进入到准备状态
4)最后调用start()方法就可以开始播放音乐了
5)调用pause()方法就会暂停播放
6)调用reset()方法就会停止播放
- //新建一个PlayAudioTest项目
- //修改activity_main中的代码
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
- <Button
- android:id="@+id/play"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="Play" />
- <Button
- android:id="@+id/pause"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="Pause" />
- <Button
- android:id="@+id/stop"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="Stop" />
- LinearLayout>
- //上面布局文件中放置了三个按钮,分别是对音频文件进行播放,暂停和停止操作。
- //修改MainActivity中的代码
- public class MainActivity extends AppCompatActivity implements View.OnClickListener {
- private MediaPlayer mediaPlayer = new MediaPlayer();
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Button play = (Button) findViewById(R.id.play);
- Button pause = (Button) finfViewById(R.id.pause);
- Button stop = (Button) findViewById(R.id.stop);
- play.setOnClickListener(this);
- pause.setOnClickListener(this);
- stop.setOnClickListener(this);
- //由于音频要放在SD卡中,因此动态申请运行时权限处理
- if (ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE) != Packagemanager.PERMISSION_GRANTED) {
- ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.WRITE_EXTERNAL},1);
- } else {
- initMediaPlayer(); //初始化MediaPlayer
- }
- }
-
- private void initMediaPlayer() {
- try {
- File file = new File(Environment.getExternalStorageDirectory(),"music.mp3");
- mediaPlayer.setDataSource(file.getPath()); //指定音频文件的路径
- mediaPlayer.prepare(); //让MediaPlayer进入到准备状态
- } catch (Exception e) {
- e.printStackTrace()
- }
- }
-
- @Override
- public void onRequestPermissionsResult(int requestCode,String[] permissions,int[] grantResults) {
- switch (requestCode) {
- case 1:
- if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
- initMediaPlayer();
- } else {
- Toast.makeText(this,"拒绝权限将无法使用程序",Toast.LENGTH_SHORT).show();
- finish();
- }
- break;
- dafault:
- }
- }
-
- @Override
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.play:
- if (!mediaPlayer.isPlaying()) {
- mediaPlayer.start(); //开始播放
- }
- break;
- case R.id.pause:
- if (mediaPlayer.isPlaying()) {
- mediaPlayer.pause(); //暂停播放
- }
- break;
- case R.id.stop:
- if (mediaPlayer.isPlaying()) {
- mediaPlayer.reset(); //暂停播放
- }
- break;
- dafault:
- break;
- }
- }
-
- @Override
- protected void OnDestroy() {
- super.onDestory();
- if (mediaPlayer != null) {
- mediaPlayer.stop();
- mediaPlayer.release();
- }
- }
- }
- //还有一个重要的点是千万不要忘记要在AndroidManifest文件中声明用到的权限
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.example.playaudiotest">
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- ...
- manifest>
8.4.2 播放视频
播放视频文件其实并不比音频文件复杂,主要是使用VideoView类来实现的,这个类将视频的显示和控制集于一身,使得我们仅仅借助它就可以完成一个简易的视频播放器。他也有很多方法:
| 方法名 | 功能描述 |
| setVideoPath() | 设置要播放的视频文件的位置 |
| start() | 开始或继续播放视频 |
| pause() | 暂停播放视频 |
| resume() | 将视频重头开始播放 |
| seekTo() | 从指定的位置开始播放视频 |
| isPlaying() | 判断当前是否正在播放视频 |
| getDuration() | 获取载入的视频文件的时长 |
| suspend() | 用于将VideoView所占用的资源释放掉的 |
- //新建一个PlayVideoTest项目
- //修改activity_main中的代码
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
-
- <Button
- android:id="@+id/play"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="Play" />
- <Button
- android:id="@+id/pause"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="Pause" />
- <Button
- android:id="@+id/replay"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="Replay" />
- LinearLayout>
- <VideoView
- android:id="@id/video_view"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" />
- LinearLayout>
- //上面布局文件中放置了三个按钮,分别是控制视频文件进行播放,暂停和停止操作。按钮下面还有一个VideoView用来放视频的
- //修改MainActivity中的代码
- public class MainActivity extends AppCompatActivity implements View.OnClickListener {
- private MediaPlayer mediaPlayer = new MediaPlayer();
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Button play = (Button) findViewById(R.id.play);
- Button pause = (Button) finfViewById(R.id.pause);
- Button replay = (Button) findViewById(R.id.replay);
- play.setOnClickListener(this);
- pause.setOnClickListener(this);
- replay.setOnClickListener(this);
- //由于音频要放在SD卡中,因此动态申请运行时权限处理
- if (ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE) != Packagemanager.PERMISSION_GRANTED) {
- ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.WRITE_EXTERNAL},1);
- } else {
- initVideoPath(); //初始化VideoView
- }
- }
-
- private void initVideoPath() {
- File file = new File(Environment.getExternalStorageDirectory(),"movie.mp4");
- videoView.setVideoPath(file.getPath()); //指定视频文件的路径
- }
-
- @Override
- public void onRequestPermissionsResult(int requestCode,String[] permissions,int[] grantResults) {
- switch (requestCode) {
- case 1:
- if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
- initVideoPath();
- } else {
- Toast.makeText(this,"拒绝权限将无法使用程序",Toast.LENGTH_SHORT).show();
- finish();
- }
- break;
- dafault:
- }
- }
-
- @Override
- public void onClick(View v) {
- switch (v.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:
- if (VideoView.isPlaying()) {
- VideoView.reset(); //暂停播放
- }
- break;
- dafault:
- break;
- }
- }
-
- @Override
- protected void OnDestroy() {
- super.onDestory();
- if (VideoView != null) {
- VideoView.suspend(); //suspend()方法是用于将VideoView所占用的资源释放掉的
- }
- }
- }
- //还有一个重要的点是千万不要忘记要在AndroidManifest文件中声明用到的权限
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.example.playaudiotest">
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- ...
- manifest>