android的响铃MediaPlayer
前言
学习android一段时间了,为了进一步了解android的应用是如何设计开发的,决定详细研究几个开源的android应用。从一些开源应用中吸收点东西,一边进行量的积累,一边探索android的学习研究方向。这里我首先选择了jwood的 Standup Timer 项目。本文将把研究的内容笔记整理,建立一个索引列表。
MediaPlayer
在standup timer中需要用到多媒体的铃声提醒,它是采用MediaPlayer类进行具体操作。android 中mediaPlayer主要用于对多媒体:audio/video 音频和视频的控制。关于Mediaplayer的详细介绍可以参考SDK上的详细说明和使用。MediaPlayer有着各种不同的状态,状态间的转换是通过创建MediaPlayer实例或调用各种方法实现的。需要注意的是在有些状态下,某些方法成员是不能被调用的,否则将抛出异常。
- 当MediaPlayer 的实例被创建或运行了reset()方法重置后,它就处于Idle 的闲置(?)状态。在此状态下,大多数MediaPlayer的方法不能被调用,例如:
getCurrentPosition()
,getDuration()
,getVideoHeight()
,getVideoWidth()
,setAudioStreamType(int)
,setLooping(boolean)
,setVolume(float, float)
,pause()
,start()
,stop()
,seekTo(int)
,prepare()
orprepareAsync()。
如果调用会抛出异常。 - 一旦调用release()方法,MediaPlayer将处于 End状态
- 通过设置MediaPlayer数据源的方法 setDataSource(),完成MediaPlayer实例的初始化。
- 初始化后,必须使Mediaplayer进入perpared(准备就绪)状态,才可以进入我们熟悉的开始播放、暂停、停止等状态。进入准备状态有两种方式:同步
prepare()
或者异步prepareAsync()
- 进入Perpared状态后,调用start()方法将进入Started播放状态。在播放过程中调用对应的方法可以进入 Paused状态 和Stopped状态,且可以通过start()、pause()、Stop()方法相互切换(注意在Stopped状态下,不直接能进入Started状态,但可以通过Prepared状态来间接进入)。
- 如果资源文件播放完成,MediaPlayer将自动进入PlaybackCompleted。
在Standup Timer 中只是使用MediaPlayer进行简单的铃声提醒,编码较为简单。另外我还写过一个关于Mediaplayer的例子,是一个简单的音乐播放器——MusicPlayer(有兴趣的可以浏览一下)。
准备资源文件
在编码前,先把音频文件导入到res/raw文件夹下。
初始化Mediaplayer
声明:
privatestatic MediaPlayer bell =null;
privatestatic MediaPlayer airhorn =null;
privatestatic MediaPlayer airhorn =null;
生成实例(在Activity的onCreate里)
代码
privatevoid initializeSounds() {
if(bell==null)
{
Logger.d("Loading the bell sound");
if(bell==null)
{
Logger.d("Loading the bell sound");
//使用此方法创建MediaPlayer,PrePare()已经被调用,MediaPlayer进入PrePared状态
bell= MediaPlayer.create(this, R.raw.bell);
}
if(airhorn==null)
{
Logger.d("Loading the airhorn sound");
airhorn=MediaPlayer.create(this,R.raw.airhorn);
}
}
bell= MediaPlayer.create(this, R.raw.bell);
}
if(airhorn==null)
{
Logger.d("Loading the airhorn sound");
airhorn=MediaPlayer.create(this,R.raw.airhorn);
}
}
播放铃声
在Standup Timer里使用了计时器,当达到某时间铃声就会触发MediaPlayer播放预先准备好的铃声。
计时器
代码
protectedsynchronizedvoid updateTimerValues()
{
currentIndividualStatusSeconds++;
if (remainingIndividualSeconds >0)
{
remainingIndividualSeconds--;
if (remainingIndividualSeconds == warningTime)
{
Logger.d("Playing the bell sound");
if (SettingActivity.playSounds(this)) {
//如果等于设定的警告时间且设置允许警告则播放警告铃声
playWarningSound();
}//if
} else {
if (remainingIndividualSeconds ==0) {
Logger.d("Playing the airhorn sound");
if (SettingActivity.playSounds(this)) {
//如果时间等于零,切允许铃声提醒,则播放结束铃声
playFinishedSound();
}//if
}//if
}//else
}//if
{
currentIndividualStatusSeconds++;
if (remainingIndividualSeconds >0)
{
remainingIndividualSeconds--;
if (remainingIndividualSeconds == warningTime)
{
Logger.d("Playing the bell sound");
if (SettingActivity.playSounds(this)) {
//如果等于设定的警告时间且设置允许警告则播放警告铃声
playWarningSound();
}//if
} else {
if (remainingIndividualSeconds ==0) {
Logger.d("Playing the airhorn sound");
if (SettingActivity.playSounds(this)) {
//如果时间等于零,切允许铃声提醒,则播放结束铃声
playFinishedSound();
}//if
}//if
}//else
}//if
播放铃声
privatevoid playWarningSound() {
playSound(bell);
}
protectedvoid playFinishedSound() {
playSound(airhorn);
}
privatevoid playSound(MediaPlayer mp) {
mp.seekTo(0);
mp.start();
}
playSound(bell);
}
protectedvoid playFinishedSound() {
playSound(airhorn);
}
privatevoid playSound(MediaPlayer mp) {
mp.seekTo(0);
mp.start();
}
释放资源
使用MediaPlayer一定要记得回收资源
privatevoid destroySounds() {
bell.stop();
bell.release();
bell =null;
airhorn.stop();
airhorn.release();
airhorn =null;
}
bell.stop();
bell.release();
bell =null;
airhorn.stop();
airhorn.release();
airhorn =null;
}