Android MediaPlayer本地视频播放器

该文章的目的是,让初学者能够快速掌握一个简单的本地视频播放器。该Demo中用到了SurfaceView、MediaPlayer。


实现效果图:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:paddingBottom="@dimen/activity_vertical_margin"  
  6.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  7.     android:paddingRight="@dimen/activity_horizontal_margin"  
  8.     android:paddingTop="@dimen/activity_vertical_margin"  
  9.     tools:context=".MainActivity" >  
  10.   
  11.     <TextView  
  12.         android:id="@+id/textView"  
  13.         android:layout_width="wrap_content"  
  14.         android:layout_height="wrap_content"  
  15.         android:layout_centerHorizontal="true"  
  16.         android:text="视频播放器SurfaceView实例" />  
  17.   
  18.     <SurfaceView  
  19.         android:id="@+id/sv"  
  20.         android:layout_width="match_parent"  
  21.         android:layout_height="320dp"  
  22.         android:layout_below="@id/textView" />  
  23.   
  24.     <SeekBar  
  25.         android:id="@+id/seekBar"  
  26.         android:layout_width="match_parent"  
  27.         android:layout_height="wrap_content"  
  28.         android:layout_below="@id/sv" />  
  29.   
  30.     <LinearLayout  
  31.         android:id="@+id/linearLayout"  
  32.         android:layout_width="match_parent"  
  33.         android:layout_height="wrap_content"  
  34.         android:layout_below="@id/seekBar"  
  35.         android:orientation="horizontal" >  
  36.   
  37.         <Button  
  38.             android:id="@+id/button_play"  
  39.             android:layout_width="0dp"  
  40.             android:layout_height="wrap_content"  
  41.             android:layout_weight="1"  
  42.             android:text="播放" />  
  43.   
  44.         <Button  
  45.             android:id="@+id/button_pause"  
  46.             android:layout_width="0dp"  
  47.             android:layout_height="wrap_content"  
  48.             android:layout_weight="1"  
  49.             android:text="暂停" />  
  50.   
  51.         <Button  
  52.             android:id="@+id/button_stop"  
  53.             android:layout_width="0dp"  
  54.             android:layout_height="wrap_content"  
  55.             android:layout_weight="1"  
  56.             android:text="停止" />  
  57.   
  58.         <Button  
  59.             android:id="@+id/button_replay"  
  60.             android:layout_width="0dp"  
  61.             android:layout_height="wrap_content"  
  62.             android:layout_weight="1"  
  63.             android:text="重播" />  
  64.     </LinearLayout>  
  65.   
  66. </RelativeLayout>  

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.surfaceviewdemo;  
  2.   
  3. import android.app.Activity;  
  4. import android.media.AudioManager;  
  5. import android.media.MediaPlayer;  
  6. import android.media.MediaPlayer.OnCompletionListener;  
  7. import android.media.MediaPlayer.OnErrorListener;  
  8. import android.media.MediaPlayer.OnPreparedListener;  
  9. import android.os.Bundle;  
  10. import android.view.SurfaceHolder;  
  11. import android.view.SurfaceHolder.Callback;  
  12. import android.view.SurfaceView;  
  13. import android.view.View;  
  14. import android.view.View.OnClickListener;  
  15. import android.widget.Button;  
  16. import android.widget.SeekBar;  
  17. import android.widget.SeekBar.OnSeekBarChangeListener;  
  18.   
  19. /** 
  20.  * 使用SurfaceView和MediaPlayer的本地视频播放器。 
  21.  *  
  22.  */  
  23. public class MainActivity extends Activity implements OnClickListener {  
  24.     private SurfaceView surfaceView;  
  25.     private Button button_play, button_pause, button_stop, button_replay;  
  26.     private MediaPlayer mediaPlayer;  
  27.     private SeekBar seekBar;  
  28.     private int currentPosition;  
  29.     private boolean isPlaying;  
  30.     @Override  
  31.     protected void onCreate(Bundle savedInstanceState) {  
  32.         super.onCreate(savedInstanceState);  
  33.         setContentView(R.layout.activity_main);  
  34.           
  35.         init();  
  36.   
  37.         initData();  
  38.     }  
  39.   
  40.     private void init() {  
  41.         button_play = (Button) findViewById(R.id.button_play);  
  42.         button_pause = (Button) findViewById(R.id.button_pause);  
  43.         button_stop = (Button) findViewById(R.id.button_stop);  
  44.         button_replay = (Button) findViewById(R.id.button_replay);  
  45.   
  46.         surfaceView = (SurfaceView) findViewById(R.id.sv);  
  47.         seekBar = (SeekBar) findViewById(R.id.seekBar);  
  48.         seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {  
  49.               
  50.             @Override  
  51.             public void onStopTrackingTouch(SeekBar seekBar) {  
  52.                 int process = seekBar.getProgress();  
  53.                 if (mediaPlayer!=null && mediaPlayer.isPlaying()) {  
  54.                     mediaPlayer.seekTo(process);  
  55.                 }  
  56.             }  
  57.               
  58.             @Override  
  59.             public void onStartTrackingTouch(SeekBar seekBar) {  
  60.                   
  61.             }  
  62.               
  63.             @Override  
  64.             public void onProgressChanged(SeekBar seekBar, int progress,  
  65.                     boolean fromUser) {  
  66.                   
  67.             }  
  68.         });  
  69.     }  
  70.       
  71.     private void initData() {  
  72.         mediaPlayer = new MediaPlayer();  
  73.         surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//4.0一下的版本需要加该段代码。  
  74.           
  75.         surfaceView.getHolder().addCallback(new Callback() {  
  76.   
  77.             @Override  
  78.             public void surfaceDestroyed(SurfaceHolder holder) {  
  79.                 /** 
  80.                  * 当点击手机上home键(或其他使SurfaceView视图消失的键)时,调用该方法,获取到当前视频的播放值,currentPosition。 
  81.                  * 并停止播放。 
  82.                  */  
  83.                 currentPosition = mediaPlayer.getCurrentPosition();  
  84.                 stop();  
  85.             }  
  86.   
  87.             @Override  
  88.             public void surfaceCreated(SurfaceHolder holder) {  
  89.                 /** 
  90.                  * 当重新回到该视频应当视图的时候,调用该方法,获取到currentPosition,并从该currentPosition开始继续播放。 
  91.                  */  
  92.                 if (currentPosition > 0) {  
  93.                     play(currentPosition);  
  94.                 }  
  95.             }  
  96.   
  97.             @Override  
  98.             public void surfaceChanged(SurfaceHolder holder, int format,  
  99.                     int width, int height) {  
  100.   
  101.             }  
  102.         });  
  103.           
  104.         button_play.setOnClickListener(this);  
  105.         button_pause.setOnClickListener(this);  
  106.         button_stop.setOnClickListener(this);  
  107.         button_replay.setOnClickListener(this);  
  108.     }  
  109.   
  110.   
  111.   
  112.     @Override  
  113.     public void onClick(View v) {  
  114.         switch (v.getId()) {  
  115.         case R.id.button_play:  
  116.             /** 
  117.              * 播放 
  118.              */  
  119.             play(0);  
  120.   
  121.             break;  
  122.   
  123.         case R.id.button_pause:  
  124.             /** 
  125.              * 暂停 
  126.              */  
  127.             pause();  
  128.   
  129.             break;  
  130.   
  131.         case R.id.button_stop:  
  132.             /** 
  133.              * 停止 
  134.              */  
  135.             stop();  
  136.             break;  
  137.   
  138.         case R.id.button_replay:  
  139.             /** 
  140.              * 重播 
  141.              */  
  142.             replay();  
  143.             break;  
  144.   
  145.         default:  
  146.             break;  
  147.         }  
  148.     }  
  149.   
  150.     private void replay() {  
  151.         if (mediaPlayer.isPlaying()) {  
  152.             mediaPlayer.seekTo(0);  
  153.         } else {  
  154.             play(0);  
  155.         }  
  156.     }  
  157.   
  158.     private void stop() {  
  159.         if (mediaPlayer.isPlaying()) {  
  160.             mediaPlayer.stop();  
  161.             mediaPlayer.seekTo(0);  
  162.         }  
  163.   
  164.     }  
  165.   
  166.     private void pause() {  
  167.         if (mediaPlayer.isPlaying()) {  
  168.             mediaPlayer.pause();  
  169.         } else {  
  170.             mediaPlayer.start();  
  171.         }  
  172.   
  173.     }  
  174.   
  175.     private void play(final int currentPosition) {  
  176.         String path = "/mnt/sdcard2/1.mp4";//指定视频所在路径。  
  177. //      String path = "http://daily3gp.com/vids/family_guy_penis_car.3gp";//指定视频所在路径。  
  178.         mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);//设置视频流类型  
  179.         try {  
  180.   
  181.             mediaPlayer.setDisplay(surfaceView.getHolder());  
  182.             mediaPlayer.setDataSource(path);  
  183.             mediaPlayer.prepareAsync();  
  184.               
  185.             mediaPlayer.setOnPreparedListener(new OnPreparedListener() {  
  186.   
  187.                 @Override  
  188.                 public void onPrepared(MediaPlayer mp) {  
  189.                     mediaPlayer.start();  
  190.                     int max = mediaPlayer.getDuration();  
  191.                     seekBar.setMax(max);  
  192.                     mediaPlayer.seekTo(currentPosition);  
  193.                       
  194.                     new Thread(){  
  195.                           
  196.                         public void run() {  
  197.                             isPlaying = true;  
  198.                             while (isPlaying) {  
  199.                                 int position = mediaPlayer.getCurrentPosition();  
  200.                                 seekBar.setProgress(position);  
  201.                                 try {  
  202.                                     Thread.sleep(500);  
  203.                                 } catch (InterruptedException e) {  
  204.                                     e.printStackTrace();  
  205.                                 }  
  206.                             }  
  207.                               
  208.                         };  
  209.                     }.start();  
  210.                 }  
  211.             });  
  212.               
  213.             mediaPlayer.setOnCompletionListener(new OnCompletionListener() {  
  214.   
  215.                 @Override  
  216.                 public void onCompletion(MediaPlayer mp) {  
  217.                     button_play.setEnabled(true);  
  218.                 }  
  219.             });  
  220.               
  221.             mediaPlayer.setOnErrorListener(new OnErrorListener() {  
  222.   
  223.                 @Override  
  224.                 public boolean onError(MediaPlayer mp, int what, int extra) {  
  225.                     button_play.setEnabled(true);  
  226.                     return false;  
  227.                 }  
  228.             });  
  229.         } catch (Exception e) {  
  230.             e.printStackTrace();  
  231.         }  
  232.     }  
  233.   
  234. }  

另外在线播放与本地播放的原理是一样的,在线播放测试的时候,只需在AndroidManifest.xml添加Internet的权限,在线播放的path,在文中已给出。另外,这只是相对简单的播放器,大家可在其基础上进行扩展,以达到大家的要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值