|--效果图

|--依赖3个对象

MediaPlayer:实现音乐播放,暂停,缓冲。
    SeekBar:滑动的进度条。

java.util.Timer:定时器,时时更新进度条。

|--main.xml样式文件

[html] view plain copy print ?
  1. <span style="font-size:14px;">    <TextView
  2. android:layout_width="fill_parent"
  3. android:layout_height="wrap_content"
  4. android:text="@string/hello" />
  5. <EditText
  6. android:id="@+id/mediaFileName"
  7. android:layout_width="match_parent"
  8. android:text="gangstabop.mp3"
  9. android:layout_height="wrap_content" >
  10. <requestFocus />
  11. </EditText>
  12. <LinearLayout
  13. android:id="@+id/linearButton"
  14. android:layout_width="match_parent"
  15. android:layout_height="wrap_content" >
  16. <Button
  17. android:id="@+id/playButton"
  18. android:layout_width="wrap_content"
  19. android:layout_height="wrap_content"
  20. android:text="@string/stop" />
  21. <SeekBar
  22. android:id="@+id/playSeekBar"
  23. android:layout_width="140px"
  24. android:layout_height="wrap_content"
  25. android:layout_marginLeft="3px"
  26. android:layout_marginTop="5px" />
  27. <Button
  28. android:id="@+id/replayButton"
  29. android:layout_width="wrap_content"
  30. android:layout_height="wrap_content"
  31. android:layout_marginLeft="3px"
  32. android:text="@string/replay" />
  33. </LinearLayout></span><span style="font-size: 24px;">
  34. </span>

|--Activity实现代码

[java] view plain copy print ?
  1. <span style="font-size:14px;">/**
  2. * @CreateDate 2015-2-3
  3. * @Author hubiao
  4. * @Title 音乐播放器
  5. */
  6. public class MediaActivity extends Activity {
  7. private MediaPlayer mediaPlayer;//媒体播放器
  8. private Button playButton;
  9. private Button replayButton ;
  10. private boolean isCellPlay;/*在挂断电话的时候,用于判断是否为是来电时中断*/
  11. private boolean isSeekBarChanging;//互斥变量,防止进度条与定时器冲突。
  12. private int currentPosition;//当前音乐播放的进度
  13. private SeekBar seekBar;
  14. private Timer timer;
  15. private static final String TAG = "MediaActivity";
  16. @Override
  17. public void onCreate(Bundle savedInstanceState) {
  18. super.onCreate(savedInstanceState);
  19. setContentView(R.layout.main);
  20. //实例化媒体播放器
  21. mediaPlayer = new MediaPlayer();
  22. //监听滚动条事件
  23. seekBar = (SeekBar) findViewById(R.id.playSeekBar);
  24. seekBar.setOnSeekBarChangeListener(new MySeekBar());
  25. // 监听[播放或暂停]事件
  26. playButton= (Button) findViewById(R.id.playButton);
  27. playButton.setOnClickListener(new PalyListener());
  28. //监听[重播]事件
  29. replayButton= (Button) findViewById(R.id.replayButton);
  30. replayButton.setOnClickListener(new OnClickListener() {
  31. public void onClick(View v) {
  32. mediaPlayer.reset();
  33. currentPosition = 0;
  34. play();
  35. }
  36. });
  37. //监听来电事件
  38. TelephonyManager phoneyMana = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
  39. phoneyMana.listen(new myPhoneStateListener(),PhoneStateListener.LISTEN_CALL_STATE);
  40. }
  41. /*销毁时释资源*/
  42. @Override
  43. protected void onDestroy() {
  44. mediaPlayer.release();
  45. timer.cancel();
  46. timer = null;
  47. mediaPlayer = null;
  48. super.onDestroy();
  49. }
  50. /*播放或暂停事件处理*/
  51. private class PalyListener implements OnClickListener {
  52. public void onClick(View v) {
  53. if(playButton.getText().toString().equals("播放"))
  54. {
  55. currentPosition = mediaPlayer.getCurrentPosition();//记录播放的位置
  56. mediaPlayer.stop();//暂停状态
  57. playButton.setText(R.string.stop);
  58. timer.purge();//移除所有任务;
  59. }
  60. else{
  61. mediaPlayer.reset();
  62. play();
  63. }
  64. }
  65. }
  66. /*播放处理*/
  67. private void play() {
  68. File media = new File("/mnt/sdcard/files/","bewithyou.mp3");//由于是练习,就把mp3名称固定了
  69. Log.i(TAG, media.getAbsolutePath());
  70. if(media.exists())
  71. {
  72. try {
  73. mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);//设置音频类型
  74. mediaPlayer.setDataSource(media.getAbsolutePath());//设置mp3数据源
  75. mediaPlayer.prepareAsync();//数据缓冲
  76. /*监听缓存 事件,在缓冲完毕后,开始播放*/
  77. mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
  78. public void onPrepared(MediaPlayer mp) {
  79. mp.start();
  80. mp.seekTo(currentPosition);
  81. playButton.setText(R.string.play);
  82. seekBar.setMax(mediaPlayer.getDuration());
  83. }
  84. });
  85. //监听播放时回调函数
  86. timer = new Timer();
  87. timer.schedule(new TimerTask() {
  88. @Override
  89. public void run() {
  90. if(!isSeekBarChanging){
  91. seekBar.setProgress(mediaPlayer.getCurrentPosition());
  92. }
  93. }
  94. },0,50);
  95. } catch (Exception e) {
  96. Toast.makeText(getApplicationContext(), R.string.playError, Toast.LENGTH_LONG).show();
  97. e.printStackTrace();
  98. System.out.println(e);
  99. }
  100. }
  101. else{
  102. Toast.makeText(getApplicationContext(), R.string.fileError, Toast.LENGTH_LONG).show();
  103. }
  104. }
  105. /*来电事件处理*/
  106. private class myPhoneStateListener extends PhoneStateListener
  107. {
  108. @Override
  109. public void onCallStateChanged(int state, String incomingNumber) {
  110. switch (state) {
  111. case TelephonyManager.CALL_STATE_RINGING://来电,应当停止音乐
  112. if(mediaPlayer.isPlaying() && playButton.getText().toString().equals("播放")){
  113. currentPosition = mediaPlayer.getCurrentPosition();//记录播放的位置
  114. mediaPlayer.stop();
  115. isCellPlay = true;//标记这是属于来电时暂停的标记
  116. playButton.setText(R.string.stop);
  117. timer.purge();//移除定时器任务;
  118. }
  119. break;
  120. case TelephonyManager.CALL_STATE_IDLE://无电话状态
  121. if(isCellPlay){
  122. isCellPlay = false;
  123. mediaPlayer.reset();
  124. play();
  125. }
  126. break;
  127. }
  128. }
  129. }
  130. /*进度条处理*/
  131. public class MySeekBar implements OnSeekBarChangeListener{
  132. public void onProgressChanged(SeekBar seekBar, int progress,
  133. boolean fromUser) {
  134. }
  135. /*滚动时,应当暂停后台定时器*/
  136. public void onStartTrackingTouch(SeekBar seekBar) {
  137. isSeekBarChanging = true;
  138. }
  139. /*滑动结束后,重新设置值*/
  140. public void onStopTrackingTouch(SeekBar seekBar) {
  141. isSeekBarChanging = false;
  142. mediaPlayer.seekTo(seekBar.getProgress());
  143. }
  144. }
  145. }</span>

|--补充

   1:如果mp3在sd中,如播放失败,是否申请sd访问权限或mp3文件是否存在。
   2:MediaPlayer对有个别的音频好像不太支持,如果路径正确,权限具备还无法播放,就考虑下音频问题。
   3:本案例用到的权限。
[html] view plain copy print ?
  1. <!-- 申请SD卡写入权限 -->
  2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  3. <!--申请SD卡创建与权限  -->
  4. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
  5. <!-- 拦截号码权限 -->
  6. <uses-permission android:name="android.permission.READ_PHONE_STATE"/>

android实现音乐播放器(进度条)相关推荐

  1. android音乐播放器进度条误差研究

    2019独角兽企业重金招聘Python工程师标准>>> 如何做一个"流畅"而且"准确"的进度条? 流畅!由两个条件决定,更新的频率 和 更新的 ...

  2. android音乐播放器进度条研究

    如何做一个"流畅"而且"准确"的进度条? 流畅!由两个条件决定,更新的频率 和 更新的精度 频度和精度要相适应,才能保证流畅,并不是精度越高越好,也不是频度越高 ...

  3. MediaPlayer 音乐播放器进度条

    今天学渣研究了一下使用MediaPlayer播放音乐时添加进度条,进度条现在用的是android自带的seekbar,后期会跟换UI的,在之前能够播放音乐的基础上,现在添加的主要功能有两个: 1实时显 ...

  4. android mp3进度条和时间,AndroidStudio音乐播放器进度条和歌曲时间的操作

    1.首先,我们需要使用在activity_main布局中定义好一个SeekBar和两个ListView,SeekBar表示进度条,两个ListView分别用来表示当前的时间和歌曲的总时间. 2.在Mu ...

  5. html音乐播放器进度条同步,网页音乐播放器完整版特效,自行控制,带进度条...

    WWW.51JS.COM---[94OK] //---------这是区分播放器的音乐类型,你可以填加修改------// var RS = new Array("rm",&quo ...

  6. AndroidStudio音乐播放器进度条和歌曲时间的操作

    1.首先,我们需要使用在activity_main布局中定义好一个SeekBar和两个ListView,SeekBar表示进度条,两个ListView分别用来表示当前的时间和歌曲的总时间. 2.在Mu ...

  7. 【Android】音乐播放器APP的设计与实现

    [Android]音乐播放器APP的设计与实现 一.界面设计 二.核心代码 一.界面设计 (1)注册登录 (2)主界面 (3)音乐播放器 可以实现开始,暂停,下一首,上一首功能:滑动进度条可以改变音乐 ...

  8. android仿音乐播放器,Android仿音乐播放器功能

    本文实例为大家分享了Android仿音乐播放器功能的具体代码,供大家参考,具体内容如下 读取本地音乐文件 源代码: import android.media.MediaPlayer; import a ...

  9. Android 自定义音乐播放器实现

    Android自定义音乐播放器 一:首先介绍用了哪些Android的知识点: 1 MediaPlayer工具来播放音乐 2 Handle.因为存在定时任务(歌词切换,动画,歌词进度条变换等)需要由Ha ...

最新文章

  1. 解密淘宝网的开源架构(转)
  2. Windows Mobile访问SQL Server CE 3.5(2)
  3. 模拟浏览器自动化测试工具Selenium之四cssSelector元素定位开发篇
  4. 蓝桥杯 大臣的旅费(Java dfs)
  5. 大数相乘(c语言/c++)
  6. word公式插件_添加office小插件,让办公更高效
  7. linux经常使用解压缩命令
  8. 看动画学算法之:排序-归并排序
  9. 《高性能python》第一章-理解高性能Python-阅读笔记
  10. OC中的基本容器和基本数据类型
  11. 下列哪个可做 Android 数据存储,Android应用开发试题
  12. 接活,你为啥不行,之懒
  13. js模块的封装(-)
  14. 当AI邂逅电能:与图知科技一起探索工业AI王座|白洞战报
  15. 极速pdf android,极速PDF阅读器 V3.0.0.2003 官方版[安卓软件]
  16. FogROS2 使用 ROS 2 的云和雾机器人的自适应和可扩展平台
  17. 安科瑞导轨表DDS/DTS/DTZ的功能特点
  18. 【Linux服务器管理】1、用户与权限
  19. html中循环生成表格数据,动态生成表格(简单实现)
  20. 2020年计算机专业研究生考试时间,2020计算机考研考试时间及考试内容

热门文章

  1. Pandas之drop_duplicates:去除重复项
  2. ZYNQ SDK开发调试踩坑指南
  3. 唐伯虎啊.......哎~~
  4. JS 开启 win10 触屏键盘
  5. 谈谈我对云原生与软件供应链安全的思考
  6. [转]PROE传动链条的装配教程
  7. 国家职业三级计算机,计算机程序设计员国家职业资格三级(高级) 试卷三.doc
  8. 和府捞面全新品牌“小面小酒”在福州开业,下一批新店落地天津、淄博
  9. LeetCode 347. 前 K 个高频元素(C++)*
  10. 2011年1月23日