Android设计一个简单音频、视频播放器

时间: 2012-04-02 / 分类: 开发实例 / 浏览次数: 1,293 views / 2个评论 发表评论

 

          本文介绍MediaPlayer的使用。MediaPlayer可以播放音频和视频,另外也可以通过VideoView来播放视频,虽然VideoView比MediaPlayer简单易用,但定制性不如用MediaPlayer,要视情况选择了。MediaPlayer播放音频比较简单,但是要播放视频就需要SurfaceView。SurfaceView比普通的自定义View更有绘图上的优势,它支持完全的OpenGL ES库。

         先贴出本文程序运行结果的截图,上面是播放/停止音频,可用SeekBar来调进度,下面是播放/停止视频,也是用SeekBar来调进度:

0_1288409460hFp8.gif

main.xml的源码:

  1. <linearlayout android:id="@+id/LinearLayout01" 
  2.         android:layout_width="fill_parent" android:layout_height="fill_parent"
  3.         xmlns:android="http://schemas.android.com/apk/res/android"
  4.         android:orientation="vertical">
  5.         <seekbar android:id="@+id/SeekBar01" android:layout_height="wrap_content" 
  6.                 android:layout_width="fill_parent">
  7.         <linearlayout android:id="@+id/LinearLayout02" 
  8.                 android:layout_width="wrap_content" android:layout_height="wrap_content">
  9.                 <button android:id="@+id/Button01" android:layout_width="wrap_content" 
  10.                         android:layout_height="wrap_content" android:text="播放音频">
  11.                 <button android:id="@+id/Button02" android:layout_width="wrap_content" 
  12.                         android:layout_height="wrap_content" android:text="停止播放">
  13.         
  14.         <seekbar android:id="@+id/SeekBar02" android:layout_height="wrap_content" 
  15.                 android:layout_width="fill_parent">
  16.  
  17.         <surfaceview android:id="@+id/SurfaceView01" 
  18.                 android:layout_width="fill_parent" android:layout_height="250px">
  19.         <linearlayout android:id="@+id/LinearLayout02" 
  20.                 android:layout_width="wrap_content" android:layout_height="wrap_content">
  21.                 <button android:layout_width="wrap_content" 
  22.                         android:layout_height="wrap_content" android:id="@+id/Button03"
  23.                         android:text="播放视频">
  24.                 <button android:layout_width="wrap_content" 
  25.                         android:layout_height="wrap_content" android:text="停止播放" android:id="@+id/Button04">
  26.         

 

本文程序的源码,有点长:

testMedia.java

  1. package com.testMedia;
  2.  
  3. import java.io.IOException;  
  4. import java.util.Timer;
  5. import java.util.TimerTask;
  6. import android.app.Activity;  
  7. import android.media.AudioManager;
  8. import android.media.MediaPlayer;
  9. import android.os.Bundle;  
  10. import android.view.SurfaceHolder;
  11. import android.view.SurfaceView;
  12. import android.view.View;  
  13. import android.widget.Button;  
  14. import android.widget.SeekBar;
  15. import android.widget.Toast;  
  16.  
  17.  
  18. public class testMedia extends Activity {
  19.           /** Called when the activity is first created. */ 
  20.  
  21.         private SeekBar skb_audio=null;
  22.     private Button btn_start_audio = null;  
  23.     private Button btn_stop_audio = null;
  24.  
  25.     private SeekBar skb_video=null;
  26.     private Button btn_start_video = null;  
  27.     private Button btn_stop_video = null;
  28.     private SurfaceView surfaceView; 
  29.     private SurfaceHolder surfaceHolder; 
  30.     
  31.     private MediaPlayer m = null;  
  32.     private Timer mTimer;
  33.     private TimerTask mTimerTask;
  34.     
  35.     private boolean isChanging=false;//互斥变量,防止定时器与SeekBar拖动时进度冲突
  36.      @Override  
  37.     public void onCreate(Bundle savedInstanceState) {  
  38.         super.onCreate(savedInstanceState);  
  39.         setContentView(R.layout.main);  
  40.         
  41.         //———-Media控件设置———//
  42.         m=new MediaPlayer();
  43.         
  44.         //播放结束之后弹出提示
  45.         m.setOnCompletionListener(new MediaPlayer.OnCompletionListener(){
  46.                         @Override
  47.                         public void onCompletion(MediaPlayer arg0) {
  48.                                 Toast.makeText(testMedia.this, "结束", 1000).show();
  49.                                 m.release();
  50.                         }
  51.         });
  52.         
  53.       //———-定时器记录播放进度———//
  54.         mTimer = new Timer();
  55.         mTimerTask = new TimerTask() {
  56.             @Override
  57.             public void run() {        
  58.                     if(isChanging==true)
  59.                             return;
  60.                     
  61.                     if(m.getVideoHeight()==0)
  62.                             skb_audio.setProgress(m.getCurrentPosition());
  63.                     else 
  64.                             skb_video.setProgress(m.getCurrentPosition());
  65.             }
  66.         };
  67.  
  68.         mTimer.schedule(mTimerTask, 0, 10);
  69.                 
  70.         btn_start_audio = (Button) this.findViewById(R.id.Button01);  
  71.         btn_stop_audio = (Button) this.findViewById(R.id.Button02);  
  72.         btn_start_audio.setOnClickListener(new ClickEvent());
  73.         btn_stop_audio.setOnClickListener(new ClickEvent());
  74.         skb_audio=(SeekBar)this.findViewById(R.id.SeekBar01);
  75.         skb_audio.setOnSeekBarChangeListener(new SeekBarChangeEvent());
  76.         
  77.         btn_start_video = (Button) this.findViewById(R.id.Button03);  
  78.         btn_stop_video = (Button) this.findViewById(R.id.Button04);  
  79.         btn_start_video.setOnClickListener(new ClickEvent());
  80.         btn_stop_video.setOnClickListener(new ClickEvent());
  81.         skb_video=(SeekBar)this.findViewById(R.id.SeekBar02);
  82.         skb_video.setOnSeekBarChangeListener(new SeekBarChangeEvent());
  83.         surfaceView = (SurfaceView) findViewById(R.id.SurfaceView01);
  84.         surfaceHolder = surfaceView.getHolder();
  85.         surfaceHolder.setFixedSize(100, 100);
  86.         surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  87.     }  
  88.      
  89.   /*
  90.    * 按键事件处理
  91.    */
  92.   class ClickEvent implements View.OnClickListener{
  93.         @Override
  94.         public void onClick(View v) {
  95.                 if(v==btn_start_audio)
  96.                 {
  97.                         m.reset();//恢复到未初始化的状态
  98.                         m=MediaPlayer.create(testMedia.this, R.raw.big);//读取音频
  99.                         skb_audio.setMax(m.getDuration());//设置SeekBar的长度
  100.                         try {                                        
  101.                                 m.prepare();        //准备
  102.                         } catch (IllegalStateException e) {                        
  103.                                 // TODO Auto-generated catch block                                
  104.                                 e.printStackTrace();                                
  105.                         } catch (IOException e) {                        
  106.                                 // TODO Auto-generated catch block                                
  107.                                 e.printStackTrace();                                
  108.                         }                
  109.                         m.start();        //播放
  110.                 }
  111.                 else if(v==btn_stop_audio || v==btn_stop_video)
  112.                 {
  113.                         m.stop();
  114.                 }
  115.                 else if(v==btn_start_video)
  116.                 {
  117.                         m.reset();//恢复到未初始化的状态
  118.                         m=MediaPlayer.create(testMedia.this, R.raw.test);//读取视频
  119.                         skb_video.setMax(m.getDuration());//设置SeekBar的长度
  120.                         m.setAudioStreamType(AudioManager.STREAM_MUSIC);
  121.                         m.setDisplay(surfaceHolder);//设置屏幕
  122.                         
  123.                         try {
  124.                             m.prepare();
  125.                             
  126.                         } catch (IllegalArgumentException e) {
  127.                                 // TODO Auto-generated catch block
  128.                                 e.printStackTrace();
  129.                         } catch (IllegalStateException e) {
  130.                                 // TODO Auto-generated catch block
  131.                                 e.printStackTrace();
  132.                         } catch (IOException e) {
  133.                                 // TODO Auto-generated catch block
  134.                                 e.printStackTrace();
  135.                         }
  136.                         m.start();
  137.                 }
  138.         }
  139.   }
  140.   
  141.   /*
  142.    * SeekBar进度改变事件
  143.    */
  144.   class SeekBarChangeEvent implements SeekBar.OnSeekBarChangeListener{
  145.  
  146.         @Override
  147.         public void onProgressChanged(SeekBar seekBar, int progress,
  148.                         boolean fromUser) {
  149.                 // TODO Auto-generated method stub
  150.                 
  151.         }
  152.  
  153.         @Override
  154.         public void onStartTrackingTouch(SeekBar seekBar) {
  155.             isChanging=true;
  156.         }
  157.  
  158.         @Override
  159.         public void onStopTrackingTouch(SeekBar seekBar) {
  160.                 m.seekTo(seekBar.getProgress());
  161.             isChanging=false;        
  162.         }
  163.           
  164.   }
  165.  
  166. }

 

文章来源http://www.apkbus.com/android-23947-1-1.html



.

*******************************************************************

上面是广告! 真的是广告!! 真的真的啊!!!

-----------------------------------------------------Copyright © 2011-2012--浙ICP备12011997---------------------------- ---------------------- ------------------------

无觅相关文章插件,快速提升流量