Android学习笔记(十五)-简易视频播放器

在Android中播放视频用到的也是MediaPlayer,展示视频通常使用SurfaceView控件。

在main.xml布局文件添加用于视频画面绘制的SurfaceView 控件:

<SurfaceView android:layout_width="fill_parent"android:layout_height="240dip"android:id="@+id/surfaceView"/>

MeidaPlayer播放视频相关API使用方法:

[java]  view plain copy
  1. SurfaceView surfaceView = (SurfaceView)this.findViewById(R.id.surfaceView);  
  2. surfaceView.getHolder().setFixedSize(176144);  //设置分辨率  
  3. /*下面设置Surface不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户面前*/  
  4. surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  
  5. MediaPlayer mediaPlayer = new MediaPlayer();  
  6. mediaPlayer.reset();//重置为初始状态  
  7. mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);  
  8. /* 设置Video影片以SurfaceHolder播放 */  
  9. mediaPlayer.setDisplay(surfaceView.getHolder());  
  10. mediaPlayer.setDataSource("/mnt/sdcard/oppo.mp4");  
  11. mediaPlayer.prepare();//缓冲   
  12. mediaPlayer.start();//播放  
  13. mediaPlayer.pause();//暂停播放  
  14. mediaPlayer.start();//恢复播放  
  15. mediaPlayer.stop();//停止播放  
  16. mediaPlayer.release();//释放资源  

下面介绍一个播放视频的简易例子,在模拟器上运行时最好用2.1, 2.1以后的模拟器播放视频时会有问题,视频播放同样需要处理一些来电类的情况,需要覆写Activity生命周期里的几个方法,需要注意的是,当Surface控件被其他Activity遮挡住是,会被销毁,所以需要为他写一个回调函数,否则当当前Activity被其他Activity打断后,又回到当前Activity是,视频播放界面会是黑屏。

Android学习笔记(十五)-简易视频播放器_第1张图片

详细代码:

布局文件layout/main.xml

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical"  
  4.     android:background="#ffffff"  
  5.     android:layout_width="fill_parent"  
  6.     android:layout_height="fill_parent"  
  7.     >  
  8. <TextView    
  9.     android:layout_width="fill_parent"   
  10.     android:layout_height="wrap_content"   
  11.     android:text="@string/filename"  
  12.     />  
  13.       
  14.     <EditText  
  15.         android:layout_width="fill_parent"   
  16.         android:layout_height="wrap_content"   
  17.         android:text="oppo.mp4"  
  18.         android:id="@+id/filename"  
  19.         />  
  20.           
  21.     <LinearLayout  
  22.         android:orientation="horizontal"  
  23.         android:layout_width="fill_parent"  
  24.         android:layout_height="wrap_content"  
  25.         >  
  26.         <ImageButton  
  27.             android:layout_width="wrap_content"   
  28.             android:layout_height="wrap_content"   
  29.             android:src="@drawable/play"  
  30.             android:id="@+id/play"  
  31.             />  
  32.          <ImageButton  
  33.             android:layout_width="wrap_content"   
  34.             android:layout_height="wrap_content"   
  35.             android:src="@drawable/pause"  
  36.             android:id="@+id/pause"  
  37.             />  
  38.         <ImageButton  
  39.             android:layout_width="wrap_content"   
  40.             android:layout_height="wrap_content"   
  41.             android:src="@drawable/reset"  
  42.             android:id="@+id/reset"  
  43.             />  
  44.          <ImageButton  
  45.             android:layout_width="wrap_content"   
  46.             android:layout_height="wrap_content"   
  47.             android:src="@drawable/stop"  
  48.             android:id="@+id/stop"  
  49.             />  
  50.     </LinearLayout>  
  51.       
  52.     <SurfaceView  
  53.         android:layout_width="fill_parent"   
  54.         android:layout_height="240dip"   
  55.         android:id="@+id/surfaceView"  
  56.         />  
  57. </LinearLayout>  

数据文件values/strings.xml

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.     <string name="hello">Hello World, PlayActivity!</string>  
  4.     <string name="app_name">视频播放器</string>  
  5.     <string name="filename">视频文件</string>  
  6.     <string name="sdcarderror">SDCard不存在</string>  
  7. </resources>  

Activity

[java]  view plain copy
  1. package com.android.media;  
  2.   
  3. import java.io.File;  
  4. import java.io.IOException;  
  5.   
  6. import android.app.Activity;  
  7. import android.media.AudioManager;  
  8. import android.media.MediaPlayer;  
  9. import android.os.Bundle;  
  10. import android.os.Environment;  
  11. import android.util.Log;  
  12. import android.view.SurfaceHolder;  
  13. import android.view.SurfaceView;  
  14. import android.view.View;  
  15. import android.widget.EditText;  
  16. import android.widget.ImageButton;  
  17. import android.widget.Toast;  
  18.   
  19. public class PlayerActivity extends Activity {  
  20.     private static final String TAG = "PlayerActivity";  
  21.     private EditText filenameText;  
  22.     private MediaPlayer mediaPlayer;  
  23.     private SurfaceView surfaceView;  
  24.     private String filename;  
  25.     private int position;  
  26.       
  27.     @Override  
  28.     public void onCreate(Bundle savedInstanceState) {  
  29.         super.onCreate(savedInstanceState);  
  30.         setContentView(R.layout.main);  
  31.           
  32.         filenameText = (EditText)this.findViewById(R.id.filename);  
  33.           
  34.         surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView);  
  35.         surfaceView.getHolder().setFixedSize(176144);//设置分辨率  
  36.         surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  
  37.         surfaceView.getHolder().addCallback(new SurfaceCallback());  
  38.   
  39.         mediaPlayer = new MediaPlayer();  
  40.         ButtonClickListener listener = new ButtonClickListener();  
  41.         ImageButton playButton = (ImageButton)this.findViewById(R.id.play);  
  42.         ImageButton pauseButton = (ImageButton)this.findViewById(R.id.pause);  
  43.         ImageButton resetButton = (ImageButton)this.findViewById(R.id.reset);  
  44.         ImageButton stopButton = (ImageButton) this.findViewById(R.id.stop);  
  45.         playButton.setOnClickListener(listener);  
  46.         pauseButton.setOnClickListener(listener);  
  47.         resetButton.setOnClickListener(listener);  
  48.         stopButton.setOnClickListener(listener);  
  49.     }  
  50.       
  51.     private final class SurfaceCallback implements SurfaceHolder.Callback{  
  52.         @Override  
  53.         public void surfaceCreated(SurfaceHolder holder) {  
  54.             if(position>0 && filename!=null){  
  55.                 try {  
  56.                     play();  
  57.                     mediaPlayer.seekTo(position);  
  58.                     position = 0;  
  59.                 } catch (IOException e) {  
  60.                     Log.e(TAG, e.toString());  
  61.                 }  
  62.             }  
  63.         }  
  64.         @Override  
  65.         public void surfaceChanged(SurfaceHolder holder, int format, int width,  
  66.                 int height) {  
  67.         }  
  68.         @Override  
  69.         public void surfaceDestroyed(SurfaceHolder holder) {  
  70.             if(mediaPlayer.isPlaying()){  
  71.                 position = mediaPlayer.getCurrentPosition();  
  72.                 mediaPlayer.stop();  
  73.             }  
  74.         }         
  75.     }  
  76.   
  77.     private final class ButtonClickListener implements View.OnClickListener{  
  78.         @Override  
  79.         public void onClick(View v) {  
  80.             if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){  
  81.                 Toast.makeText(PlayerActivity.this, R.string.sdcarderror, 1).show();  
  82.                 return;  
  83.             }  
  84.             filename = filenameText.getText().toString();  
  85.             try {  
  86.                 switch (v.getId()) {  
  87.                 case R.id.play:  
  88.                     play();                   
  89.                     break;  
  90.   
  91.                 case R.id.pause:  
  92.                     if(mediaPlayer.isPlaying()){  
  93.                         mediaPlayer.pause();  
  94.                     }else{  
  95.                         mediaPlayer.start();  
  96.                     }  
  97.                     break;  
  98.                 case R.id.reset:  
  99.                     if(mediaPlayer.isPlaying()){  
  100.                         mediaPlayer.seekTo(0);  
  101.                     }else{  
  102.                         play();  
  103.                     }  
  104.                     break;  
  105.                 case R.id.stop:  
  106.                     if(mediaPlayer.isPlaying()) mediaPlayer.stop();  
  107.                     break;  
  108.                 }  
  109.             } catch (Exception e) {  
  110.                 Log.e(TAG, e.toString());  
  111.             }  
  112.         }  
  113.     }  
  114.   
  115.     private void play() throws IOException {  
  116.         File videoFile = new File(Environment.getExternalStorageDirectory(), filename);  
  117.         mediaPlayer.reset();//重置为初始状态  
  118.         mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);  
  119.         /* 设置Video影片以SurfaceHolder播放 */  
  120.         mediaPlayer.setDisplay(surfaceView.getHolder());  
  121.         mediaPlayer.setDataSource(videoFile.getAbsolutePath());  
  122.         mediaPlayer.prepare();//缓冲                
  123.         mediaPlayer.start();//播放  
  124.     }  
  125. }  

你可能感兴趣的:(Android学习笔记(十五)-简易视频播放器)