Android提高第一篇之MediaPlayer - hellogv的专栏 - CSDN博客
来源:百度文库 编辑:神马文学网 时间:2024/04/27 14:10:22
Android提高第一篇之MediaPlayer收藏
此文于2010-11-02被推荐到CSDN首页
如何被推荐?
本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处!
前面写了十四篇关于界面的入门文章,大家都看完和跟着练习之后,对于常用的Layout和View都会有一定的了解了,接下来的文章就不再强调介绍界面了,而是针对具体的常见功能而展开。
本文介绍MediaPlayer的使用。MediaPlayer可以播放音频和视频,另外也可以通过VideoView来播放视频,虽然VideoView比MediaPlayer简单易用,但定制性不如用MediaPlayer,要视情况选择了。MediaPlayer播放音频比较简单,但是要播放视频就需要SurfaceView。SurfaceView比普通的自定义View更有绘图上的优势,它支持完全的OpenGL ES库。
先贴出本文程序运行结果的截图,上面是播放/停止音频,可用SeekBar来调进度,下面是播放/停止视频,也是用SeekBar来调进度:
main.xml的源码:
view plaincopy to clipboardprint?
- android:layout_width="fill_parent" android:layout_height="fill_parent"
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical">
- android:layout_width="fill_parent">
- android:layout_width="wrap_content" android:layout_height="wrap_content">
- android:layout_width="fill_parent">
- android:layout_width="fill_parent" android:layout_height="250px">
- android:layout_width="wrap_content" android:layout_height="wrap_content">
本文程序的源码,有点长:
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;
- }
- }
- }
发表于 @2010年10月30日 11:35:00 | 评论( 6) | 编辑| 举报| 收藏
旧一篇:Android入门第十四篇之画图
Android提高第一篇之MediaPlayer - hellogv的专栏 - CSDN博客
Android flinger - simmer_ken的专栏 - CSDN博客
Linux-Android系统启动之INIT进程和system v init - guopeixin的专栏 - CSDN博客
Linux-Android启动之Init进程前传 - guopeixin的专栏 - CSDN博客
Android的源代码结构 - 常青的专栏 - CSDN博客
Android PVPlayer介绍 - 常青的专栏 - CSDN博客
搭建Android环境 - shenbin1430的专栏 - CSDN博客
Android编译环境配置 - vrix的专栏 - CSDN博客
搭建Android环境 - shenbin1430的专栏 - CSDN博客
Android的MediaPlayer架构介绍
MPlayer往Android上的移植(1) - houdiney的专栏 - CSDN博客
Android:Google的阳谋和Apache Harmony - Kasmile的专栏 - CSDN博客
Android图形架构实现分析总结 - shenbin1430的专栏 - CSDN博客
android的mediaplayer架构介绍 补充
STL之vector的使用 - wxdvc的专栏 - CSDN博客
Android的PVPlayer介绍 CSDN博客
Win7搜索之体验! - y97523的专栏 - CSDN博客
baozhengw的专栏 - CSDN博客
Android的MediaPlayer架构介绍 - 狂徒的 - JavaEye技术网站
大学生学软件必看 - hellogv的专栏 - CSDNBlog
AGPS简介 - kv110的专栏 - CSDN博客
OpenMAX简介 - shenbin1430的专栏 - CSDN博客
windows 命令 - orangeman1982112的专栏 - CSDN博客
JNDI概述 - tanghongru1983的专栏 - CSDN博客