热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android提高21篇之一:MediaPlayer

    本文介绍MediaPlayer的使用。MediaPlayer可以播放音频和视频,另外也可以通过VideoView来播放视频,虽然VideoView比MediaPlayer简

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

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

 Android提高21篇之一:MediaPlayer

       main.xml的源码:

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

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

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. }  

 

 

推荐阅读
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • importjava.util.ArrayList;publicclassPageIndex{privateintpageSize;每页要显示的行privateintpageNum ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
author-avatar
月光魔术师2702935955
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有