• Android 的 MediaPlayer 多媒体播放器


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

    片] 程序截图

    [代码] main.xml

    01 <?xml version="1.0" encoding="utf-8"?>
    02 <LinearLayout android:id="@+id/LinearLayout01"
    03 android:layout_width="fill_parent" android:layout_height="fill_parent"
    04 xmlns:android="http://schemas.android.com/apk/res/android"
    05 android:orientation="vertical">
    06 <SeekBar android:id="@+id/SeekBar01" android:layout_height="wrap_content"
    07 android:layout_width="fill_parent"></SeekBar>
    08 <LinearLayout android:id="@+id/LinearLayout02"
    09 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>

    [代码] TestMedia.java

    001 package com.testMedia;
    002
    003 import java.io.IOException;
    004 import java.util.Timer;
    005 import java.util.TimerTask;
    006 import android.app.Activity;
    007 import android.media.AudioManager;
    008 import android.media.MediaPlayer;
    009 import android.os.Bundle;
    010 import android.view.SurfaceHolder;
    011 import android.view.SurfaceView;
    012 import android.view.View;
    013 import android.widget.Button;
    014 import android.widget.SeekBar;
    015 import android.widget.Toast;
    016
    017
    018 public class TestMedia extends Activity {
    019 /** Called when the activity is first created. */
    020
    021 private SeekBar skb_audio=null;
    022 private Button btn_start_audio = null;
    023 private Button btn_stop_audio = null;
    024
    025 private SeekBar skb_video=null;
    026 private Button btn_start_video = null;
    027 private Button btn_stop_video = null;
    028 private SurfaceView surfaceView;
    029 private SurfaceHolder surfaceHolder;
    030
    031 private MediaPlayer m = null;
    032 private Timer mTimer;
    033 private TimerTask mTimerTask;
    034
    035 private boolean isChanging=false;//互斥变量,防止定时器与SeekBar拖动时进度冲突
    036 @Override
    037 public void onCreate(Bundle savedInstanceState) {
    038 super.onCreate(savedInstanceState);
    039 setContentView(R.layout.main);
    040
    041 //----------Media控件设置---------//
    042 m=new MediaPlayer();
    043
    044 //播放结束之后弹出提示
    045 m.setOnCompletionListener(new MediaPlayer.OnCompletionListener(){
    046 @Override
    047 public void onCompletion(MediaPlayer arg0) {
    048 Toast.makeText(testMedia.this, "结束", 1000).show();
    049 m.release();
    050 }
    051 });
    052
    053 //----------定时器记录播放进度---------//
    054 mTimer = new Timer();
    055 mTimerTask = new TimerTask() {
    056 @Override
    057 public void run() {
    058 if(isChanging==true)
    059 return;
    060
    061 if(m.getVideoHeight()==0)
    062 skb_audio.setProgress(m.getCurrentPosition());
    063 else
    064 skb_video.setProgress(m.getCurrentPosition());
    065 }
    066 };
    067
    068 mTimer.schedule(mTimerTask, 0, 10);
    069
    070 btn_start_audio = (Button) this.findViewById(R.id.Button01);
    071 btn_stop_audio = (Button) this.findViewById(R.id.Button02);
    072 btn_start_audio.setOnClickListener(new ClickEvent());
    073 btn_stop_audio.setOnClickListener(new ClickEvent());
    074 skb_audio=(SeekBar)this.findViewById(R.id.SeekBar01);
    075 skb_audio.setOnSeekBarChangeListener(new SeekBarChangeEvent());
    076
    077 btn_start_video = (Button) this.findViewById(R.id.Button03);
    078 btn_stop_video = (Button) this.findViewById(R.id.Button04);
    079 btn_start_video.setOnClickListener(new ClickEvent());
    080 btn_stop_video.setOnClickListener(new ClickEvent());
    081 skb_video=(SeekBar)this.findViewById(R.id.SeekBar02);
    082 skb_video.setOnSeekBarChangeListener(new SeekBarChangeEvent());
    083 surfaceView = (SurfaceView) findViewById(R.id.SurfaceView01);
    084 surfaceHolder = surfaceView.getHolder();
    085 surfaceHolder.setFixedSize(100, 100);
    086 surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    087 }
    088
    089 /**
    090 * 按键事件处理
    091 */
    092 class ClickEvent implements View.OnClickListener{
    093 @Override
    094 public void onClick(View v) {
    095 if(v==btn_start_audio)
    096 {
    097 m.reset();//恢复到未初始化的状态
    098 m=MediaPlayer.create(testMedia.this, R.raw.big);//读取音频
    099 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 }
  • 相关阅读:
    【Java基础】2、Java中普通代码块,构造代码块,静态代码块区别及代码示例
    【Java基础】1、java中的instanceof
    【Java面试】1、基础知识篇
    【github&&git】3、git图像化界面GUI的使用
    【github&&git】2、github入门到上传本地项目
    Spring Boot属性配置文件详解
    微服务Spring Cloud与Kubernetes比较
    导入时如何定制spring-boot依赖项的版本
    spring容器ApplicationContext初始化(spring应用上下文初始化)
    spring概念简介、bean扫描与注册实现方式
  • 原文地址:https://www.cnblogs.com/tuncaysanli/p/2469081.html
Copyright © 2020-2023  润新知