`
bk_lin
  • 浏览: 322923 次
社区版块
存档分类
最新评论

Android提高第一篇之MediaPlayer

阅读更多

本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处! 

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

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

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

 

main.xml的源码:

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

 

 

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

  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, 010);  
  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(100100);  
  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. }  

 

 

分享到:
评论

相关推荐

    Android提高第一篇之MediaPlayer.doc

    Android提高第一篇之MediaPlayer

    Android提高第一篇之MediaPlayer.docx

    Android提高第一篇之MediaPlayer.docx

    android开发揭秘PDF

    第1章 Android开发简介 1.1 Android基本概念 1.1.1 Android简介 1.1.2 Android的系统构架 1.1.3 Android应用程序框架 1.2 OMS介绍 1.2.1 OPhone介绍 1.2.2 Widget介绍 1.3 小结 第2章 Android开发环境搭建 2.1 ...

    基于Android MediaPlayer+SurfaceView实现的播放器列子.zip

    Android是一种基于Linux内核(不包含GNU组件)的自由及开放源代码的移动操作系统,主要应用于移动设备,如智能手机和平板电脑。该系统最初由安迪·鲁宾开发,后被Google公司收购并注资,随后与多家硬件制造商、软件...

    进阶之光里的RxJava

    第1章介绍Android 5.0到Android 7.0的新特性。第2章介绍Material Design。第3章介绍View体系,包括View的事件分发、工作流程、自定义View等知识点。第4章介绍多线程的知识。第5章介绍网络编程与网络框架的知识。第6...

    《Android应用开发揭秘》附带光盘代码.

     第1章 Android开发简介  1.1 Android基本概念  1.1.1 Android简介  1.1.2 Android的系统构架  1.1.3 Android应用程序框架  1.2 OMS介绍  1.2.1 OPhone介绍  1.2.2 Widget介绍  1.3 小结  第2章 Android...

    Android应用开发揭秘pdf高清版

    第1章 Android开发简介 1.1 Android基本概念 1.1.1 Android简介 1.1.2 Android的系统构架 1.1.3 Android应用程序框架 1.2 OMS介绍 1.2.1 OPhone介绍 1.2.2 Widget介绍 1.3 小结 第2章 Android开发环境搭建 2.1 ...

    《Android应用开发揭秘》源码

     第1章 Android开发简介  1.1 Android基本概念  1.1.1 Android简介  1.1.2 Android的系统构架  1.1.3 Android应用程序框架  1.2 OMS介绍  1.2.1 OPhone介绍  1.2.2 Widget介绍  1.3 小结  第2章 Android...

    Android+PC语音对讲 Android IM

    主要功能: 连接服务器,并开启一个监听来信的线程,如果有来信,开启接收文件线程; 按钮控制发送语音线程;...第一步: 连接服务器 第二步:监听接收线程 接收文件线程类: 发送文件线程类:

    Android开发案例驱动教程 配套代码

    第1章 Android操作系统概述 1 1.1 Android历史介绍 1 1.2 Android架构 1 1.3 Android平台介绍 2 1.4 现有智能手机操作系统比较 4 第2章 Android开发环境搭建 5 2.1 Eclipse和ADT插件 5 2.1.1 Eclipse安装 5 ...

    疯狂Android讲义源码

     第1章 Android应用与开发环境 1  1.1 Android的发展和历史 2  1.1.1 Android的发展和简介 2  1.1.2 Android平台架构及特性 3  1.2 搭建Android开发环境 5  1.2.1 下载和安装Android SDK 5  1.2.2 安装...

    Android代码-VitamioDemo

    VitamioDemo Vitamio简介:Vitamio是一个支持所有Android...作者是采用的第一种方式,下面是一些需要注意的地方: 清单文件配置: 1)权限设置: 2)application配置: &lt;!-- 必须初始化 --&gt; 关于我 Email:

    Android开发与应用——张荣,原书配套课件

    第1章 Android简介 1.1 手机操作系统 1.2 Android起源 1.3 Android特征 1.4 Android体系结构 1.4.1 应用层 1.4.2 应用框架层 1.4.3 系统库层 1.4.4 内核层 1.5 小结 练习 第2章 Android开发...

    Android迷你播放器-第一阶段共6小结-源代码下载.tar.gz

    2、这是Android迷你播放器第一阶段共6次改进的源代码,具体解析可点击博客查看 3、代码内含注释 4、这几个小节分别为 1检索内存卡媒体音乐并添加到List播放列表--媒体库的检索以及list列表使用; 2退出时自动最小化...

    Google Android SDK开发范例大全(PDF高清完整版1)(4-1)

    2.2 建立第一个Android项目(HelloAndroid!) 2.3 Android应用程序架构——从此开始 2.4 可视化的界面开发工具 2.5 部署应用程序到Android手机 第3章 用户人机界面 3.1 更改与显示文字标签——TextView标签的使用 ...

    《Android应用开发揭秘》源码.rar

    国内第一本基于android 2.0的经典著作,5大专业社区联袂推荐,权威性毋庸置疑!  本书内容全面,不仅详细讲解了android框架、android组件、用户界面开发、游戏开发、数据存储、多媒体开发和网络开发等基础知识,...

Global site tag (gtag.js) - Google Analytics