Android 多媒体MediaPlayer使用详解

 Android的MediaPlayer包含了Audio和Video的播放功能,在Android的界面上,Music和Video两个应用程序都是调用MediaPlaer来实现的。

  一、播放音频文件

         首先看看MediaPlaer的生命周期

下面是MediaPlayer提供的常用方法

 

方法说明
MediaPlayer构造方法
create创建一个要播放的多媒体
getCurrentPosition得到当前播放位置
getDuration得到文件的时间
getVideoHeight得到视频的高度
getVideoWidth得到视频的宽度
isLooping是否循环播放
isPlaying是否正在播放
pause暂停
prepare准备(同步)
prepareAsync准备(异步)
release释放MediaPlayer对象相关的资源
reset重置MediaPlayer对象为刚刚创建的状态
seekTo指定播放的位置(以毫秒为单位的时间)
setAudioStreamType设置流媒体的类型
setDataSource设置多媒体数据来源(位置)
setDisplay设置用SurfaceHolder来显示多媒体
setLooping设置是否循环播放
setOnButteringUpdateListener网络流媒体的缓冲监听
setOnErrorListener设置错误信息监听
setOnVideoSizeChangedListener视频尺寸监听
setScreenOnWhilePlaying设置是否使用SurfaceHolder来保持屏幕显示
setVolume设置音量
start开始播放
stop停止播放


MediaPlayer的工作流程是这样的:

 

1,首先创建MediaPlaer对象; *

2,然后调用setDataSource()方法来设置音频文件的路径;**

3,再调用prepare()方法使MediaPlayer进入到准备状态;

4,调用start方法就可以播放音频。

    *  创建MediaPlaer对象有两种方式  

     a 直接new出来

 

[java] view plain copy

 

 print?

  1. MediaPlayer mp = new MediaPlayer();  

    b 使用create方式

 

 

[java] view plain copy

 

 print?

  1. MediaPlayer mp = MediaPlayer.create(this, R.raw.test);//这时就不用调用setDataSource了  

当然上面首先得在res文件夹下新建raw文件夹,并放置一个test文件

 

    ** 设置播放的文件

      MediaPlayer要播放的文件主要包括3个来源:
a. 用户在应用中事先自带的resource资源
例如:MediaPlayer.create(this, R.raw.test);
b. 存储在SD卡或其他文件路径下的媒体文件
例如:mp.setDataSource("/sdcard/test.mp3");
c. 网络上的媒体文件
例如:mp.setDataSource("http://www.citynorth.cn/music/confucius.mp3");
MediaPlayer的setDataSource一共四个方法:
setDataSource (String path) 
setDataSource (FileDescriptor fd) 
setDataSource (Context context, Uri uri) 
setDataSource (FileDescriptor fd, long offset, long length)
 
其中使用FileDescriptor时,需要将文件放到与res文件夹平级的assets文件夹里,然后使用:
AssetFileDescriptor fileDescriptor = getAssets().openFd("rain.mp3");
m_mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(),fileDescriptor.getStartOffset(), fileDescriptor.getLength());
来设置datasource
先简单看下效果图吧


   上面的功能一看就知道了,就不用我说了吧

下面是实现代码

activity_main.xml

 

[html] view plain copy

 

 print?

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:layout_width="match_parent"  
  3.     android:layout_height="match_parent"  
  4.     android:layout_margin="3dp"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <LinearLayout  
  8.         android:layout_width="match_parent"  
  9.         android:layout_height="wrap_content"  
  10.         android:orientation="horizontal" >  
  11.   
  12.         <Button  
  13.             android:id="@+id/play"  
  14.             android:layout_width="0dp"  
  15.             android:layout_height="wrap_content"  
  16.             android:layout_weight="1"  
  17.             android:text="播放" />  
  18.   
  19.         <Button  
  20.             android:id="@+id/pause"  
  21.             android:layout_width="0dp"  
  22.             android:layout_height="wrap_content"  
  23.             android:layout_weight="1"  
  24.             android:text="暂停" />  
  25.   
  26.         <Button  
  27.             android:id="@+id/stop"  
  28.             android:layout_width="0dp"  
  29.             android:layout_height="wrap_content"  
  30.             android:layout_weight="1"  
  31.             android:text="停止" />  
  32.     </LinearLayout>  
  33.   
  34.     <SeekBar  
  35.         android:id="@+id/seekbar"  
  36.         android:layout_width="match_parent"  
  37.         android:layout_height="wrap_content"  
  38.         android:max="0"  
  39.         android:progress="0"  
  40.         android:secondaryProgress="0" />  
  41.   
  42.     <RelativeLayout  
  43.         android:layout_width="match_parent"  
  44.         android:layout_height="wrap_content" >  
  45.   
  46.         <TextView  
  47.             android:id="@+id/tv"  
  48.             android:layout_width="wrap_content"  
  49.             android:layout_height="wrap_content"  
  50.             android:layout_alignParentLeft="true"  
  51.             android:text="当前时间" />  
  52.   
  53.         <TextView  
  54.             android:id="@+id/tv2"  
  55.             android:layout_width="wrap_content"  
  56.             android:layout_height="wrap_content"  
  57.             android:layout_alignParentRight="true"  
  58.             android:text="总时间" />  
  59.     </RelativeLayout>  
  60.   
  61. </LinearLayout>  

MainActivity.java

 

 

[java] view plain copy

 

 print?

  1. package com.example.musicplayer;  
  2.   
  3. import java.io.File;  
  4. import java.io.IOException;  
  5.   
  6. import android.R.integer;  
  7. import android.app.Activity;  
  8. import android.media.MediaPlayer;  
  9. import android.os.Bundle;  
  10. import android.os.Environment;  
  11. import android.os.Handler;  
  12. import android.os.Message;  
  13. import android.util.Log;  
  14. import android.view.Menu;  
  15. import android.view.MenuItem;  
  16. import android.view.View;  
  17. import android.view.View.OnClickListener;  
  18. import android.widget.Button;  
  19. import android.widget.SeekBar;  
  20. import android.widget.SeekBar.OnSeekBarChangeListener;  
  21. import android.widget.TextView;  
  22.   
  23. public class MainActivity extends Activity implements OnClickListener,  
  24.         OnSeekBarChangeListener {  
  25.     private Button play, pause, stop;  
  26.     private MediaPlayer player;  
  27.     private SeekBar mSeekBar;  
  28.     private TextView tv, tv2;  
  29.     private boolean hadDestroy = false;  
  30.     private Handler mHandler = new Handler() {  
  31.         public void handleMessage(android.os.Message msg) {  
  32.   
  33.             switch (msg.what) {  
  34.             case 0x01:  
  35.   
  36.                 break;  
  37.   
  38.             default:  
  39.                 break;  
  40.             }  
  41.         };  
  42.     };  
  43.     Runnable runnable = new Runnable() {  
  44.   
  45.         @Override  
  46.         public void run() {  
  47.   
  48.             if (!hadDestroy) {  
  49.                 mHandler.postDelayed(this, 1000);  
  50.                 int currentTime = Math  
  51.                         .round(player.getCurrentPosition() / 1000);  
  52.                 String currentStr = String.format("%s%02d:%02d", "当前时间 ",  
  53.                         currentTime / 60, currentTime % 60);  
  54.                 tv.setText(currentStr);  
  55.                 mSeekBar.setProgress(player.getCurrentPosition());  
  56.             }  
  57.         }  
  58.     };  
  59.   
  60.     @Override  
  61.     protected void onCreate(Bundle savedInstanceState) {  
  62.         super.onCreate(savedInstanceState);  
  63.         setContentView(R.layout.activity_main);  
  64.         play = (Button) findViewById(R.id.play);  
  65.         pause = (Button) findViewById(R.id.pause);  
  66.         stop = (Button) findViewById(R.id.stop);  
  67.         mSeekBar = (SeekBar) findViewById(R.id.seekbar);  
  68.         tv = (TextView) findViewById(R.id.tv);  
  69.         tv2 = (TextView) findViewById(R.id.tv2);  
  70.         mSeekBar.setOnSeekBarChangeListener(this);  
  71.         play.setOnClickListener(this);  
  72.         pause.setOnClickListener(this);  
  73.         stop.setOnClickListener(this);  
  74.         player = new MediaPlayer();  
  75.         initMediaplayer();  
  76.   
  77.     }  
  78.   
  79.     /** 
  80.      * 初始化播放器 
  81.      */  
  82.     private void initMediaplayer() {  
  83.         try {  
  84.             File file = new File(Environment.getExternalStorageDirectory()  
  85.                     + "/Download/", "aiqiu.mp3");  
  86.             player.setDataSource(file.getPath());  
  87.             Log.e("播放器", file.toString());  
  88.             player.prepare();  
  89.         } catch (Exception e) {  
  90.             e.printStackTrace();  
  91.         }  
  92.     }  
  93.   
  94.     @Override  
  95.     public void onClick(View v) {  
  96.         switch (v.getId()) {  
  97.         case R.id.play:  
  98.             if (!player.isPlaying()) {  
  99.                 player.start();  
  100.                 int totalTime = Math.round(player.getDuration() / 1000);  
  101.                 String str = String.format("%02d:%02d", totalTime / 60,  
  102.                         totalTime % 60);  
  103.                 tv2.setText(str);  
  104.                 mSeekBar.setMax(player.getDuration());  
  105.                 mHandler.postDelayed(runnable, 1000);  
  106.             }  
  107.   
  108.             break;  
  109.         case R.id.pause:  
  110.             if (player.isPlaying()) {  
  111.                 player.pause();  
  112.             }  
  113.             break;  
  114.         case R.id.stop:  
  115.             if (player.isPlaying()) {  
  116.                 player.reset();  
  117.                 initMediaplayer();  
  118.             }  
  119.             break;  
  120.   
  121.         default:  
  122.             break;  
  123.         }  
  124.     }  
  125.   
  126.     @Override  
  127.     public void onProgressChanged(SeekBar seekBar, int progress,  
  128.             boolean fromUser) {  
  129.         if (player != null) {  
  130.             player.seekTo(seekBar.getProgress());  
  131.         }  
  132.   
  133.     }  
  134.   
  135.     @Override  
  136.     public void onStartTrackingTouch(SeekBar seekBar) {  
  137.         // TODO 自动生成的方法存根  
  138.   
  139.     }  
  140.   
  141.     @Override  
  142.     public void onStopTrackingTouch(SeekBar seekBar) {  
  143.         // TODO 自动生成的方法存根  
  144.     }  
  145.   
  146.     @Override  
  147.     protected void onDestroy() {  
  148.         // TODO 自动生成的方法存根  
  149.         super.onDestroy();  
  150.         if (player != null) {  
  151.             player.stop();  
  152.             hadDestroy = true;  
  153.             player.release();  
  154.         }  
  155.     }  
  156.   
  157. }  

二、播放视频文件
     播放视频文件相比播放音频文件并不比它复杂,这里使用VideoView类来实现。这个类将视频的显示和控制集于一身。

 

     VideoView和MediaPlaer也比较类似,主要有以下常用方法

   

方法名

功能描述

setVideoPath()

设置要播放的视频文件的位置。

start()

开始或继续播放视频。

pause()

暂停播放视频。

resume()

将视频重头开始播放。

seekTo()

从指定的位置开始播放视频。

isPlaying()

判断当前是否正在播放视频。

getDuration()

获取载入的视频文件的时长。

 

因为VideoView是包装过的MediaPlayer,所以使用起来很相似。

 

比如:

 

[java] view plain copy

 

 print?

  1. private void initVideoPlayer() {  
  2.         File file = new File(Environment.getExternalStorageDirectory()  
  3.                 + "/Download/", "Sample.3gp");  
  4.         videoPlayer.setVideoPath(file.getPath());// 指定视频文件的路径  
  5.   
  6.     }  

事件处理

 

 

[java] view plain copy

 

 print?

  1. @Override  
  2.     public void onClick(View v) {  
  3.         switch (v.getId()) {  
  4.         case R.id.play:  
  5.             if (!videoPlayer.isPlaying()) {  
  6.                 videoPlayer.start();  
  7.             }  
  8.             break;  
  9.         case R.id.pause:  
  10.             if (videoPlayer.isPlaying()) {  
  11.                 videoPlayer.pause();  
  12.             }  
  13.             break;  
  14.         case R.id.stop:  
  15.             if (videoPlayer.isPlaying()) {  
  16.                 videoPlayer.resume();  
  17.             }  
  18.             break;  
  19.   
  20.         default:  
  21.             break;  
  22.         }  
  23.     }  

 

三、常见的MediaPlayer错误

        也就是它的错误状态。比如这样的错误 start called in state 0,0表示他的错误状态,下面是MediaPlayer的状态,源码中找到的:

 

[java] view plain copy

 

 print?

  1. enum media_player_states {  
  2.        MEDIA_PLAYER_STATE_ERROR        = 0,           // 0状态  
  3.        MEDIA_PLAYER_IDLE                = 1 << 0,     // 1状态  
  4.        MEDIA_PLAYER_INITIALIZED        = 1 << 1,      // 2 状态  
  5.        MEDIA_PLAYER_PREPARING            = 1 << 2,    // 4 状态  
  6.        MEDIA_PLAYER_PREPARED            = 1 << 3,     // 8状态  
  7.        MEDIA_PLAYER_STARTED            = 1 << 4,      // 16状态  
  8.        MEDIA_PLAYER_PAUSED                = 1 << 5,   // 32状态  
  9.        MEDIA_PLAYER_STOPPED            = 1 << 6,      // 64 状态  
  10.        MEDIA_PLAYER_PLAYBACK_COMPLETE  = 1 << 7,      // 128 状态  
  11.    }  

    可以参照报错的状态和MediaPlayer的生命周期(上图)进行错误分析。

 

转载:https://www.cnblogs.com/senior-engineer/p/7867626.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值