zoukankan      html  css  js  c++  java
  • Android 提高篇 6 之MediaPlayer

     前面写了十四篇关于界面的入门文章,大家都看完和跟着练习之后,对于常用的Layout和View都会有一定的了解了,接下来的文章就不再强调介绍界面了,而是针对具体的常见功能而展开。

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

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

    main.xml的源码:

    view plaincopy to clipboardprint?
    <?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout android:id="@+id/LinearLayout01" 
        android:layout_width="fill_parent" android:layout_height="fill_parent" 
        xmlns:android="http://schemas.android.com/apk/res/android
        android:orientation="vertical"> 
        <SeekBar android:id="@+id/SeekBar01" android:layout_height="wrap_content" 
            android:layout_width="fill_parent"></SeekBar> 
        <LinearLayout android:id="@+id/LinearLayout02" 
            android:layout_width="wrap_content" android:layout_height="wrap_content"> 
            <Button android:id="@+id/Button01" android:layout_width="wrap_content" 
                android:layout_height="wrap_content" android:text="播放音频"></Button> 
            <Button android:id="@+id/Button02" android:layout_width="wrap_content" 
                android:layout_height="wrap_content" android:text="停止播放"></Button> 
        </LinearLayout> 
        <SeekBar android:id="@+id/SeekBar02" android:layout_height="wrap_content" 
            android:layout_width="fill_parent"></SeekBar> 
     
        <SurfaceView android:id="@+id/SurfaceView01" 
            android:layout_width="fill_parent" android:layout_height="250px"></SurfaceView> 
        <LinearLayout android:id="@+id/LinearLayout02" 
            android:layout_width="wrap_content" android:layout_height="wrap_content"> 
            <Button android:layout_width="wrap_content" 
                android:layout_height="wrap_content" android:id="@+id/Button03" 
                android:text="播放视频"></Button> 
            <Button android:layout_width="wrap_content" 
                android:layout_height="wrap_content" android:text="停止播放mailto:"%20android:id="@+id/Button04"></button
        </LinearLayout> 
    </LinearLayout> 
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout android:id="@+id/LinearLayout01"
     android:layout_width="fill_parent" android:layout_height="fill_parent"
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:orientation="vertical">
     <SeekBar android:id="@+id/SeekBar01" android:layout_height="wrap_content"
      android:layout_width="fill_parent"></SeekBar>
     <LinearLayout android:id="@+id/LinearLayout02"
      android:layout_width="wrap_content" android:layout_height="wrap_content">
      <Button android:id="@+id/Button01" android:layout_width="wrap_content"
       android:layout_height="wrap_content" android:text="播放音频"></Button>
      <Button android:id="@+id/Button02" android:layout_width="wrap_content"
       android:layout_height="wrap_content" android:text="停止播放"></Button>
     </LinearLayout>
     <SeekBar android:id="@+id/SeekBar02" android:layout_height="wrap_content"
      android:layout_width="fill_parent"></SeekBar>

     <SurfaceView android:id="@+id/SurfaceView01"
      android:layout_width="fill_parent" android:layout_height="250px"></SurfaceView>
     <LinearLayout android:id="@+id/LinearLayout02"
      android:layout_width="wrap_content" android:layout_height="wrap_content">
      <Button android:layout_width="wrap_content"
       android:layout_height="wrap_content" android:id="@+id/Button03"
       android:text="播放视频"></Button>
      <Button android:layout_width="wrap_content"
       android:layout_height="wrap_content" android:text="停止播放mailto:"%20android:id="@+id/Button04"></button>
     </LinearLayout>
    </LinearLayout>
     

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

    view plaincopy to clipboardprint?
    package com.testMedia;  
     
    import java.io.IOException;    
    import java.util.Timer;  
    import java.util.TimerTask;  
    import android.app.Activity;    
    import android.media.AudioManager;  
    import android.media.MediaPlayer;  
    import android.os.Bundle;    
    import android.view.SurfaceHolder;  
    import android.view.SurfaceView;  
    import android.view.View;    
    import android.widget.Button;    
    import android.widget.SeekBar;  
    import android.widget.Toast;    
     
     
    public class testMedia extends Activity {  
          /** Called when the activity is first created. */   
     
        private SeekBar skb_audio=null;  
        private Button btn_start_audio = null;    
        private Button btn_stop_audio = null;  
     
        private SeekBar skb_video=null;  
        private Button btn_start_video = null;    
        private Button btn_stop_video = null;  
        private SurfaceView surfaceView;   
        private SurfaceHolder surfaceHolder;   
          
        private MediaPlayer m = null;    
        private Timer mTimer;  
        private TimerTask mTimerTask;  
          
        private boolean isChanging=false;//互斥变量,防止定时器与SeekBar拖动时进度冲突  
         @Override    
        public void onCreate(Bundle savedInstanceState) {    
            super.onCreate(savedInstanceState);    
            setContentView(R.layout.main);    
              
            //----------Media控件设置---------//  
            m=new MediaPlayer();  
              
            //播放结束之后弹出提示  
            m.setOnCompletionListener(new MediaPlayer.OnCompletionListener(){  
                @Override 
                public void onCompletion(MediaPlayer arg0) {  
                    Toast.makeText(testMedia.this, "结束", 1000).show();  
                    m.release();  
                }  
            });  
              
          //----------定时器记录播放进度---------//  
            mTimer = new Timer();  
            mTimerTask = new TimerTask() {  
                @Override 
                public void run() {   
                    if(isChanging==true)  
                        return;  
                      
                    if(m.getVideoHeight()==0)  
                        skb_audio.setProgress(m.getCurrentPosition());  
                    else   
                        skb_video.setProgress(m.getCurrentPosition());  
                }  
            };  
     
            mTimer.schedule(mTimerTask, 0, 10);  
              
            btn_start_audio = (Button) this.findViewById(R.id.Button01);    
            btn_stop_audio = (Button) this.findViewById(R.id.Button02);    
            btn_start_audio.setOnClickListener(new ClickEvent());  
            btn_stop_audio.setOnClickListener(new ClickEvent());  
            skb_audio=(SeekBar)this.findViewById(R.id.SeekBar01);  
            skb_audio.setOnSeekBarChangeListener(new SeekBarChangeEvent());  
              
            btn_start_video = (Button) this.findViewById(R.id.Button03);    
            btn_stop_video = (Button) this.findViewById(R.id.Button04);    
            btn_start_video.setOnClickListener(new ClickEvent());  
            btn_stop_video.setOnClickListener(new ClickEvent());  
            skb_video=(SeekBar)this.findViewById(R.id.SeekBar02);  
            skb_video.setOnSeekBarChangeListener(new SeekBarChangeEvent());  
            surfaceView = (SurfaceView) findViewById(R.id.SurfaceView01);  
            surfaceHolder = surfaceView.getHolder();  
            surfaceHolder.setFixedSize(100, 100);  
            surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  
        }    
           
      /* 
       * 按键事件处理 
       */ 
      class ClickEvent implements View.OnClickListener{  
        @Override 
        public void onClick(View v) {  
            if(v==btn_start_audio)  
            {  
                m.reset();//恢复到未初始化的状态  
                m=MediaPlayer.create(testMedia.this, R.raw.big);//读取音频  
                skb_audio.setMax(m.getDuration());//设置SeekBar的长度  
                try {                     
                    m.prepare();    //准备  
                } catch (IllegalStateException e) {           
                    // TODO Auto-generated catch block                
                    e.printStackTrace();                  
                } catch (IOException e) {             
                    // TODO Auto-generated catch block                
                    e.printStackTrace();                  
                }         
                m.start();  //播放  
            }  
            else if(v==btn_stop_audio || v==btn_stop_video)  
            {  
                m.stop();  
            }  
            else if(v==btn_start_video)  
            {  
                m.reset();//恢复到未初始化的状态  
                m=MediaPlayer.create(testMedia.this, R.raw.test);//读取视频  
                skb_video.setMax(m.getDuration());//设置SeekBar的长度  
                m.setAudioStreamType(AudioManager.STREAM_MUSIC);  
                m.setDisplay(surfaceHolder);//设置屏幕  
                  
                try {  
                    m.prepare();  
                      
                } catch (IllegalArgumentException e) {  
                    // TODO Auto-generated catch block  
                    e.printStackTrace();  
                } catch (IllegalStateException e) {  
                    // TODO Auto-generated catch block  
                    e.printStackTrace();  
                } catch (IOException e) {  
                    // TODO Auto-generated catch block  
                    e.printStackTrace();  
                }  
                m.start();  
            }  
        }  
      }  
        
      /* 
       * SeekBar进度改变事件 
       */ 
      class SeekBarChangeEvent implements SeekBar.OnSeekBarChangeListener{  
     
        @Override 
        public void onProgressChanged(SeekBar seekBar, int progress,  
                boolean fromUser) {  
            // TODO Auto-generated method stub  
              
        }  
     
        @Override 
        public void onStartTrackingTouch(SeekBar seekBar) {  
            isChanging=true;  
        }  
     
        @Override 
        public void onStopTrackingTouch(SeekBar seekBar) {  
            m.seekTo(seekBar.getProgress());  
            isChanging=false;     
        }  
            
      }  
     

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hellogv/archive/2010/10/30/5975864.aspx

  • 相关阅读:
    (转) Weblogic在Linux上节点服务器启动正常,计算机连接不上
    那些提升开发人员工作效率的在线工具
    (转) httpclient对cookie的处理
    (转) 修改weblogic部署的应用名称
    (转) oracle清空数据库脚本
    (转) weblogic 域,管理服务器,受管服务器,集群和机器的基本知识
    (转) Java中的负数及基本类型的转型详解
    (转)JAVA socket 进行十六进制报文交互测试
    liunx weblogic服务启停脚本
    转(HBuilder 打包流程)
  • 原文地址:https://www.cnblogs.com/csj007523/p/2052200.html
Copyright © 2011-2022 走看看