使用SoundPool怎么在播放借调任务结束通知函后得到通知

Android多媒体开发 音乐播放以及使用SoundPool播放音效
Android多媒体开发 音乐播放以及使用SoundPool播放音效
  音乐播放&MediaPlayer mediaPlayer = new MediaPlayer();&if (mediaPlayer.isPlaying()) {& & mediaPlayer.reset();//重置为初始状态&}&mediaPlayer.setDataSource("/mnt/sdcard/god.mp3");&mediaPlayer.prepare(); &mediaPlayer.start();//开始或恢复播放&mediaPlayer.pause();//暂停播放&mediaPlayer.start();//恢复播放&mediaPlayer.stop();//停止播放&mediaPlayer.release();//释放资源&mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {//播出完毕事件& & & & @Override public void onCompletion(MediaPlayer arg0) {& & mediaPlayer.release();& & & & }&});&mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {// 错误处理事件& & & & & @Override public boolean onError(MediaPlayer player, int arg1, int arg2) {&mediaPlayer.release();&& & & & & }&});&音乐播放代码示例:&DemoActivity.java:
  package cast.mp3;
  import java.io.Fimport Android.app.Aimport dia.MediaPimport dia.MediaPlayer.OnCompletionLimport dia.MediaPlayer.OnPreparedLimport android.os.Bimport android.os.SystemCimport android.telephony.PhoneStateLimport android.telephony.TelephonyMimport android.view.Vimport android.view.View.OnClickLimport android.widget.Bimport android.widget.Cimport android.widget.Chronometer.OnChronometerTickLimport android.widget.EditTimport android.widget.T
  public class DemoActivity extends Activity implements OnClickListener,& OnChronometerTickListener {&private EditText et_&private Chronometer et_&private Button bt_play, bt_pause, bt_replay, bt_&private MediaPlayer mediaP&private TelephonyM&/**& * subtime:点击&续播&到暂停时的间隔的和 beginTime:重新回到播放时的bash值 falgTime:点击&播放&时的值& * pauseTime:&暂停&时的值& */&private long subtime = 0, beginTime = 0, falgTime = 0, pauseTime = 0;
  @Override&public void onCreate(Bundle savedInstanceState) {& super.onCreate(savedInstanceState);& setContentView(R.layout.main);& manager = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);& manager.listen(new MyListener(), PhoneStateListener.LISTEN_CALL_STATE);
  et_path = (EditText) this.findViewById(R.id.et_path);& et_time = (Chronometer) this.findViewById(R.id.et_time);& bt_play = (Button) this.findViewById(R.id.play);& bt_pause = (Button) this.findViewById(R.id.pause);& bt_replay = (Button) this.findViewById(R.id.replay);& bt_stop = (Button) this.findViewById(R.id.stop);
  bt_play.setOnClickListener(this);& bt_pause.setOnClickListener(this);& bt_replay.setOnClickListener(this);& bt_stop.setOnClickListener(this);& et_time.setOnChronometerTickListener(this);
  public void onClick(View v) {& S& try {& &switch (v.getId()) {& &case R.id.play:& & falgTime = SystemClock.elapsedRealtime();& & path = et_path.getText().toString().trim();& & play(path);& & pauseTime = 0;& & et_time.setBase(falgTime);& & et_time.start();& && &case R.id.pause:& & pause();& && &case R.id.replay:& & if (mediaPlayer != null && mediaPlayer.isPlaying()) {& & &mediaPlayer.seekTo(0);& & &et_time.setBase(SystemClock.elapsedRealtime());& & &et_time.start();& & } else {& & &path = et_path.getText().toString().trim();& & &play(path);& & &et_time.setBase(SystemClock.elapsedRealtime());& & &et_time.start();
  }& & if ("续播".equals(bt_pause.getText().toString().trim())) {& & &bt_pause.setText("暂停");
  }& & falgTime = SystemClock.elapsedRealtime();& & subtime = 0;& && &case R.id.stop:& & if (mediaPlayer != null && mediaPlayer.isPlaying()) {& & &mediaPlayer.stop();& & &mediaPlayer =& & &et_time.setBase(SystemClock.elapsedRealtime());& & &et_time.start();& & &et_time.stop();& & &bt_play.setEnabled(true);& & &bt_play.setClickable(true);& & }& & falgTime = 0;& & subtime = 0;& &
  }& } catch (Exception e) {& &e.printStackTrace();& &Toast.makeText(getApplicationContext(), "文件播放出现异常", 0).show();& }
  private void pause() {& // 判断音乐是否在播放
  if (mediaPlayer != null && mediaPlayer.isPlaying()) {& &// 暂停音乐播放器& &mediaPlayer.pause();& &bt_pause.setText("续播");& &et_time.stop();
  pauseTime = SystemClock.elapsedRealtime();& &System.out.println("1 pauseTime" + pauseTime);& } else if (mediaPlayer != null& & && "续播".equals(bt_pause.getText().toString())) {& &subtime += SystemClock.elapsedRealtime() - pauseT& &System.out.println("2 subtime:" + subtime);& &mediaPlayer.start();& &bt_pause.setText("暂停");& &beginTime = falgTime +& &System.out.println("3 beginTime" + beginTime);& &et_time.setBase(beginTime);& &et_time.start();& }&}
  /**& * 播放指定地址的音乐文件 .mp3 .wav .amr& * & * @param path& */&private void play(String path) throws Exception {& if ("".equals(path)) {& &Toast.makeText(getApplicationContext(), "路径不能为空", 0).show();& && }& File file = new File(path);& if (file.exists()) {& &// 如果文件存在 才进行播放操作& &// if (mediaPlayer == null) {& &mediaPlayer = new MediaPlayer();& &mediaPlayer.setDataSource(path);& &// mediaPlayer.prepare(); // c/c++ 播放器引擎的初始化& &// 同步方法& &// 采用异步的方式& &mediaPlayer.prepareAsync();& &// 为播放器注册& &mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
  public void onPrepared(MediaPlayer mp) {& & &// TODO Auto-generated method stub& & &mediaPlayer.start();& & &bt_play.setEnabled(false);& & &bt_play.setClickable(false);& & }& &});
  // 注册播放完毕后的监听事件& &mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
  public void onCompletion(MediaPlayer mp) {& & &mediaPlayer.release();& & &mediaPlayer =& & &bt_play.setEnabled(true);& & &bt_play.setClickable(true);& & &et_time.setBase(SystemClock.elapsedRealtime());& & &et_time.start();& & &et_time.stop();& & }& &});
  // }else{& &// mediaPlayer.reset(); // 重置 播放器的状态& &// mediaPlayer.setDataSource(path);& &// mediaPlayer.prepare(); // c/c++ 播放器引擎的初始化& &// mediaPlayer.start();& &// }
  } else {& &Toast.makeText(getApplicationContext(), "文件不存在", 0).show();& && }
  private class MyListener extends PhoneStateListener {
  @Override& public void onCallStateChanged(int state, String incomingNumber) {& &super.onCallStateChanged(state, incomingNumber);& &switch (state) {& &case TelephonyManager.CALL_STATE_RINGING:& & // 音乐播放器暂停& & pause();& && &case TelephonyManager.CALL_STATE_IDLE:& & // 重新播放音乐& & pause();& && &}& }&}
  public void onChronometerTick(Chronometer chronometer) {
  }}  main.xml:
  &?xml version="1.0" encoding="utf-8"?&&LinearLayout xmlns:Android=""& & android:layout_width="fill_parent"& & android:layout_height="fill_parent"& & android:orientation="vertical" &
  &TextView& & & & android:layout_width="fill_parent"& & & & android:layout_height="wrap_content"& & & & android:text="请输入音乐的路径" /&
  &Chronometer& & & & android:id="@+id/et_time"& & & & android:layout_width="fill_parent"& & & & android:layout_height="wrap_content" /&
  &EditText& & & & android:id="@+id/et_path"& & & & android:layout_width="fill_parent"& & & & android:layout_height="wrap_content"& & & & android:text="/sdcard/e.mp3" /&
  &LinearLayout& & & & android:layout_width="fill_parent"& & & & android:layout_height="wrap_content"& & & & android:gravity="center_horizontal"& & & & android:orientation="horizontal" &
  &Button& & & & & & android:id="@+id/play"& & & & & & android:layout_width="wrap_content"& & & & & & android:layout_height="wrap_content"& & & & & & android:text="播放" /&
  &Button& & & & & & android:id="@+id/pause"& & & & & & android:layout_width="wrap_content"& & & & & & android:layout_height="wrap_content"& & & & & & android:text="暂停" /&
  &Button& & & & & & android:id="@+id/replay"& & & & & & android:layout_width="wrap_content"& & & & & & android:layout_height="wrap_content"& & & & & & android:text="重播" /&
  &Button& & & & & & android:id="@+id/stop"& & & & & & android:layout_width="wrap_content"& & & & & & android:layout_height="wrap_content"& & & & & & android:text="停止" /&& & &/LinearLayout&
  &/LinearLayout&
  使用SoundPool播放音效:&&
在Android开发中我们经常使用MediaPlayer来播放音频文件,但是MediaPlayer存在一些不足,例如:资源占用量较高、延迟时间较长、不支持多个音频同时播放等。这些缺点决定了MediaPlayer在某些场合的使用情况不会很理想,例如在对时间精准度要求相对较高的游戏开发中。 & & 在游戏开发中我们经常需要播放一些游戏音效(比如:子弹爆炸,物体撞击等),这些音效的共同特点是短促、密集、延迟程度小。在这样的场景下,我们可以使用SoundPool代替MediaPlayer来播放这些音效。 & & SoundPool(dia.SoundPool),顾名思义是声音池的意思,主要用于播放一些较短的声音片段,支持从程序的资源或文件系统加载。与MediaPlayer相比,SoundPool的优势在于CPU资源占用量低和反应延迟小。另外,SoundPool还支持自行设置声音的品质、音量、播放比率等参数,支持通过ID对多个音频流进行管理。& & 就现在已知的资料来说,SoundPool有一些设计上的BUG,从固件版本1.0开始有些还没有修复,我们在使用中应该小心再小心。相信将来Google会修复这些问题,但我们最好还是列出来:&  1. SoundPool最大只能申请1M的内存空间,这就意味着我们只能用一些很短的声音片段,而不是用它来播放歌曲或者做游戏背景音乐。&  2. SoundPool提供了pause和stop方法,但这些方法建议最好不要轻易使用,因为有些时候它们可能会使你的程序莫名其妙的终止。建议使用这两个方法的时候尽可能多做测试工作,还有些朋友反映它们不会立即中止播放声音,而是把缓冲区里的数据播放完才会停下来,也许会多播放一秒钟。&  3. SoundPool的效率问题。其实SoundPool的效率在这些播放类中算是很好的了,但是有的朋友在G1中测试它还是有100ms左右的延迟,这可能会影响用户体验。也许这不能管SoundPool本身,因为到了性能比较好的Droid中这个延迟就可以让人接受了。&  在现阶段SoundPool有这些缺陷,但也有着它不可替代的优点,基于这些我们建议大在如下情况中多使用SoundPool:&& & & 1.应用程序中的声效(按键提示音,消息等)2.游戏中密集而短暂的声音(如多个飞船同时爆炸)&
  开发步骤:&1& 往项目的res/raw目录中放入音效文件。&2& 新建SoundPool对象,然后调用SoundPool.load()加载音效,调用SoundPool.play()方法播放指定音效文件。&public class AudioActivity extends Activity {&private SoundP&@Override&public void onCreate(Bundle savedInstanceState) {&super.onCreate(savedInstanceState);&setContentView(R.layout.main);&//指定声音池的最大音频流数目为10,声音品质为5&pool = new SoundPool(10, AudioManager.STREAM_SYSTEM, 5);&final int sourceid = pool.load(this, R.raw.pj, 0);//载入音频流,返回在池中的id&Button button = (Button)this.findViewById(R.id.button);&button.setOnClickListener(new View.OnClickListener() {&public void onClick(View v) {&//播放音频,第二个参数为左声道音量;第三个参数为右声道音量;第四个参数为优先级;第五个参数为循环次数,0不循环,-1循环;第六个参数为速率,速率最低0.5最高为2,1代表正常速度&pool.play(sourceid, 1, 1, 0, -1, 1);&}&});&}&}  使用SoundPool播放音效代码示例:&DemoActivity.java:
  package cast.
  import Android.app.Aimport dia.AudioMimport dia.SoundPimport android.os.Bimport android.view.V
  public class DemoActivity extends Activity {&&SoundP
  @Override&public void onCreate(Bundle savedInstanceState) {& super.onCreate(savedInstanceState);& setContentView(R.layout.main);& pool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);& // 这语句代码 是一个异步的操作& soundid = pool.load(this, R.raw.ring, 1); // 需要花费一定的时间&}
  public void shoot(View view) {& // 不会播放 因为上面异步的加载声音的操作 还没完成& pool.play(soundid, 1.0f, 1.0f, 0, 0, 1.0f);& // taking tom&}}
H3C认证Java认证Oracle认证
基础英语软考英语项目管理英语职场英语
.NETPowerBuilderWeb开发游戏开发Perl
二级模拟试题一级模拟试题一级考试经验四级考试资料
软件测试软件外包系统分析与建模敏捷开发
法律法规历年试题软考英语网络管理员系统架构设计师信息系统监理师
高级通信工程师考试大纲设备环境综合能力
路由技术网络存储无线网络网络设备
CPMP考试prince2认证项目范围管理项目配置管理项目管理案例项目经理项目干系人管理
职称考试题目
招生信息考研政治
网络安全安全设置工具使用手机安全
生物识别传感器物联网传输层物联网前沿技术物联网案例分析
Java核心技术J2ME教程
Linux系统管理Linux编程Linux安全AIX教程
Windows系统管理Windows教程Windows网络管理Windows故障
数据库开发Sybase数据库Informix数据库
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&查看:4674|回复:1
助理工程师
这个问题看起来很简单,可是我一点都不知道应该怎么做。
我使用soundPool类,想要在一首背景音乐播放结束后播放其他背景音乐,问题就是我不
知道怎么才可以知道背景音乐已经播放结束。
Any ideas?
初级工程师
据我所知,使用SoundPool是不能达到你的要求的。
我知道的就是MediaPlayer这个类,它可以告诉你音乐已经播放结束了。虽然比SoundPool更复杂,但你可以使用OnCompletionListener方法来得到音乐播放结束的通知。&>&&>&&>&&>&使用 SoundPool 同时播放多个音频
使用 SoundPool 同时播放多个音频
上传大小:417KB
使用 SoundPool 同时播放多个音频
具体详情请参见 http://blog.csdn.net/aduovip/article/details/
综合评分:4.2(6位用户评分)
所需积分:1
下载次数:56
审核通过送C币
创建者:redwolfchao
创建者:ch
创建者:doomlord
课程推荐相关知识库
上传者其他资源上传者专辑
移动开发热门标签
VIP会员动态
android服务器底层网络模块的设计方法
所需积分:0
剩余积分:720
您当前C币:0
可兑换下载积分:0
兑换下载分:
兑换失败,您当前C币不够,请先充值C币
消耗C币:0
你当前的下载分为234。
使用 SoundPool 同时播放多个音频
会员到期时间:
剩余下载次数:
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:

我要回帖

更多关于 借调任务结束通知函 的文章

 

随机推荐