从零开始学android<Mediaplayer播放器组件(播放音频).四十八.>

在win计算机中播放视频和音频往往会使用到计算机当中的windowsMediaPlayer播放器,而在Android中则同样会使用mediaplayer播放器对音频和视频进行播放。

下图是mediaplayer的生命周期

dle状态:当使用关键字new实例化一个MediaPlayer对象或者是调用了类中的reset()方法会进入到此状态;

End状态:当调用release()方法之后将进入到此状态,此时会释放掉所有占用的硬件和软件资源,并且不会再进入到其他的任何一种状态了;

Initialized状态:当MediaPlayer对象设置好了要播放的媒体文件(setDataSource())之后进入到此状态;

Prepared状态:进入到预播放状态(prepare()、prepareAsync()),进入到此状态则表示目前的媒体文件没有任何的问题,可以使用OnPreparedListener监听此状态;

如果用户调用的是prepare()方法(同步)则表示该MediaPlayer对象已经进入到了Prepared状态;

如果用户调用的是prepareAsync()方法(异步),则表示该MediaPlayer对象进入到了Preparing状态并返回,而内部播放引擎会继续执行未完成的准备操作。

Started状态:正在进行媒体播放(start()),此时可以使用seekTo()方法指定媒体播放的位置;

Paused状态:在Started状态下使用Paused状态可以暂停MediaPlayer的播放,暂停之后可以通过start()方法将其变回到Started状态,继续播放;

Stop状态:在Started和Paused状态下都可以通过stop()方法停止MediaPlayer的播放,在Stop状态下要想重新进行播放,则可以使用prepare()和prepareAsync()方法进入到就绪状态。

PlaybackCompleted状态:当媒体播放完毕之后会进入到此状态,用户可以使用OnCompletionListener监听此状态,此时可以使用start()方法重新播放,也可以使用stop()方法停止播放,或者使用seekTo()方法来重新定位播放位置;

Error状态:当用户播放操作之中出现了某些错误(文件格式不正确、播放文件过大等)则进入到此状态,用户可以使用OnErrorListener来监听此状态,如果MediaPlayer进入到了此状态后可以使用reset()方法重新变回Idle状态;

下面使用简单的例子来使用进行音频的播放

xim文件

<span style="font-size:18px;"><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <ImageButton
        android:id="@+id/imageButton1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginTop="16dp"
        android:src="@drawable/play" />

    <ImageButton
        android:id="@+id/imageButton3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignTop="@+id/imageButton2"
        android:src="@drawable/stop" />

    <ImageButton
        android:id="@+id/imageButton2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/imageButton1"
        android:layout_centerHorizontal="true"
        android:src="@drawable/pause" />

    <ImageButton
        android:id="@+id/imageButton4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/imageButton1"
        android:layout_below="@+id/imageButton1"
        android:layout_marginTop="19dp"
        android:src="@drawable/vioceup" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/imageButton4"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="14dp"
        android:text="等待播放音频文件"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <ImageButton
        android:id="@+id/imageButton5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/imageButton3"
        android:layout_alignRight="@+id/imageButton3"
        android:layout_alignTop="@+id/imageButton4"
        android:src="@drawable/voicedown" />

</RelativeLayout>
</span>

java文件

<span style="font-size:18px;">package com.example.mediaplayer;
import java.io.IOException;
import android.app.Activity;
import android.content.Context;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
	private ImageButton play, stop, pause, voiceup, voicedown;// 设置ImageButton
	private TextView info;// 设置信息提示栏
	private MediaPlayer mediaPlayer = null;// 创建MediaPlayer对象
	private Boolean PauseFlag = false;// 为play设置播放状态

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		play = (ImageButton) this.findViewById(R.id.imageButton1);
		stop = (ImageButton) this.findViewById(R.id.imageButton3);
		pause = (ImageButton) this.findViewById(R.id.imageButton2);
		voicedown = (ImageButton) this.findViewById(R.id.imageButton5);
		voiceup = (ImageButton) this.findViewById(R.id.imageButton4);
		info = (TextView) this.findViewById(R.id.textView1);
		// 获得音量操作对象
		final AudioManager audio = (AudioManager) super
				.getSystemService(Context.AUDIO_SERVICE);
		// 播放按钮的监听
		play.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				// 实例化MEdiaplay对象
				mediaPlayer = MediaPlayer
						.create(MainActivity.this, R.raw.media);
				// 对播放完成设置监听操作
				MainActivity.this.mediaPlayer
						.setOnCompletionListener(new OnCompletionListener() {

							@Override
							public void onCompletion(MediaPlayer mp) {

								// TODO Auto-generated method stub
								// 播放完成后释放资源
								mediaPlayer.release();
								// 设置播放按钮的状态
								play.setEnabled(true);
							}
						});
				if (mediaPlayer != null) {

					mediaPlayer.stop();

				}
				try {
					// 进入播放装备状态
					mediaPlayer.prepare();
				} catch (IllegalStateException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					Toast.makeText(MainActivity.this, "播放出错", 2).show();
				}
				// 开始播放音频
				mediaPlayer.start();
				info.setText("正在播放音乐");
				// 播放后不能对该首歌曲继续开启播放
				play.setEnabled(false);

			}
		});
		// 对暂停播放的监听
		pause.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub

				if (mediaPlayer != null) {
					// 对暂停状态进行判断,实现点击播放和再次点击暂停的功能
					if (PauseFlag) {
						mediaPlayer.start();
						PauseFlag = false;
						info.setText("正在播放音乐");
					} else {
						mediaPlayer.pause();
						info.setText("停止播放音乐");
						PauseFlag = true;
					}

				}

			}
		});
		// 对停止按钮的监听
		stop.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				if (mediaPlayer != null) {
					mediaPlayer.stop();
					info.setText("停止播放音频");
					play.setEnabled(true);
				}
			}
		});
//对音量降低进行监听
		voicedown.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				audio.adjustVolume(AudioManager.ADJUST_LOWER, 0);
				Toast.makeText(MainActivity.this, "音量降低", 1).show();
			}
		});
		//对音量提高进行监听

		voiceup.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				audio.adjustVolume(AudioManager.ADJUST_RAISE, 0);
				Toast.makeText(MainActivity.this, "音量增加", 1).show();
			}
		});
	}

}
</span>

使用mediaplayer可以很方便的对音频进行控制,大家可以参照APi实现更多的功能。

下节预报:mediaplayer系统播放器(播放视频)

时间: 2024-10-21 06:21:07

从零开始学android<Mediaplayer播放器组件(播放音频).四十八.>的相关文章

从零开始学android&lt;android事件的处理方式.二十四.&gt;

在android中一共有 多种事件,每种事件都有自己相对应的处理机制 如以下几种 1 单击事件 View.OnClickListener public abstract void onClick (View v) 单击组件时触发 2 单击事件 View.OnLongClickListener public abstract boolean onLongClick (View v) 长按组件时触发 3 键盘事件 View.OnKeyListener public abstract boolean

二十四、Android文件的读写

Android的文件读写与JavaSE的文件读写相同,都是使用IO流.而且Android使用的正是JavaSE的IO流,下面我们通过一个练习来学习Android的文件读写. 1.创建一个Android工程 [html] view plaincopy Project name:File BuildTarget:Android2.2 Application name:文件读写 Package name:test.file Create Activity:DateActivity Min SDK Ve

Android学习笔记二十四之ListView列表视图二

Android学习笔记二十四之ListView列表视图二 前面一篇我们介绍了常用的几种适配器的简单实现和ListView的简单使用,这一篇中,我们介绍一下ListView的优化和一些其它的问题. ListView优化方法一 在ListView中,我们最常用的就是自定义Adapter,在我们自定义Adapter中,需要实现两个比较重要的方法getCount()和getView(),前者是负责计算ListView的总Item数,后者是生成Item,有多少个Item就会调用getView()方法多少次

Android学习路线(二十四)ActionBar Fragment运用最佳实践

通过前面的几篇博客,大家看到了Google是如何解释action bar和fragment以及推荐的用法.俗话说没有demo的博客不是好博客,下面我会介绍一下action bar和fragment在实战中的应用,以及相关demo源码,希望和大家相互交流. 了解过fragment的同学们应该都知道,fragment是android 3.0版本才出现的的,因此如果要在支持android 3.0一下版本的工程中使用fragment的话是需要添加Support Library的.具体如何添加我就不再赘述

Android 沉浸式状态栏 实现方式二 ( 更简单 )

以前写过一个沉浸式状态栏 的实现方式 Android 沉浸式状态栏 实现方式一 现在有个更为简单的实现方式 . 相关链接 http://www.apkbus.com/forum.php?mod=viewthread&tid=255929&extra=page%3D3%26filter%3Dsortid%26orderby%3Ddateline%26sortid%3D12 1.效果图 demo 的 github 地址  https://github.com/zyj1609wz/Android

Android笔记二十四.Android基于回调的事件处理机制

如果说事件监听机制是一种委托式的事件处理,那么回调机制则与之相反,对于基于回调的事件处理模型来说,事件源和事件监听器是统一的,或者说事件监听器完全消失了,当用户在GUI控件上激发某个事件时,控件自己特定的方法将会负责处理该事件. 转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空) 一.View类的常见回调方法 为了使用回调机制来处理GUI控件上所发生的事件,需要为该组件提供对应的事件处理方法,而Java又是一种静态语言,我们无法为每个对象动态地添

Android开发系列(二十四):Notification的功能与用法

关于消息的提示有两种:一种是Toast,一种就是Notification.前者维持的时间比较短暂,后者维持的时间比较长. 而且我们平常手机的应用比如网易.贴吧等等都有很多的推送消息,就是用Notification实现的. Notification是显示在手机状态栏的通知-手机状态栏位于手机屏幕的上方.程序一般通过NotificationManager服务来发送Notification通知 Notification的一些方法,接下来我们都能够用到: setDefaults():设置通知LED等.音

Android学习笔记二十四.Service入门(二)绑定本地Service并与之通信

绑定本地Service并与之通信    通过上一篇博文的前3步,我们就算完成了一个Service及使用该Service的应用程序(Service为该应用程序的组成部分).但当程序通过startService()和stopService()启动.关闭Service时,Service与访问者之间基本上不存在太多的关联,因此Service和访问者之间也无法进行通信.数据交换.如果我们希望开发的Service能与访问者之间实现方法调用或数据交换,我们可以让访问者使用bindService()和unbin

Android开发系列(二十四):Notification的功能与使用方法

关于消息的提示有两种:一种是Toast,一种就是Notification.前者维持的时间比較短暂,后者维持的时间比較长. 并且我们寻常手机的应用比方网易.贴吧等等都有非常多的推送消息.就是用Notification实现的. Notification是显示在手机状态栏的通知-手机状态栏位于手机屏幕的上方.程序一般通过NotificationManager服务来发送Notification通知 Notification的一些方法.接下来我们都可以用到: setDefaults():设置通知LED等.

《Android源码设计模式解析与实战》读书笔记(二十四)

第二十四章.桥接模式 桥接模式也称为桥梁模式,是结构型设计模式之一.桥接模式中体现了"单一职责原则"."开闭原则"."里氏替换原则"."依赖倒置原则"等.同时它也是很实用的一种模式. 1.定义 将抽象部分与现实部分分离,使它们都可以独立地进行变化. 2.使用场景 (1)如果一个系统需要在构建的抽象化角色和具体角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系. (2)对于那些不希望使用继承或因为多层次继承导致系统类