- 浏览: 663078 次
- 性别:
- 来自: 安徽
文章分类
- 全部博客 (252)
- Html/Div+CSS (12)
- Js/Jquery (34)
- Flex (2)
- Ajax (3)
- Java (35)
- C# (15)
- Spring (16)
- Hibernate (13)
- Struts2 (12)
- Struts1 (7)
- DWR (1)
- iBatis/myBatis (9)
- Tag(JSTL、EL) (1)
- Android (44)
- SQL (7)
- SEO (7)
- Exception (3)
- Tool (10)
- Other (3)
- WebService (9)
- Apache (7)
- Ext (0)
- Utils (12)
- thinking in programme (2)
- Hadoop (0)
- ActiveMQ (0)
- HTML5/CSS3 (0)
- WPF (1)
- NodeJs (1)
- 设计模式 (0)
- 程序人生 (1)
- 随笔 (1)
- Linux (1)
- Load Balance (0)
最新评论
-
drinkjava2:
太复杂了而且不通用,利用ThreadLocal可完美解决这一问 ...
JDBC的多条件动态查询 -
u013107014:
multipartRequest.getFiles(" ...
多文件上传 by MultipartFile and Multiple -
liyys:
可惜没讲你mysql数据库的表的设计
iBatis入门 -
Mapple_leave:
效果还是挺不错的,谢谢了。
中文简体与繁体的转换 -
arcpad:
JS禁用浏览器退格键
在 Android 中,我们可以通过 android.media.MediaPlayer 类完成音频或视频文件的播放操作。需要注意的是视频和音频有许多格式,但是 MediaPlayer 类只能完成一些基本格式的操作,如果 MP3 、 3GP 等,而其他媒体格式则需要编写相应的解码器进行解码播放。
生命周期解释:
1、 Idle 状态 :当使用关键字 new 实例化一个 MediaPlayer 对象或者是调用了类中的 reset() 方法时会进入到此状态
2、 End 状态 :当调用 release() 方法之后将进入到此状态,此时会释放所有占用的硬件和软件的资源,并且不会再进入其他任何一种状态。
3、 Initialized 状态 :当 MediaPlayer 对象设置好要播放的媒体 (setDataSource()) 之后进入到此状态。
4、 Prepared 状态 :预播放状态 (prepare() 、 prepareAsync()) ,进入到此状态则表示目前的媒体文件没有任何问题,可以使用 OnPreparedListener 监听。
·如果用户调用的是 prepare() 方法(同步),则表示该 MediaPlayer 对象已经进入 Prepared 状态;
·如果用户调用的是 prepareAsync() 方法(异步),则表示该 MediaPlayer 对象进入 Preparing 状态并返回,而内部播放引擎会继续执行为完成的准备工作。
5、 Started 状态 :正在进行媒体播放 (start()) ,此时可以使用 seekTo() 方法指定媒体播放的位置。
6、 Paused 状态 :在 Started 状态下使用 Paused 状态可以暂停 MediaPlayer 的播放,暂停之后可以通过 Start() 方法将其变回到 Started 状态,继续播放。
7、 Stopped 状态 :在 Started 和 Paused 状态下都可以通过 stop() 方法停止 MediaPlayer 的播放,在 Stopped 状态下要想重新进行播放,则可以使用 prepare() 和 prepareAsync() 方法进入到就绪状态。
8、 PlaybackCompleted 状态 :当媒体文件播放完毕之后会进入此状态,用户可以使用 OnCompletionListener 监听此状态,此时可以使用 start() 方法重新播放,也可以使用 stop() 方法停止播放,或者使用 seekTo() 方法来重新定义播放位置。
9、 Error 状态: 当用户播放操作中出现某些错误(文件格式不正确、播放文件过大等)时则进入此状态,用户可以使用 OnErrorListener 来监听此状态,如果 MediaPlayer 进入此状态,可以用 reset() 方法重新变回 Idle 状态。
MP3 播放器:
MediaPlayer01_Mp3PlayerActivity.java
package com.iflytek.demo; import android.app.Activity; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageButton; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.TextView; public class MediaPlayer01_Mp3PlayerActivity extends Activity { private ImageButton play = null; private ImageButton pause = null; private ImageButton stop = null; private TextView info = null; private MediaPlayer mediaPlayer = null; private SeekBar seekbar = null; private boolean playFlag = true; // 播放标记 private boolean pauseFlag = true; // 暂停标记 /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); this.info = (TextView) super.findViewById(R.id.info); this.play = (ImageButton) super.findViewById(R.id.play); this.pause = (ImageButton) super.findViewById(R.id.pause); this.stop = (ImageButton) super.findViewById(R.id.stop); this.seekbar = (SeekBar) super.findViewById(R.id.seekbar); this.play.setOnClickListener(new PlayOnClickListener()); this.pause.setOnClickListener(new PauseOnClickListener()); this.stop.setOnClickListener(new StopOnClickListener()); this.seekbar .setOnSeekBarChangeListener(new OnSeekBarChangeListenerImpl()); } private class UpdateSeekBar extends AsyncTask<Integer, Integer, String> { @Override protected void onPostExecute(String result) {//任务执行完后执行 super.onPostExecute(result); } @Override protected void onProgressUpdate(Integer... values) {//每次更新后的数值 MediaPlayer01_Mp3PlayerActivity.this.seekbar.setProgress(values[0]);//更新拖动条 } @Override protected String doInBackground(Integer... params) {//处理后台任务 while (MediaPlayer01_Mp3PlayerActivity.this.playFlag) { // 播放的话,进度要累加 try { Thread.sleep(params[0]);//延缓执行 } catch (InterruptedException e) { } this.publishProgress(MediaPlayer01_Mp3PlayerActivity.this.mediaPlayer .getCurrentPosition());//修改拖动条 } return null;//返回执行结果 } } private class PlayOnClickListener implements OnClickListener { @Override public void onClick(View v) { MediaPlayer01_Mp3PlayerActivity.this.mediaPlayer = MediaPlayer .create(MediaPlayer01_Mp3PlayerActivity.this, R.raw.hight); // 要播放的文件 if (MediaPlayer01_Mp3PlayerActivity.this.mediaPlayer != null) { MediaPlayer01_Mp3PlayerActivity.this.mediaPlayer.stop(); // 停止操作 } MediaPlayer01_Mp3PlayerActivity.this.seekbar .setMax(MediaPlayer01_Mp3PlayerActivity.this.mediaPlayer .getDuration()); // 设置拖拽条的长度 UpdateSeekBar update = new UpdateSeekBar(); update.execute(500); MediaPlayer01_Mp3PlayerActivity.this.mediaPlayer .setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { MediaPlayer01_Mp3PlayerActivity.this.playFlag = false; // 播放完毕 MediaPlayer01_Mp3PlayerActivity.this.mediaPlayer .release(); // 释放资源 } }); try { MediaPlayer01_Mp3PlayerActivity.this.mediaPlayer.prepare(); MediaPlayer01_Mp3PlayerActivity.this.mediaPlayer.start(); MediaPlayer01_Mp3PlayerActivity.this.info .setText("正在播放音频文件..."); } catch (Exception e) { MediaPlayer01_Mp3PlayerActivity.this.info.setText("文件播放出现异常," + e); } } } private class PauseOnClickListener implements OnClickListener { @Override public void onClick(View v) { if (MediaPlayer01_Mp3PlayerActivity.this.mediaPlayer != null) { if (MediaPlayer01_Mp3PlayerActivity.this.pauseFlag) { // 现在暂停 MediaPlayer01_Mp3PlayerActivity.this.mediaPlayer.start(); MediaPlayer01_Mp3PlayerActivity.this.pauseFlag = false; } else { MediaPlayer01_Mp3PlayerActivity.this.mediaPlayer.pause(); // 暂停 MediaPlayer01_Mp3PlayerActivity.this.pauseFlag = true; MediaPlayer01_Mp3PlayerActivity.this.info .setText("暂停音频文件..."); } } } } private class StopOnClickListener implements OnClickListener { @Override public void onClick(View v) { if (MediaPlayer01_Mp3PlayerActivity.this.mediaPlayer != null) { MediaPlayer01_Mp3PlayerActivity.this.mediaPlayer.stop(); // 停止 MediaPlayer01_Mp3PlayerActivity.this.info .setText("停止播放音频文件..."); } } } private class OnSeekBarChangeListenerImpl implements OnSeekBarChangeListener { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) {//进度条停止拖拽 MediaPlayer01_Mp3PlayerActivity.this.mediaPlayer.seekTo(seekBar .getProgress());//定义播放位置 } } }
main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/info" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="等待音频文件播放" /> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <ImageButton android:id="@+id/play" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/play" /> <ImageButton android:id="@+id/pause" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/pause" /> <ImageButton android:id="@+id/stop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/stop" /> </LinearLayout> <SeekBar android:id="@+id/seekbar" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout>
MediaPlayer 除了可以播放音频之外,还可以播放视频,但是如果要视频,只依靠 MediaPlayer 是不够的,还需要编写一个可以用于视频显示的控件,而这块显示空间要求可以快速进行 GUI 的更新,而且可以在渲染代码时对 GUI 进行无阻塞的渲染,如果要完成此功能,则必须依靠 android.view.SurfaceView 组件, SurfaceView 组件封装了一个 Surface 对象,而不是一个 Canvas 对象,使用 Surface 可以完成对后台线程的控制,对于视频、 3D 是图形等需要快速更新或者高帧率的对象有很大的用处。
视频播放 Demo
main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content"> <ImageButton android:id="@+id/play" android:src="@drawable/play" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <ImageButton android:id="@+id/stop" android:src="@drawable/stop" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> <SurfaceView android:id="@+id/surfaceView" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout>
对于 SurfaceView 现在只是一个基本的使用,而关于它的更多应用,会在后面说拍照等功能实现的时候再深入。
如果要想操作 SurfaceView ,那么就必须对其做一些基本的设置,设置其操作类型,如果要想设置 SurfaceView 的一些参数,那么就必须依靠 SurfaceHolder 类完成。
MediaPlayer02_VideoPlayerActivity.java
package com.iflytek.demo; 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.view.View.OnClickListener; import android.widget.ImageButton; public class MediaPlayer02_VideoPlayerActivity extends Activity { private ImageButton play = null; private ImageButton stop = null; private MediaPlayer mediaPlayer = null; private SurfaceView surfaceView = null; private SurfaceHolder surfaceHolder = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); this.play = (ImageButton) super.findViewById(R.id.play); this.stop = (ImageButton) super.findViewById(R.id.stop); this.surfaceView = (SurfaceView) super.findViewById(R.id.surfaceView); this.surfaceHolder = this.surfaceView.getHolder();// 取得SurfaceHolder this.surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);// 设置SurfaceView的类型 this.mediaPlayer = new MediaPlayer();// 创建MediaPlayer对象 try { this.mediaPlayer.setDataSource("/sdcard/test.3gp"); // 设置播放文件的路径,这里就没有判断sdcard是否存在了 } catch (Exception e) { e.printStackTrace(); } this.play.setOnClickListener(new PlayOnClickListenerImpl()); this.stop.setOnClickListener(new StopOnClickListenerImpl()); } private class PlayOnClickListenerImpl implements OnClickListener { @Override public void onClick(View v) { MediaPlayer02_VideoPlayerActivity.this.mediaPlayer .setAudioStreamType(AudioManager.STREAM_MUSIC);// 设置音频类型 MediaPlayer02_VideoPlayerActivity.this.mediaPlayer .setDisplay(MediaPlayer02_VideoPlayerActivity.this.surfaceHolder);// 设置显示区域 try { MediaPlayer02_VideoPlayerActivity.this.mediaPlayer.prepare();// 预备状态 MediaPlayer02_VideoPlayerActivity.this.mediaPlayer.start();// 播放视频 } catch (Exception e) { e.printStackTrace(); } } } private class StopOnClickListenerImpl implements OnClickListener { @Override public void onClick(View v) { MediaPlayer02_VideoPlayerActivity.this.mediaPlayer.stop();// 停止播放 } } }
发表评论
-
This version of ADT requires android SDK
2013-07-25 16:45 1541Windows系统下用Eclipse开发工具开发An ... -
Android学习13-----网络通信(4) WebView组件
2012-11-27 09:18 2452WebView 是一个开发的浏览 ... -
Android学习13-----网络通信(3) 与Web Service进行通讯
2012-11-26 09:40 1858这里我们的WebService使用xFire开发。 ... -
Android学习13-----网络通信(2) 与Socket交换数据
2012-11-23 09:11 3267对于网络开发而言,最常用的交互模式:WebService、We ... -
Android学习13-----网络通信(1) 与WEB服务器交换数据
2012-11-22 09:11 2158与Web服务器交互: 如果手机要想与 web ... -
Android学习11-----多媒体技术(5) 媒体录制
2012-11-16 08:10 1846在Android中通过android.media ... -
Android学习11-----多媒体技术(4) 使用摄像头拍照,多点触控
2012-11-15 08:37 2834一、摄像头拍照 前面说媒体播放 时了解了 ... -
Android学习11-----多媒体技术(2) Animation
2012-11-13 08:47 1955一、渐变动画, Tweened Animation ... -
Android学习11-----多媒体技术(1) 绘制简单图形,Bitmap,Matrix
2012-11-12 08:48 1568一、绘制简单图 ... -
Android学习12-----手机服务(4) 传感器
2012-11-19 09:13 1986传感器一般用于游戏中,在 Android 系统中为 ... -
Android学习12-----手机服务(1) 取得电池电量和声音服务:AudioManager
2012-11-18 11:18 3429一、取得电池电量信息 ... -
Android学习10-----Android组件通信 (8) 桌面显示组件:AppWidget
2012-11-02 08:36 1999一、 AppWidget 在使用 Androi ... -
Android学习10-----Android组件通信 (7) 广播机制:Broadcast
2012-11-01 08:43 1480一、 广播: 广播也是一种信息的发送机制,在 ... -
Android学习10-----Android组件通信 (6) PendingIntent
2012-10-31 08:20 2205Intent 的主要功能是表示用 ... -
Android学习10-----Android组件通信 (5) Service
2012-10-30 08:25 1679Service 基本组成: ... -
Android学习10-----Android组件通信 (4) 消息机制
2012-10-29 08:22 1510在 Android 操作系统中存在着消息队列的操作 ... -
Android学习10-----Android组件通信 (3) ActivityGroup
2012-10-26 08:23 2264导航栏在 Android 中的应用是很常见的,前面 ... -
Android学习10-----Android组件通信 (2) Activity生命周期
2012-10-25 08:16 1248Activity 是整个 Android 平台的基 ... -
Android学习10-----Android组件通信 (1) Intent
2012-10-24 08:43 1928在一个项目之中,会由多个 Activity ... -
Android判断是否有网络连接
2013-04-25 16:34 1402Android中判断有时候因为功能的需求,需要判断是否有网络 ...
相关推荐
在技术理论的讲解方面,《Android应用开发完全自学手册:核心技术、传感器、2D/3D、多媒体与典型案例》注重对实际动手能力和完全自学的指导,书中重点讲解了Android开发的核心知识及流行的应用技术,如游戏开发、2D...
读者对象:本书内容翔实、分析深刻,是Android学习多媒体编程不可多得的资料。可以作为IT相关专业本科生和研究生,以及嵌入式领域的初、中级软件工程师的参考读物。 作者简介 苗忠良,资深Android开发工程师和...
作为使用androidsdk构建这些应用程序的实用指南书籍,《android高级编程》从始至终穿插了一系列示例项目,每个项目都引入android的新功能和新技术,以助您达到最圆满的学习效果。书中介绍android的所有基本功能,并...
看到有人书后源码和项目案例ppt居然...Android应用开发完全自学手册——核心技术、传感器、2D/3D、多媒体与典型案例(书后源码); Android应用开发完全自学手册——核心技术、传感器、2D/3D、多媒体与典型案例(书后源码)
Android 项目是使用 Android 操作系统和相关开发工具开发的一款移动应用程序。... 本资源仅用于开源学习和技术交流。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。 3. 不可商用,一切后果由使用者承担。
使用Android技术实现的简单的多媒体播放器(服务端+客户端+数据库),平台为eclipse,可以作为毕业设计,课程设计等的参考模板,希望大家好好学习,争取更上一层楼。
支持视频格式: H.264 、流媒体、 3GPP 、 MPEG4 和 Codec 3GP ;支持音频格式: MP3 、 AAC 、 AAC+ 、 W MA 、 MPEG4 、 WAV 、 MIDI 、 REAL 、 AUDIO 和 OGG ;支持墙纸格式: JPG 、 BMP 、 PNG 和 GIF ;铃声 ...
Android进阶高级:蓝牙/WIFI SMS/MMS 应用实现 深层次解析GPS原理,实现LocationManager/LocationProvider 进行定位/跟踪/查找/趋近警告以及Geocoder正逆向编解码等技术细节 2D图形库(Graphics/View)详解 SDCARD/...
[14本经典Android开发教程]-3-Android SDK 中文开发文档 什么是 Android? Android 是一个专门针对移动设备的软件集,它包括一个操作系统,中间件和一些重要的应用程序。Beta版的 Android SDK 提供了在Android 平台上...
Android 项目是使用 Android 操作系统和相关开发工具开发的一款移动应用程序。... 本资源仅用于开源学习和技术交流。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。 3. 不可商用,一切后果由使用者承担。
想要学习android的多媒体技术的可以看一下
介绍了android多媒体的框架,学习移动流媒体技术的资料
《Android开发应用实战详解(附光盘)》循序渐进地讲解了android技术在各个领域中具体应用的典型范例,详细介绍了各个范例的具体实现过程。《Android开发应用实战详解(附光盘)》内容新颖、知识全面、讲解详细,...
Android 项目是使用 Android 操作系统和相关开发工具开发的一款移动应用程序。... 本资源仅用于开源学习和技术交流。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。 3. 不可商用,一切后果由使用者承担。
书名:《Android底层开发技术实战详解——内核、移植和驱动》(电子工业出版社.王振丽)。本书从底层原理开始讲起,结合真实的案例向读者详细介绍了android内核、移植和驱动开发的整个流程。全书分为19章,依次讲解...
Android应用源码多媒体播放器.zip项目安卓应用源码下载Android应用源码多媒体播放器.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考
10.2.3 android.process.media媒体扫描工作的流程总结 471 10.3 MediaScanner分析 472 10.3.1 Java层分析 472 10.3.2 JNI层分析 476 10.3.3 PVMediaScanner分析 479 10.3.4 关于MediaScanner的总结 485 10.4 ...
Android 项目是使用 Android 操作系统和相关开发工具开发的一款移动应用程序。... 本资源仅用于开源学习和技术交流。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。 3. 不可商用,一切后果由使用者承担。
本书是一本与众不同的Android学习读物,是一本化繁为简,把抽象问题具体化,把复杂问题简单化的书。本书避免出现云山雾罩、晦涩难懂的讲解,代之以轻松活泼、由浅入深的剖析。这必将使得阅读本书的读者少走弯路,...
Android 项目是使用 Android 操作系统和相关开发工具开发的一款移动应用程序。... 本资源仅用于开源学习和技术交流。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。 3. 不可商用,一切后果由使用者承担。