一、类结构:
java.lang.Object
↳
android.media.MediaPlayer
二、构造方法和公有方法
构造方法:
Public Constructors
MediaPlayer()
默认构造方法。
公有方法:
Public Methods
static MediaPlayer
create(Context context, Uri uri, SurfaceHolder holder)
指定从资源ID对应的资源文件中来装载音乐文件,同时指定了SurfaceHolder对象并返回MediaPlyaer对象。
static MediaPlayer
create(Context context, int resid)
指定从资源ID对应的资源文件中来装载音乐文件,并返回新创建的MediaPlyaer对象。
static MediaPlayer
create(Context context, Uri uri)
从指定Uri装在音频文件,并返回新创建的MediaPlayer对象。
int
getCurrentPosition()
获取当前播放的位置。
int
getDuration()
获取音频的时长。
int
getVideoHeight()
获取视频的高度。
int
getVideoWidth()
获取视频的宽度。
boolean
isLooping()
判断MediaPlayer是否正在循春仔灶环播放。
boolean
isPlaying()
判断MediaPlayer是否正在播放。
void
pause()
暂停播放。
void
prepare()
准备播放(装载音频),调用此方法会使MediaPlayer进入Prepared状态。
void
prepareAsync()
准备播放异步音频。
void
release()
释放媒体戚孝资源。
void
reset()
重置MediaPlayer进入未初始化状态。
void
seekTo(int msec)
寻找指定的时间位置。
void
setAudioStreamType(int streamtype)
设置音频流的类型。
void
setDataSource(String path)
指定装载path路径所代表的文件。
void
setDataSource(Context context, Uri uri, Map<String, String headers)
指定扒扮装载uri所代表的文件。
void
setDataSource(Context context, Uri uri)
指定装载uri所代表的文件。
void
setDataSource(FileDescriptor fd, long offset, long length)
指定装载fd所代表的文件中从offset开始长度为length的文件内容。
void
setDataSource(FileDescriptor fd)
指定装载fd所代表的文件。
void
setDisplay(SurfaceHolder sh)
设置显示方式。
void
setLooping(boolean looping)
设置是否循环播放。
void
setNextMediaPlayer(MediaPlayer next)
设置当前流媒体播放完毕,下一个播放的MediaPlayer。
void
setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener listener)
注册一个回调函数,在网络视频流缓冲变化时调用。
void
setOnCompletionListener(MediaPlayer.OnCompletionListener listener)
为Media Player的播放完成事件绑定事件监听器。
void
setOnErrorListener(MediaPlayer.OnErrorListener listener)
为MediaPlayer的播放错误事件绑定事件监听器。
void
setOnPreparedListener(MediaPlayer.OnPreparedListener listener)
当MediaPlayer调用prepare()方法时触发该监听器。
void
setOnSeekCompleteListener(MediaPlayer.OnSeekCompleteListener listener)
当MediaPlayer调用seek()方法时触发该监听器。
void
setOnVideoSizeChangedListener(MediaPlayer.OnVideoSizeChangedListener listener)
注册一个用于监听视频大小改变的监听器。
void
setScreenOnWhilePlaying(boolean screenOn)
置是否使用SurfaceHolder来显示。
void
setSurface(Surface surface)
设置Surface。
void
setVideoScalingMode(int mode)
设置视频缩放的模式。
void
setVolume(float leftVolume, float rightVolume)
设置播放器的音量。
void
setWakeMode(Context context, int mode)
为MediaPlayer设置低级电源管理行为。.
void
start()
开始或恢复播放。
void
stop()
停止播放。
三、常用方法分析:
1.使用进度条:
进度条SeekBar可以用来显示播放进度,用户也可以利用SeekBar的滑块来控制音乐的播放。
SeekBar需要使用的一些方法:
setProgress(int value):设置滑块的位置方法为。
setMax(int value):设置进度条的最大长度。
setOnSeekBarChangeListener(OnSeekBarChangeListener l):设置SeekBar的进度改变事件。
MusicPlayer需要使用的一些方法:
getDuration():获得音乐长度为。
getCurrentPosition():获得现在播放的位置。
seekTo(int msec):调用seekTo()方法可以调整播放的位置。
seekTo(int)方法是异步执行的,所以它可以马上返回,但是实际的定位播放 *** 作可能需要一段时间才能完成,尤其是播放流形式的音频/视频。当实际的定位播放 *** 作完成之后,内部的播放引擎会调用客户端程序员提供的OnSeekComplete.onSeekComplete()回调方法。可以通过setOnSeekCompleteListener(OnSeekCompleteListener)方法注册。
seekTo(int)方法也可以在其它状态下调用,比如Prepared,Paused和PlaybackCompleted状态。此外,目前的播放位置,实际可以调用getCurrentPosition()方法得到,它可以帮助如音乐播放器的应用程序不断更新播放进度。
创建并使用进度条的步骤:
第一步:创建一个进度条
//进度条
static SeekBarskbMusic
skbMusic=(SeekBar)findViewById(R.id.skbMusic)
第二步:为进度条的改变事件注册并添加监听器
skbMusic.setOnSeekBarChangeListener(sChangeListener)
/**
* SeekBar进度改变事件
*/
OnSeekBarChangeListenersChangeListener=new OnSeekBarChangeListener() {
@Override
publicvoid onStopTrackingTouch(SeekBar seekBar) {
//TODO Auto-generated method stub
//当拖动停止后,控制mediaPlayer播放指定位置的音乐
MusicService.mediaPlayer.seekTo(seekBar.getProgress())
MusicService.isChanging=false
}
@Override
publicvoid onStartTrackingTouch(SeekBar seekBar) {
//TODO Auto-generated method stub
MusicService.isChanging=true
}
@Override
publicvoid onProgressChanged(SeekBar seekBar,int progress,
boolean fromUser) {
//TODO Auto-generated method stub
}
}
第三步:设置进度条的最大长度:
//getDuration()方法要在prepare()方法之后,否则会出现Attempt to call getDuration without a valid mediaplayer异常
MusicBox.skbMusic.setMax(mediaPlayer.getDuration())//设置SeekBar的长度
第四步:更新进度条
//----------定时器记录播放进度---------//
mTimer =new Timer()
mTimerTask =new TimerTask() {
@Override
publicvoid run() {
isTimerRunning=true
if(isChanging==true)//当用户正在拖动进度进度条时不处理进度条的的进度
return
MusicBox.skbMusic.setProgress(mediaPlayer.getCurrentPosition())
}
}
//每隔10毫秒检测一下播放进度
mTimer.schedule(mTimerTask, 0, 10)
2.装载音频文件:
为了让MediaPlayer来装载指定音频文件,MediaPlayer提供了如下简单的静态方法。
static MediaPlayer create(Context context, Uri uri):从指定Uri来装载音频文件,并返回新创建的MediaPlayer对象。
static MediaPlayer create(Context context, int resid):从 resid资源 ID对应的资源文件中装载音频文件,并返回新创建的MediaPlayer对象。
提示:上而这两个方法用起来非常方便,但这两个方法每次都会返回新创建的MediaPlayer对象,如来程序需要使用MediaPlayer循环播放多个音频文件,使用MediaPlayer的静态create方法就不太合适了,此时可通过MediaPlayer的setDataSource()方法来装载指定的音频文件。MediaPlayer提供了如下方法来指定装载相应的音频文件。
setDataSource(String path):指定装载path路径所代表的文件。
setDataSource(FileDescriptor fd, long offset,long length):指定装载fd所代表的文件中从offset开始长度为length的文件内容。
setDataSource(FileDescriptor fd):指定装载fd所代表的文件。
setDataSource(Context context, Uri uri):指定装载uri所代表的文件。
提示:执行上面所示的setDataSource()方法之后,MediaPlayer并未真正去装载那些音频文件,还需要调用MediaPlayer的prepare()方法去准备音频,所谓“准备”,就是让MediaPlayer真正去装载音频文件。
使用已有的MediaPlayer对象装载“一首”歌曲的代码模板为:
mPlayer.reset()
//装战下一竹歌曲
mPlayer.setDataSource(M/mnt/sdcard/next.mp3)
//准备声音 mPlayer.prepare()
"播放
mPlayer.start()
}
catch (IOException e)
e.printStackTrace()
}
3.与MediaPlayer有关的事件监听器:
MediaPlayer提供了一些绑定事件监听器的方法,用于监听MediaPlayer播放过程中所发生的特定事件,绑定事件监听器的方法如下。
setOnCompletionListener(MediaPlayer.OnCompletionListener listener):为 Media Player的播放完成事件绑定事件监听器。
setOnErrorListener(MediaPlayer.OnErrorListener listener):为MediaPlayer的播放错误事件绑定事件监听器。
setOnPreparedListener(MediaPlayer.OnPreparedListener listener):当 MediaPlayer调用prepare()方法时触发该监听器。
setOnSeekCompleteListener(MediaPlayer.OnSeekCompleteListener listener):当MediaPlayer调用seek()方法时触发该监听器。
因此可以在创建一个MediaPlayer对象之后,通过为该MediaPlayer绑定监听器来监听相应的事件,例如如下代码:
//为MediaPlayer的播放完成事件绑定事件监听器
mPlayer.setOnErrorListener(new OnErrorListener() {
@Override
publicboolean onError(MediaPlayer mp,int what,int extra) {
//TODO Auto-generated method stub
//针对错误进行相应的处理
// ... ...
}
})
//为MediaPlayer的播放完成讲件绑定市件监听器
mPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
publicvoid onCompletion(MediaPlayer mp) {
//TODO Auto-generated method stub
current++
prepareAndPlay(current)
}
})
四、MediaPlayer播放不同来源的音频文件:
1.播放应用的资源文件
播放应用的资源文件需要两步即:
1) 调用MediaPlayer的create(Context context,int resid)方法加指定资源文件。
2) 调用 MediaPlayer的 start()、pause()、stop()等方法控制播放即可。
例如如下代码:
MediaPlayer mPlayer=new MediaPlayer()
mPlayer.create(this, R.raw.music)
2. 播放应用的原始资源文件
播放应用的资源文件按如下步骤执行。
1) 调用 Context的 getAssets()方法获取应用的 AssetManager。
2) 调用AssetManager对象的openFd(String name)方法打开指定的原生资源,该方法返回一个AssetFileDescriptor对象。
3) 调用 AssetFileDescriptor的 getFileDescriptor()、getStartOffset()和 getLength()方法来获取音频文件的FileDescriptor、开始位置、长度等。
4) 创建MediaPlayer对象(或利用已有的MediaPlayer对象),并调用MediaPlayer对象的setDataSource(FileDescriptor fd,long offset, long length)方法来装载音频资源。
5) 调用MediaPlayer对象的prepare()方法准备音频。
6) 调用MediaPlayer的start()、pause()、stop()等方法控制播放即可。
例如如下代码片段:
//获取assets目录下指定文件的AssetFileDescriptor对象
AssetFileDescriptor assetFileDescriptor=assetManager.openFd(musics[current])
mediaPlayer.reset()//初始化mediaPlayer对象
mediaPlayer.setDataSource(assetFileDescriptor.getFileDescriptor(), assetFileDescriptor.getStartOffset(), assetFileDescriptor.getLength())
//准备播放音乐
mediaPlayer.prepare()
//播放音乐
mediaPlayer.start()
3. 播放外部存储器上音频文件
播放外部存储器上音频文件按如下步骤执行。
1) 创建MediaPlayer对象(或利用已有的MediaPlayer对象),并调用MediaPlayer对象的setDateSource(String path)方法装载指定的音频文件。
2) 调用MediaPlayer对象的prepare()方法准备音频。
3) 调用MediaPlayer的start()、pause()、stop()等方法控制播放即可。
例如如下代码:
//加载SD卡上的指定资源音频文件
mPlayer.setDataSource("/mnt/You Are The One.mp3")
mPlayer.prepare()//准备因音频
mPlayer.start()//播放音频
4.播放来自网络的音频文件
播放来自网络的音频文件冇两种方式:1.直接使用MediaPlayer的静态create(Context context, Uri uri)方法;2.调用 MediaPlayer的setDataSource(Context context,Uri uri)装载指定Uri对应的音频文件。
以第二种方式播放来自网络的音频文件的步骤如下。
1. 根据网络上的音频文件所在的位置创建Uri对象。
2. 创建MediaPlayer对象(或利用己有的MediaPlayer对象),并调用MediaPlayer对象的 setDateSource(Context context,Uri uri)方法装载Uri对应的音频文件。
3. 调用MediaPlayer对象的prepare()方法准备音频。
4. 调用MediaPlayer的start()、pause()、stop()等方法控制播放即可。
利用参数编辑器(Parameter Editor)来为参数赋值
具体方法是 选中TQuery部件 单击鼠标右键 然后从中选择Define Parameters 便可以打开参数编辑器
例如 在TQuery部件的SQL属性中我们设置如下的SQL语句
Setect * From Customer Where CustNO=:Number
TQuery的DatabaseName属性为DBDEMOS 其中Number为参数变量 我们便可以为参数Number赋值 在Datetype组合框中选择该参数的数据类型为整数Integer 在Value编辑框中可以为参数Number赋一个值 也可以单击Null Value检查框为参数Number赋一个空值Null 给参数赋值之后 单击OK按钮 这样TQuery部件中的SQL 查询便准备好了 而且参数值也被赋给了动态SQL语句中相应的参数 此时当把TQuery 部件的Active属性设置成True时 在与TQuery部件相连的数据浏览部件中会显示出查询结果 通过参数编辑器为参数赋值 这种方式缺乏应有的灵活性 在实际应用中用得较少 在实际应用中程序设计人员希望用更灵活方便的方式为参数赋值 那就是我们接下来要介绍的另一种途径
在运行过程中 通过程序为参数赋值
用这种方式为参数赋值有三种方法
①根据参数在SQL语句中出现的顺序 设置TQuery部件的Params属性值为参数赋值
②直接根据SQL语句中各参数的名字 调用ParamByName方法来为各参数赋值
③将TQuery部仔银迟件的DataSource属性设置为另一个数据源 这样将另一个数据源中与当前TQuery部件的SQL语句中的参数名相匹配的字段值赋给其对应的参数
这三种方法我们将在下面的三小节中具体地介绍
使用Params属性为参数赋值
TQuery部件具有一个Params属性 它们在设计时不可用 在程序运行过程中可用 并且是动态建立的 当为TQuery部件编写动态SQL 语句时 Delphi 会自动地建立一个数组Params 数组Params是以 下标开始的 依次对应动态SQL 语句中的参数 也就是说动态SQL语句中第一个参数对应Params[ ] 第二个参数对应params[ ] 依此类推
例如 一个TQuery部件Query 我们为它编写的动态SQL语句是
Insert Into Customer(CustNo Name Country)
Values(念李 CustNo :Name : Country)
对于上述这条动态SQL语句中的参数 我们可以利用TQuery部件的params 属性为参数赋值
Query params[ ] AsString :=
Query params[ ] AsString := Lichtenstein
Query params[ ] AsString := USA
上述语句将把 赋给参数 Cuse_No Lichtenstein 赋给参数 Name USA 赋给参数 Country
使用ParamByName方法为参数赋值
ParamByName是一个函数 用动态SQL语句中的参数作为调用ParamByName函数的参数 这样便可以为它们赋值 使用这种赋值方法 必须要知道动态SQL语句参数的名字
例如在 节中的例子中 也可以用下述方法给参数赋值
Query ParamByName( CustNo ) AsString :=
Query ParamByName( Name ) AsString := Lichtenstein
Query ParamByName( Country ) AsString := USA
使用这种方法同样可以为各参数赋值 而且更加直观一些
使用Datasource属性为参数赋值
上述两种方法的共同特点是 我们在为各参数赋值时 我们是知道各参数对应的具体参数值的 而在具体的应用程序中 有些参数值常常是无法确定的 例如参数值来自于另搏宴一个查询结果 对于这种情况 Delphi提供了使用Datasource属性为动态SQL 语句中尚存在没有赋值的参数时 Delphi 会自动检查 TQuery 部件的 Datasource 属性 如果为Datasource属性设置了属性值(该属性的值是另一个TDatasource部件的名字) Delphi 会把没有赋值的参数与TDatasource部件中的各字段比较 Delphi 会将相应的字段值赋给与其相匹配的参数 利用这种方法也能实现所谓的连接查询 我们在学习使用TTable部件时 便会创建主要 明细型数据库应用 用TQuery部件创建的连接查询与主要 明细型应用是相似的
例如 在如图 所示的应用中 设置了下列部件
● 一个TTable部件
名字为Cust 它的DatabaseName属性为DEMOS TableName属性为Customer
● 一个TDatasource部件
名字为Custsource 其Dataset属性被设置为Cust
● 一个TQuery部件
名字为ORDERS 其DatabaseName被设置为DEMOS SQL属性值为
Select Orders CustNo Orders OrderNo Orders SaleDate FROM Orders
WHERE Orders CustNo =: CustNo
ORDERS的DataSouce属性被设置为CustSource
● 一个TDatasource部件
名字为OrderSource 其DataSet属性被设置为Orders
● 两个TDBGrid部件
它们分别连接CustSource和OrderSource
TQuery部件Orders中的动态SQL语句中的参数 CustNo在程序设计过程中没有给它赋值 当该应用程序运行时Delphi会自动地到其Datasource属性中说明的数据源CustSource中查找与参数 CustNo匹配的字段 而CustSource中正好有一个名字为 CustNo 的字段与参数 CustNo匹配 这样Customer表中的CustNo字段值被赋给了参数 : CustNo 而当每移动Customer表中的记录指针 参数 CustNo的值会随之改变 而参数 CustNo的值发生改变时 Orders中的动态SQL语句会根据新的参数值重新查询 从数据库表中获取相应的订单数据 这样也变实现了类似于主要 明细型应用 即连接查询
Prepare方法的使用
在使用动态SQL语句编程时 常常用到一个很重要的方法prepare 调用prepare 方法之后 Delphi会将带参数的SQL语句传送给与其对应的数据库引擎 对动态SQL语句进行语法分析和优化 虽然在用动态SQL语句编程时 调用prepare方法并不是必须的 但是这里我们要极力推荐调用prepare方法 因为调用prepare方法后 会大大提高动态SQL 语句的执行性能 特别是当要反复多次执行同一条动态SQL语句时 其优越性会更加明显 如果在应用程序中执行一条SQL语句之前并没有显式地调用prepare方法 每次在执行SQL 语句时 Delphi会隐含地调用propare方法以准备这个查询
TQuery部件还有一个prepare属性 这是一个布尔型属性 当其属性值为True时 表明该查询已被准备好了( SQL 语句已被传送到数据库引擎中 ) 当我们使用参数编辑器Parameters Editor来为动态SQL语句中的参数赋值时 当设置完相应的参数值并退出参数编辑器时 Delphi会隐含地调用prepare方法以准备好查询
当SQL语句执行完之后 要想准备下一个查询 首先必须调用close方法 然后才能调用prepare方法准备下一个查询 一般来说 在一个应用程序中应该调用一次prepare方法 常常在窗体的OnCreate事件处理过程中调用prepare方法 然后用上述介绍的方法为参数赋值 最后调用Open方法或ExecSQL方法执行SQL语句 以完成查询
当然在调用prepare方法准备好一个查询时 会消耗一些数据库资源 因而每当一个查询执行完毕之后 要养成调用Unprepare方法以撤消查询的好习惯 在运行程序过程中 通过程序改变TQuery部件的SQL属性值时 Delphi会自动地调用Close方法和Unprepare 方法 以撤消查询
返回目录 DELPHI基础教程
编辑推荐
Java程序设计培训视频教程
J EE高级框架实战培训视频教程
Visual C++音频/视频技术开发与实战
Oracle索引技术
ORACLE G数据库开发优化指南
Java程序性能优化 让你的Java程序更快 更稳定
C嵌入式编程设计模式
Android游戏开发实践指南
lishixinzhi/Article/program/Delphi/201311/25147
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)