版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】AndroidMediaPlayer如何实现播放音频的方式
在下给大家分享一下AndroidMediaPlayer如何实现播放音频的方式,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!主要介绍使用MediaPlayer播放音频的方式。关于MediaPlayer的基础知识,比如状态,可以参考AndroidMediaPlayer基础简介。为了方便表达,定义变量名为mediaPlayer。MediaPlayer的使用方式创建MediaPlayer可以直接newMediaPlayer,也可以用MediaPlayer提供的create方法创建。mediaPlayer=newMediaPlayer();使用create方法创建成功后,mediaPlayer处于Prepared状态。可以直接start播放。mediaPlayer
=
MediaPlayer.create(getApplicationContext(),
Uri.fromFile(file));
mediaPlayer.start();设置音源-setDataSource通过调用setDataSource来设置音源。setDataSource有多个重载方法,我们来看常用的几种。例如设置使用assets里的资源。实际情况可能需要trycatch。AssetFileDescriptor
fd
=
null;
MediaPlayer
mediaPlayer
=
new
MediaPlayer();
fd
=
context.getApplicationContext().getAssets().openFd(name);
mediaPlayer.setDataSource(fd.getFileDescriptor(),
fd.getStartOffset(),
fd.getLength());本地文件,需要文件的绝对路径。mediaPlayer.setDataSource(file.getAbsolutePath());或者获取文件的Uri来创建mediaPlayer。mediaPlayer
=
MediaPlayer.create(getApplicationContext(),
Uri.fromFile(file));设置网络音频,也是用setDataSource方法,设置url。mediaPlayer.setDataSource("/sample.mp3"));播放网络音频时,如果使用的是http,有可能会报错java.io.IOException:
Cleartext
HTTP
traffic
to
not
permitted可以简单地设置一下manifest,设置usesCleartextTraffic=”true”<application
android:usesCleartextTraffic="true">准备-prepare同步和异步准备音频资源。prepareAsync()是异步的方式,prepare是同步的。注意线程调度问题,同时不要阻塞UI线程。使用异步方式准备音频,经常与MediaPlayer.OnPreparedListener监听器配合使用。异步准备时,也可以进行其他的设置。mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new
MediaPlayer.OnPreparedListener()
{
@Override
public
void
onPrepared(MediaPlayer
mediaPlayer)
{
mediaPlayer.start();
//
准备好了就播放
}
});循环播放-Looping设置循环播放setLooping。mediaPlayer.setLooping(true);播放完毕后,不会回调OnCompletionListener,而是从头播放当前音频。播放-start播放音频,调用start方法。mediaPlayer.start();处于Prepared,Pause和PlaybackComplete状态时,可以调用start方法,进入Started状态。暂停-pause暂停播放,使用pause方法。在暂停前先判断一下mediaPlayer的是否在播放。if
(mediaPlayer.isPlaying())
{
mediaPlayer.pause();
}暂停成功则处于Paused状态。停止-stop回顾一下MediaPlayer状态切换的图示,我们可以得知在播放中,暂停,播放完成这3个状态下,可以调用stop方法,进入Stopped状态。mediaPlayer.stop();调进度-seekTo调整播放进度。我们平时使用音乐播放软件一般都会有这个功能。seekTo方法接受一个毫秒参数。int
targetMS
=
(int)
(percent
*
mediaPlayer.getDuration());
mediaPlayer.seekTo(targetMS);seekTo并不会改变MediaPlayer的状态。int
targetMS
=
(int)
(percent
*
mediaPlayer.getDuration());
mediaPlayer.seekTo(targetMS);reset后的mediaPlayer进入Idle状态。需要重新设置音源与准备。释放-release不再使用这个mediaPlayer时,应当尽快释放掉,以释放相关的资源。调用release后,mediaPlayer进入End状态。此时这个mediaPlayer就不能再使用了。常用监听器缓冲监听器OnBufferingUpdateListener比如我们加载网络音频的时候,常用这个监听器来监听缓冲进度。显示缓冲进度,也可以提高用户体验。mMediaPlayer.prepareAsync();
mMediaPlayer.setOnBufferingUpdateListener(new
MediaPlayer.OnBufferingUpdateListener()
{
@Override
public
void
onBufferingUpdate(MediaPlayer
mp,
int
percent)
{
//
percent代表缓冲百分比
}
});错误监听器OnErrorListenermediaPlayer.setOnErrorListener(new
MediaPlayer.OnErrorListener()
{
@Override
public
boolean
onError(MediaPlayer
mediaPlayer,
int
i,
int
i1)
{
return
true;
//
返回true表示在此处理错误,不会回调onCompletion
}
});注意onError的返回值。可以选择自己处理error。
*
@return
True
if
the
method
handled
the
error,
false
if
it
didn't.
*
Returning
false,
or
not
having
an
OnErrorListener
at
all,
will
*
cause
the
OnCompletionListener
to
be
called.
*/
boolean
onError(MediaPlayer
mp,
int
what,
int
extra);播放完毕监听器OnCompletionListenermediaPlayer.setOnCompletionListener(new
MediaPlayer.OnCompletionListener()
{
@Override
public
void
onCompletion(MediaPlayer
mediaPlayer)
{
//
播放完毕
}
});使用示例播放assets里的音频播放assets里的音频文件,使用到AssetFileDescriptor类。使用后记得关闭AssetFileDescriptor。private
void
playAssetsAudio(final
String
name,
Context
context)
{
Log.d(TAG,
"playAssetWordSound:
try
to
play
assets
sound
file.
->
"
+
name);
AssetFileDescriptor
fd
=
null;
try
{
MediaPlayer
mediaPlayer;
Log.v(TAG,
"Looking
in
assets.");
fd
=
context.getApplicationContext().getAssets().openFd(name);
mediaPlayer
=
new
MediaPlayer();
mediaPlayer.reset();
mediaPlayer.setDataSource(fd.getFileDescriptor(),
fd.getStartOffset(),
fd.getLength());
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new
MediaPlayer.OnPreparedListener()
{
@Override
public
void
onPrepared(MediaPlayer
mediaPlayer)
{
Log.d(TAG,
"onPrepared:
"
+
name);
mediaPlayer.start();
}
});
mediaPlayer.setOnCompletionListener(new
MediaPlayer.OnCompletionListener()
{
@Override
public
void
onCompletion(MediaPlayer
mp)
{
mp.release();
Log.d(TAG,
"onCompletion:
"
+
name);
}
});
mediaPlayer.setOnErrorListener(new
MediaPlayer.OnErrorListener()
{
@Override
public
boolean
onError(MediaPlayer
mp,
int
i,
int
i1)
{
mp.release();
return
true;
}
});
}
catch
(Exception
e)
{
try
{
if
(fd
!=
null)
{
fd.close();
}
}
catch
(Exception
e1)
{
Log.e(TAG,
"Exception
close
fd:
",
e1);
}
}
finally
{
if
(fd
!=
null)
{
try
{
fd.close();
}
catch
(IOException
e)
{
Log.e(TAG,
"Finally,
close
fd
",
e);
}
}
}
}播放本地音频文件尝试播放音频文件。仅播放一次。private
void
playAudioFile(final
File
file)
{
Log.d(TAG,
"playAudioFile:
"
+
file.getAbsolutePath());
MediaPlayer
mediaPlayer;
try
{
mediaPlayer
=
new
MediaPlayer();
mediaPlayer.setLooping(false);
mediaPlayer.setDataSource(file.getAbsolutePath());
mediaPlayer.prepare();
mediaPlayer.start();
mediaPlayer.setOnCompletionListener(new
MediaPlayer.OnCompletionListener()
{
@Override
public
void
onCompletion(MediaPlayer
mp)
{
mp.release();
}
});
mediaPlayer.setOnErrorListener(new
MediaPlayer.OnErrorListener()
{
@Override
public
boolean
onError(MediaPlayer
mediaPlayer,
int
i,
int
i1)
{
Log.d(TAG,
"Play
local
sound
onError:
"
+
i
+
",
"
+
i1);
return
true;
}
});
}
catch
(Exception
e)
{
Log.e(TAG,
"playAudioFile:
",
e);
}
}播放在线音频设置url,播放在线音频private
void
playOnlineSound(String
soundUrlDict)
{
try
{
MediaPlayer
mediaPlayer
=
new
MediaPlayer();
mediaPlayer.setDataSource(soundUrlDict);
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new
M
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 基于冷链物流的绿色包装解决方案研究
- 2024年江西省南昌市青云谱区一级造价工程师《土建计量》深度预测试卷含解析
- 二级考辅教学计划
- DB46T 623-2024大型游乐设施使用安全管理规范
- 楼面做法课程设计
- 爱国研学课程设计
- 美食文化课程设计
- 水电表安装承包合同(范本)
- 银行自助服务亭技术规范
- 金融科技在网贷行业的应用考核试卷
- GB/T 44269-2024信息技术高性能计算系统管理监控平台技术要求
- 2024版北京市体检人群抽样健康报告
- 跨学科实践活动1 微型空气质量“检测站”的组装与使用课件-2024-2025学年九年级化学人教版(2024)上册
- 制作包装袋合同协议书
- 人教版小学二年级道德与法治上册《第一单元 我们的节假日》大单元整体教学设计
- 2024天津滨海新区轨道交通投资发展限公司招聘26人(高频重点提升专题训练)共500题附带答案详解
- 2024年电力交易员(高级工)职业鉴定理论考试题库-下(多选、判断题)
- 近视防治指南(2024年版)
- 养老机构认知症老人非药物干预疗法操作指南
- 装配式建筑施工安全管理
- 2024年国网无人机竞赛考试题库(附答案)
评论
0/150
提交评论