Android中使用SurfaceView视频播放器

来源:互联网 发布:淘宝卖微信号违法吗 编辑:程序博客网 时间:2024/05/17 04:54
  1. public class PlayerVideoActivity extends Activity {  
  2.   
  3.     // SurfaceView控件  
  4.     private SurfaceView sv_video;  
  5.   
  6.     private SurfaceHolder surfaceHolder;  
  7.   
  8.     // 播放视频对象  
  9.     private MediaPlayer mediaPlayer;  
  10.   
  11.     private String path;  
  12.   
  13.     private boolean PasueFlag = false;  
  14.   
  15.     // 记录暂停播放的位置  
  16.     private int currentPosition = 0;  
  17.   
  18.     // 播放按钮的控件  
  19.     private LinearLayout video_layout;  
  20.       
  21.     //声明一个回放的记录位置  
  22.     private int backPosition = 0;  
  23.   
  24.     @Override  
  25.     protected void onCreate(Bundle savedInstanceState) {  
  26.         super.onCreate(savedInstanceState);  
  27.         setContentView(R.layout.activity_video);  
  28.         // 获取SurfaceView控件  
  29.         sv_video = (SurfaceView) findViewById(R.id.sv_video);  
  30.   
  31.         // 通过控件来获取SurfaceHolder  
  32.         surfaceHolder = sv_video.getHolder();  
  33.   
  34.         // 回调函数  
  35.         surfaceHolder.addCallback(new SurfaceHolder.Callback() {  
  36.   
  37.             // surfaceView控件被销毁的方法  
  38.             @Override  
  39.             public void surfaceDestroyed(SurfaceHolder holder) {  
  40.                 // 当点击后退按钮 就杀死 surfaceView控件 activity被杀死  
  41.                   
  42.                 //记录视频所播放的位置  
  43.                 int position = mediaPlayer.getCurrentPosition();  
  44.                 mediaPlayer.release();  
  45.                 mediaPlayer = null;  
  46.                   
  47.                 //声明意图对象  
  48.                 Intent data = new Intent();  
  49.                 data.putExtra("position",position);  
  50.                 PlayerVideoActivity.this.setResult(RESULT_OK, data);  
  51.                   
  52.                 //当前kill  
  53.                 PlayerVideoActivity.this.finish();  
  54.             }  
  55.   
  56.             // surfaceView创建的时候执行的方法  
  57.             @Override  
  58.             public void surfaceCreated(SurfaceHolder holder) {  
  59.                 // 当第一次使用SurfaceView的时候 播放视频  
  60.                 play();  
  61.             }  
  62.   
  63.             // surfaceView发生变化执行的操作  
  64.             @Override  
  65.             public void surfaceChanged(SurfaceHolder holder, int format,  
  66.                     int width, int height) {  
  67.   
  68.             }  
  69.         });  
  70.   
  71.         // 在这里怎么获取intent传递的数据  
  72.         path = this.getIntent().getStringExtra("path");  
  73.         backPosition = this.getIntent().getIntExtra("position"0);  
  74.   
  75.         // 获取LinearLayout的对象  
  76.         video_layout = (LinearLayout) findViewById(R.id.video_layout);  
  77.   
  78.         // 隐藏  
  79.         video_layout.setVisibility(View.GONE);  
  80.     }  
  81.   
  82.     public void playerVideo(View v) {  
  83.         play();// 播放视频  
  84.     }  
  85.   
  86.     // 视频播放的操作  
  87.     public void play() {  
  88.   
  89.         if (PasueFlag) {  
  90.             if (mediaPlayer != null) {  
  91.                 // 跳转到播放记录的位置  
  92.                 mediaPlayer.seekTo(currentPosition);  
  93.                 mediaPlayer.start();  
  94.             }  
  95.             // 变为false  
  96.             PasueFlag = false;  
  97.         } else {  
  98.             // 判断视频 是否为播放状态  
  99.             if (mediaPlayer != null) {  
  100.                 if (mediaPlayer.isPlaying()) {  
  101.                     System.out.println("视频处于播放状态");  
  102.                 }  
  103.             } else {  
  104.                 // 传递的路径 是否为空  
  105.                 if (path != null) {  
  106.                     try {  
  107.   
  108.                         // 创建视频播放的对象  
  109.                         mediaPlayer = new MediaPlayer();  
  110.   
  111.                         /** 
  112.                          * 视频播放完成出发的事件 
  113.                          */  
  114.                         mediaPlayer  
  115.                                 .setOnCompletionListener(new MediaPlayer.OnCompletionListener() {  
  116.   
  117.                                     @Override  
  118.                                     public void onCompletion(MediaPlayer mp) {  
  119.                                         mediaPlayer.release();  
  120.                                         mediaPlayer = null;  
  121.                                         System.out.println(mediaPlayer  
  122.                                                 + "------------onCompletion"  
  123.                                                 + mp);  
  124.   
  125.                                     }  
  126.                                 });  
  127.   
  128.                         /** 
  129.                          * 播放出差错的时候触发的事件 
  130.                          *  
  131.                          * 回调函数 
  132.                          */  
  133.                         mediaPlayer  
  134.                                 .setOnErrorListener(new MediaPlayer.OnErrorListener() {  
  135.   
  136.                                     @Override  
  137.                                     public boolean onError(MediaPlayer mp,  
  138.                                             int what, int extra) {  
  139.                                         mediaPlayer.release();  
  140.                                         mediaPlayer = null;  
  141.                                         return false;  
  142.                                     }  
  143.                                 });  
  144.   
  145.                         // 设计音频流类型  
  146.                         mediaPlayer  
  147.                                 .setAudioStreamType(AudioManager.STREAM_MUSIC);  
  148.   
  149.                         // 指定播放的文件  
  150.                         mediaPlayer.setDataSource(path);  
  151.                         // 指定用于播放视频的SurfaceView的控件  
  152.                         mediaPlayer.setDisplay(surfaceHolder);  
  153.                         mediaPlayer.prepare();  
  154.                           
  155.                         //记录上次播放的位置  
  156.                         mediaPlayer.seekTo(backPosition);  
  157.                         mediaPlayer.start();  
  158.   
  159.                         PasueFlag = false;  
  160.   
  161.                     } catch (IOException e) {  
  162.   
  163.                         e.printStackTrace();  
  164.                     }  
  165.                 }  
  166.             }  
  167.         }  
  168.   
  169.     }  
  170.   
  171.     public void pasueVideo(View v) {  
  172.         if (mediaPlayer != null && mediaPlayer.isPlaying()) {  
  173.             mediaPlayer.pause();  
  174.             // 记录这个位置  
  175.             currentPosition = mediaPlayer.getCurrentPosition();  
  176.             // 标识 这视频 会被暂停  
  177.             PasueFlag = true;  
  178.         }  
  179.   
  180.     }  
  181.   
  182.     public void stopVideo(View v) {  
  183.         if (mediaPlayer != null && mediaPlayer.isPlaying()) {  
  184.             mediaPlayer.stop();  
  185.             mediaPlayer.release();  
  186.             mediaPlayer = null;  
  187.             // 暂停标识  
  188.             PasueFlag = false;  
  189.         }  
  190.   
  191.     }  
  192.   
  193.     public void resetVideo(View v) {  
  194.         if (mediaPlayer != null && mediaPlayer.isPlaying()) {  
  195.             mediaPlayer.seekTo(0);  
  196.             mediaPlayer.start();  
  197.         }  
  198.   
  199.     }  
  200.   
  201.     // 触摸事件  
  202.     public boolean onTouchEvent(MotionEvent event) {  
  203.         // 获取布局对象是否是隐藏  
  204.         if (View.GONE == video_layout.getVisibility()) {  
  205.             video_layout.setVisibility(View.VISIBLE);// 显示  
  206.         } else {  
  207.             video_layout.setVisibility(View.GONE);// 隐藏  
  208.         }  
  209.         return super.onTouchEvent(event);  
  210.     }  
  211.       
  212.   
  213.   
  214.     @Override  
  215.     public boolean onCreateOptionsMenu(Menu menu) {  
  216.         // Inflate the menu; this adds items to the action bar if it is present.  
  217.         getMenuInflater().inflate(R.menu.player_video, menu);  
  218.         return true;  
  219.     }  
  220.   
  221.     /* 
  222.      * protected void onDestroy() { super.onDestroy(); // 释放资源 if (mediaPlayer 
  223.      * != null) { mediaPlayer.release(); mediaPlayer = null; } } 
  224.      */  
  225.   
  226. }  

[java] view plaincopy
  1. public class VideoActivity extends Activity {  
  2.   
  3.     private static final int VIDEOREQUESTPLAYER = 1;  
  4.     private int position = 0;  
  5.   
  6.     @Override  
  7.     protected void onCreate(Bundle savedInstanceState) {  
  8.         super.onCreate(savedInstanceState);  
  9.         setContentView(R.layout.activity_list);  
  10.     }  
  11.   
  12.     public void player(View v) {  
  13.         Intent intent = new Intent(VideoActivity.this,  
  14.                 PlayerVideoActivity.class);  
  15.         File sdCardFile = Environment.getExternalStorageDirectory();  
  16.         String path = sdCardFile.getPath() + "/Music/oppo.3gp";  
  17.         intent.putExtra("path", path);  
  18.         intent.putExtra("position", position);  
  19.         startActivityForResult(intent, VIDEOREQUESTPLAYER);  
  20.     }  
  21.   
  22.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  23.         super.onActivityResult(requestCode, resultCode, data);  
  24.   
  25.         System.out.println("-------------------onActivityResult");  
  26.         // 判断是否是这个请求  
  27.         if (VIDEOREQUESTPLAYER == requestCode) {  
  28.             // 判断这个请求的响应吗是否成功  
  29.             if (RESULT_OK == resultCode) {  
  30.                 position = data.getIntExtra("position"0);  
  31.                 System.out.println("==========================" + position);  
  32.             }  
  33.   
  34.         }  
  35.     }  
  36.   
  37. }  

[java] view plaincopy
  1. <SurfaceView  
  2.         android:id="@+id/sv_video"  
  3.         android:layout_width="match_parent"  
  4.         android:layout_height="match_parent"  
  5.         android:layout_alignParentLeft="true"  
  6.         android:layout_alignParentTop="true" />  
  7.   
  8.     <LinearLayout  
  9.         android:id="@+id/video_layout"  
  10.         android:layout_width="match_parent"  
  11.         android:layout_height="wrap_content"  
  12.         android:layout_alignParentBottom="true"  
  13.         android:layout_alignParentLeft="true"  
  14.         android:gravity="center_horizontal"  
  15.         android:orientation="horizontal"  
  16.         tools:ignore="UselessParent" >  
  17.   
  18.         <Button  
  19.             android:id="@+id/button1"  
  20.             android:layout_width="wrap_content"  
  21.             android:layout_height="wrap_content"  
  22.             android:onClick="playerVideo"  
  23.             android:text="@string/btn_play" />  
  24.   
  25.         <Button  
  26.             android:id="@+id/button2"  
  27.             android:layout_width="wrap_content"  
  28.             android:layout_height="wrap_content"  
  29.             android:onClick="pasueVideo"  
  30.             android:text="@string/btn_pasue" />  
  31.   
  32.         <Button  
  33.             android:id="@+id/button3"  
  34.             android:layout_width="wrap_content"  
  35.             android:layout_height="wrap_content"  
  36.             android:onClick="stopVideo"  
  37.             android:text="@string/btn_stop" />  
  38.   
  39.         <Button  
  40.             android:id="@+id/button4"  
  41.             android:layout_width="wrap_content"  
  42.             android:layout_height="wrap_content"  
  43.             android:onClick="resetVideo"  
  44.             android:text="@string/btn_reset" />  
  45.     </LinearLayout> 
0 0
原创粉丝点击