Android -- 视频音频多媒体播放,在线播放, MediaPlayer, SurfaceView, SoundPool, Timer定时器使用

来源:互联网 发布:办公网络 编辑:程序博客网 时间:2024/04/29 11:17

1. SoundPool 用于快速重复的播放短音频

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public class MainActivity extends Activity {  
  2.     private SoundPool soundPool;  
  3.     private int soundId;  
  4.   
  5.     @Override  
  6.     protected void onCreate(Bundle savedInstanceState) {  
  7.         super.onCreate(savedInstanceState);  
  8.         setContentView(R.layout.activity_main);  
  9.         soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);  
  10.         // 把声音资源预先加载到声音池, load为异步方法  
  11.         //声音资源放到 res/raw目录下, raw名字须固定  
  12.         soundId = soundPool.load(this, R.raw.ring, 1);  
  13.     }  
  14.   
  15.     public void click(View view) {  
  16.         soundPool.play(soundId, 1.0f, 1.0f, 001.0f);  
  17.     }  
  18.   
  19. }  

 

2. 视频播放示例代码 (播放暂停,进度条拖放等功能)

输入的路径不仅可以是本地的视频路径,也可以是一个网络视频路径,播放器会自动在线播放,不过需要添加Internet权限

activity_main.xml 布局文件

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <LinearLayout 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:orientation="vertical"  
  6.     tools:context=".MainActivity" >  
  7.   
  8.     <EditText  
  9.         android:text="/sdcard/oppo.mp4"  
  10.         android:id="@+id/et_path"  
  11.         android:layout_width="match_parent"  
  12.         android:layout_height="wrap_content"  
  13.         android:hint="请输入视频文件的路径" />  
  14.   
  15.     <LinearLayout  
  16.         android:layout_width="match_parent"  
  17.         android:layout_height="wrap_content"  
  18.         android:orientation="horizontal" >  
  19.   
  20.         <Button  
  21.             android:id="@+id/bt_play"  
  22.             android:layout_width="0dip"  
  23.             android:layout_height="wrap_content"  
  24.             android:layout_weight="1"  
  25.             android:text="播放" />  
  26.   
  27.         <Button  
  28.             android:id="@+id/bt_pause"  
  29.             android:layout_width="0dip"  
  30.             android:layout_height="wrap_content"  
  31.             android:layout_weight="1"  
  32.             android:text="暂停" />  
  33.   
  34.         <Button  
  35.             android:id="@+id/bt_replay"  
  36.             android:layout_width="0dip"  
  37.             android:layout_height="wrap_content"  
  38.             android:layout_weight="1"  
  39.             android:text="重播" />  
  40.   
  41.         <Button  
  42.             android:id="@+id/bt_stop"  
  43.             android:layout_width="0dip"  
  44.             android:layout_height="wrap_content"  
  45.             android:layout_weight="1"  
  46.             android:text="停止" />  
  47.     </LinearLayout>  
  48.   
  49.     <SeekBar  
  50.         android:id="@+id/seek_bar"  
  51.         android:layout_width="match_parent"  
  52.         android:layout_height="wrap_content" />  
  53.   
  54.     <SurfaceView  
  55.         android:id="@+id/sv"  
  56.         android:layout_width="fill_parent"  
  57.         android:layout_height="fill_parent" />  
  58.   
  59. </LinearLayout>  

MainActivity.java

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. import java.io.File;  
  2. import java.io.IOException;  
  3. import java.util.Timer;  
  4. import java.util.TimerTask;  
  5.   
  6. import android.media.AudioManager;  
  7. import android.media.MediaPlayer;  
  8. import android.os.Bundle;  
  9. import android.app.Activity;  
  10. import android.view.Menu;  
  11. import android.view.SurfaceHolder;  
  12. import android.view.SurfaceHolder.Callback;  
  13. import android.view.SurfaceView;  
  14. import android.view.View;  
  15. import android.view.View.OnClickListener;  
  16. import android.widget.Button;  
  17. import android.widget.EditText;  
  18. import android.widget.SeekBar;  
  19. import android.widget.SeekBar.OnSeekBarChangeListener;  
  20. import android.widget.Toast;  
  21.   
  22. public class MainActivity extends Activity implements OnClickListener {  
  23.     private Button bt_play;  
  24.     private Button bt_replay;  
  25.     private Button bt_stop;  
  26.     private Button bt_pause;  
  27.     private EditText et_path;  
  28.     private SurfaceView sv;  
  29.   
  30.     private MediaPlayer mediaPlayer;  
  31.   
  32.     private int position;  
  33.   
  34.     private SeekBar seek_bar;  
  35.   
  36.     private Timer timer;  
  37.     private TimerTask task;  
  38.   
  39.     @Override  
  40.     protected void onCreate(Bundle savedInstanceState) {  
  41.         super.onCreate(savedInstanceState);  
  42.         setContentView(R.layout.activity_main);  
  43.         bt_play = (Button) findViewById(R.id.bt_play);  
  44.         bt_replay = (Button) findViewById(R.id.bt_replay);  
  45.         bt_stop = (Button) findViewById(R.id.bt_stop);  
  46.         bt_pause = (Button) findViewById(R.id.bt_pause);  
  47.         sv = (SurfaceView) findViewById(R.id.sv);  
  48.         seek_bar = (SeekBar) findViewById(R.id.seek_bar);  
  49.           
  50.         seek_bar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {  
  51.               
  52.             @Override  
  53.             public void onStopTrackingTouch(SeekBar seekBar) {  
  54.                 if(mediaPlayer!=null){  
  55.                     mediaPlayer.seekTo(seekBar.getProgress());  
  56.                 }  
  57.             }  
  58.               
  59.             @Override  
  60.             public void onStartTrackingTouch(SeekBar seekBar) {  
  61.                   
  62.             }  
  63.               
  64.             @Override  
  65.             public void onProgressChanged(SeekBar seekBar, int progress,  
  66.                     boolean fromUser) {  
  67.       
  68.                   
  69.             }  
  70.         });  
  71.           
  72.         /* 下面设置Surface不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户面前 */  
  73.         sv.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  
  74.   
  75.         sv.getHolder().addCallback(new Callback() {  
  76.   
  77.             @Override  
  78.             public void surfaceDestroyed(SurfaceHolder holder) {  
  79.                 System.out.println("holder 被销毁了.");  
  80.                 if (mediaPlayer != null && mediaPlayer.isPlaying()) {  
  81.                     position = mediaPlayer.getCurrentPosition();  
  82.                     stop();  
  83.                 }  
  84.             }  
  85.   
  86.             @Override  
  87.             public void surfaceCreated(SurfaceHolder holder) {  
  88.                 System.out.println("holder 被创建了.");  
  89.                 if (position != 0) {  
  90.                     play();  
  91.                     mediaPlayer.seekTo(position);  
  92.                 }  
  93.   
  94.             }  
  95.   
  96.             // 主要是当holder的大小发生变化的时候 调用  
  97.             @Override  
  98.             public void surfaceChanged(SurfaceHolder holder, int format,  
  99.                     int width, int height) {  
  100.   
  101.             }  
  102.         });  
  103.   
  104.         bt_play.setOnClickListener(this);  
  105.         bt_replay.setOnClickListener(this);  
  106.         bt_stop.setOnClickListener(this);  
  107.         bt_pause.setOnClickListener(this);  
  108.   
  109.         et_path = (EditText) findViewById(R.id.et_path);  
  110.     }  
  111.   
  112.     @Override  
  113.     public void onClick(View v) {  
  114.         switch (v.getId()) {  
  115.         case R.id.bt_play:  
  116.             play();  
  117.             break;  
  118.         case R.id.bt_replay:  
  119.             replay();  
  120.             break;  
  121.         case R.id.bt_stop:  
  122.             stop();  
  123.             break;  
  124.         case R.id.bt_pause:  
  125.             pause();  
  126.             break;  
  127.         }  
  128.   
  129.     }  
  130.   
  131.     /** 
  132.      * 重新播放 
  133.      */  
  134.     private void replay() {  
  135.         if (mediaPlayer != null && mediaPlayer.isPlaying()) {  
  136.             mediaPlayer.seekTo(0);  
  137.         } else {  
  138.             play();  
  139.         }  
  140.   
  141.     }  
  142.   
  143.     /** 
  144.      * 停止播放 
  145.      */  
  146.     private void stop() {  
  147.         if (mediaPlayer != null && mediaPlayer.isPlaying()) {  
  148.             mediaPlayer.stop();  
  149.             mediaPlayer.release();  
  150.   
  151.             mediaPlayer = null;  
  152.             bt_play.setEnabled(true);  
  153.             if (timer != null && task != null) {  
  154.                 timer.cancel();  
  155.                 task.cancel();  
  156.                 timer = null;  
  157.                 task = null;  
  158.             }  
  159.   
  160.         }  
  161.   
  162.     }  
  163.   
  164.     /** 
  165.      * 暂停播放 
  166.      */  
  167.     private void pause() {  
  168.   
  169.         if (mediaPlayer != null && mediaPlayer.isPlaying()) {  
  170.             // 暂停播放  
  171.             mediaPlayer.pause();  
  172.             bt_pause.setText("继续");  
  173.             return;  
  174.         }  
  175.   
  176.         if (mediaPlayer != null) {  
  177.             if ("继续".equals(bt_pause.getText().toString())) {  
  178.                 mediaPlayer.start();  
  179.                 bt_pause.setText("暂停");  
  180.                 return;  
  181.             }  
  182.         }  
  183.   
  184.     }  
  185.   
  186.     /** 
  187.      * 播放 
  188.      */  
  189.     private void play() {  
  190.         String path = et_path.getText().toString().trim();  
  191.         File file = new File(path);  
  192.         //添加判断条件,如果路径带http 网路视频在线播放  
  193.         if ( (file.exists() && file.length() > 0) || path.contains("http")) {  
  194.             try {  
  195.                 mediaPlayer = new MediaPlayer();  
  196.                 mediaPlayer.reset();// 重置为初始状态  
  197.                 mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);  
  198.                 /* 设置Video影片以SurfaceHolder播放 */  
  199.                 mediaPlayer.setDisplay(sv.getHolder());  
  200.                 mediaPlayer.setDataSource(path);  
  201.                 //prepare同步准备  
  202.                 //prepareAsync为异步准备,不会阻塞主线程,需要注册OnPrepareListener, 并在其中执行start()  
  203.                 mediaPlayer.prepare();  
  204.                 mediaPlayer.start();// 播放  
  205.                   
  206.                 int max = mediaPlayer.getDuration();  
  207.                 seek_bar.setMax(max);  
  208.                 // 创建一个定时器  
  209.                 timer = new Timer();  
  210.                 // 创建一个定时器执行的任务  
  211.                 task = new TimerTask() {  
  212.                     @Override  
  213.                     public void run() {  
  214.                         int position = mediaPlayer.getCurrentPosition();  
  215.                         seek_bar.setProgress(position);  
  216.                     }  
  217.                 };  
  218.                 timer.schedule(task, 01000);  
  219.             } catch (Exception e) {  
  220.                 e.printStackTrace();  
  221.                 Toast.makeText(this"播放失败"1).show();  
  222.             }  
  223.         }  
  224.   
  225.     }  
  226.   
  227. }  

 

3. 音频播放示例:类似于视频播放

MainActivity.java

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. import java.io.File;  
  2. import java.io.IOException;  
  3.   
  4. import android.app.Activity;  
  5. import android.media.AudioManager;  
  6. import android.media.MediaPlayer;  
  7. import android.media.MediaPlayer.OnCompletionListener;  
  8. import android.media.MediaPlayer.OnErrorListener;  
  9. import android.media.MediaPlayer.OnPreparedListener;  
  10. import android.os.Bundle;  
  11. import android.telephony.PhoneStateListener;  
  12. import android.telephony.TelephonyManager;  
  13. import android.view.View;  
  14. import android.view.View.OnClickListener;  
  15. import android.widget.Button;  
  16. import android.widget.EditText;  
  17. import android.widget.Toast;  
  18.   
  19. public class MainActivity extends Activity implements OnClickListener {  
  20.     private Button bt_play;  
  21.     private Button bt_replay;  
  22.     private Button bt_stop;  
  23.     private Button bt_pause;  
  24.     private EditText et_path;  
  25.   
  26.     private MediaPlayer mediaPlayer;  
  27.       
  28.       
  29.     private TelephonyManager tm;  
  30.   
  31.     @Override  
  32.     protected void onCreate(Bundle savedInstanceState) {  
  33.         super.onCreate(savedInstanceState);  
  34.         setContentView(R.layout.activity_main);  
  35.         bt_play = (Button) findViewById(R.id.bt_play);  
  36.         bt_replay = (Button) findViewById(R.id.bt_replay);  
  37.         bt_stop = (Button) findViewById(R.id.bt_stop);  
  38.         bt_pause = (Button) findViewById(R.id.bt_pause);  
  39.   
  40.         bt_play.setOnClickListener(this);  
  41.         bt_replay.setOnClickListener(this);  
  42.         bt_stop.setOnClickListener(this);  
  43.         bt_pause.setOnClickListener(this);  
  44.   
  45.         et_path = (EditText) findViewById(R.id.et_path);  
  46.           
  47.         tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);  
  48.         tm.listen(new MyListener(), PhoneStateListener.LISTEN_CALL_STATE);  
  49.   
  50.     }  
  51.   
  52.     private class MyListener extends PhoneStateListener{  
  53.   
  54.         @Override  
  55.         public void onCallStateChanged(int state, String incomingNumber) {  
  56.             switch (state) {  
  57.             case TelephonyManager.CALL_STATE_RINGING:  
  58.                 pause();  
  59.                 break;  
  60.   
  61.             case TelephonyManager.CALL_STATE_IDLE:  
  62.                 pause();  
  63.                 break;  
  64.             }  
  65.               
  66.               
  67.               
  68.             super.onCallStateChanged(state, incomingNumber);  
  69.         }  
  70.           
  71.     }  
  72.       
  73.       
  74.     @Override  
  75.     public void onClick(View v) {  
  76.   
  77.         switch (v.getId()) {  
  78.         case R.id.bt_play:  
  79.             play();  
  80.             break;  
  81.         case R.id.bt_replay:  
  82.             replay();  
  83.             break;  
  84.         case R.id.bt_stop:  
  85.             stop();  
  86.             break;  
  87.         case R.id.bt_pause:  
  88.             pause();  
  89.             break;  
  90.         }  
  91.   
  92.     }  
  93.   
  94.     /** 
  95.      * 重新播放 
  96.      */  
  97.     private void replay() {  
  98.         if (mediaPlayer != null && mediaPlayer.isPlaying()) {  
  99.             mediaPlayer.seekTo(0);  
  100.         }else{  
  101.             play();  
  102.         }  
  103.           
  104.     }  
  105.   
  106.     /** 
  107.      * 停止播放 
  108.      */  
  109.     private void stop() {  
  110.         if (mediaPlayer != null && mediaPlayer.isPlaying()) {  
  111.             mediaPlayer.stop();  
  112.             mediaPlayer.release();  
  113.               
  114.             mediaPlayer = null;  
  115.             bt_play.setEnabled(true);  
  116.         }  
  117.   
  118.     }  
  119.   
  120.     /** 
  121.      * 暂停播放 
  122.      */  
  123.     private void pause() {  
  124.   
  125.         if (mediaPlayer != null && mediaPlayer.isPlaying()) {  
  126.             // 暂停播放  
  127.             mediaPlayer.pause();  
  128.             bt_pause.setText("继续");  
  129.             return;  
  130.         }  
  131.   
  132.         if (mediaPlayer != null) {  
  133.             if ("继续".equals(bt_pause.getText().toString())) {  
  134.                 mediaPlayer.start();  
  135.                 bt_pause.setText("暂停");  
  136.                 return;  
  137.             }  
  138.         }  
  139.   
  140.     }  
  141.   
  142.     /** 
  143.      * 处理播放 
  144.      */  
  145.     private void play() {  
  146.         String path = et_path.getText().toString().trim();  
  147.         File file = new File(path);  
  148.         if (file.exists() && file.length() > 0) {  
  149.             try {  
  150.                 mediaPlayer = new MediaPlayer();  
  151.                 mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);  
  152.                 mediaPlayer.setDataSource(path);  
  153.                 //mediaPlayer.setLooping(looping);  
  154.               
  155.                 //播放完毕后的 事件监听器  
  156.                 mediaPlayer.setOnCompletionListener(new OnCompletionListener() {  
  157.                     @Override  
  158.                     public void onCompletion(MediaPlayer mp) {  
  159.                         bt_play.setEnabled(true);  
  160.                     }  
  161.                 });  
  162.                 mediaPlayer.setOnErrorListener(new OnErrorListener() {  
  163.                     @Override  
  164.                     public boolean onError(MediaPlayer mp, int what, int extra) {  
  165.                         bt_play.setEnabled(true);  
  166.                         Toast.makeText(MainActivity.this"音乐文件错误"0).show();  
  167.                         return false;  
  168.                     }  
  169.                 });  
  170.             //  mediaPlayer.prepare();//同步准备.  
  171.                 mediaPlayer.prepareAsync();//异步准备 在一个新的子线程里面准备  
  172.                 //通知用户缓存中...  
  173.                 mediaPlayer.setOnPreparedListener(new OnPreparedListener() {  
  174.                       
  175.                     @Override  
  176.                     public void onPrepared(MediaPlayer mp) {  
  177.                         //通知用户开始播放...  
  178.                         mediaPlayer.start();  
  179.                     }  
  180.                 });  
  181.                   
  182.                   
  183.                   
  184.                 bt_play.setEnabled(false);  
  185.                   
  186.             } catch (Exception e) {  
  187.                 e.printStackTrace();  
  188.                 Toast.makeText(this"播放音乐失败"0).show();  
  189.             }  
  190.         } else {  
  191.             Toast.makeText(this"音乐文件不存在"0).show();  
  192.         }  
  193.   
  194.     }  
  195.   
  196. }  
0 0
原创粉丝点击