先说以下开发环境:Android sdk 2.2   target:android-8

AndroidManifest.xml:

Java代码  
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.icox.android"
  4. android:versionCode="1"
  5. android:versionName="1.0">
  6. <uses-sdk android:minSdkVersion="8" />
  7. <application android:icon="@drawable/icon" android:label="@string/app_name">
  8. <activity android:name="MusicPlayer"
  9. android:label="@string/app_name">
  10. <intent-filter>
  11. <action android:name="android.intent.action.MAIN" />
  12. <category android:name="android.intent.category.LAUNCHER" />
  13. </intent-filter>
  14. </activity>
  15. </application>
  16. <!-- WRITE_EXTERNAL_STORAGE sd 卡的权限 -->
  17. <uses-permission android:name="WRITE_EXTERNAL_STORAGE"></uses-permission>
  18. </manifest>

/res/layout/main.xml:

Java代码  
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical" android:layout_width="fill_parent"
  4. android:layout_height="fill_parent">
  5. <TextView android:id="@+id/mTextView" android:layout_width="fill_parent"
  6. android:layout_height="wrap_content" android:text=""></TextView>
  7. <LinearLayout android:id="@+id/ll_list"
  8. android:orientation="vertical" android:layout_width="fill_parent"
  9. android:layout_height="wrap_content">
  10. <ListView android:id="@+id/lv_music" android:layout_width="fill_parent"
  11. android:layout_height="wrap_content"></ListView>
  12. </LinearLayout>
  13. <LinearLayout android:id="@+id/ll_btn"
  14. android:orientation="horizontal" android:layout_width="fill_parent"
  15. android:layout_height="wrap_content">
  16. <ImageButton android:id="@+id/imgbtn_loop" android:src="@drawable/loop"
  17. android:background="#00000000" android:layout_width="wrap_content"
  18. android:layout_height="wrap_content" />
  19. <ImageButton android:id="@+id/imgbtn_last" android:src="@drawable/last"
  20. android:background="#00000000" android:layout_width="wrap_content"
  21. android:layout_height="wrap_content"></ImageButton>
  22. <ImageButton android:id="@+id/imgbtn_start" android:src="@drawable/start"
  23. android:background="#00000000" android:layout_width="wrap_content"
  24. android:layout_height="wrap_content"></ImageButton>
  25. <ImageButton android:id="@+id/imgbtn_pause" android:src="@drawable/pause"
  26. android:background="#00000000" android:visibility="gone"
  27. android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageButton>
  28. <ImageButton android:id="@+id/imgbtn_stop" android:src="@drawable/stop"
  29. android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageButton>
  30. <ImageButton android:id="@+id/imgbtn_next" android:src="@drawable/next"
  31. android:background="#00000000" android:layout_width="wrap_content"
  32. android:layout_height="wrap_content"></ImageButton>
  33. </LinearLayout>
  34. <LinearLayout android:id="@+id/ll_btn"
  35. android:orientation="vertical" android:layout_width="fill_parent"
  36. android:layout_height="wrap_content">
  37. </LinearLayout>
  38. <SeekBar android:layout_height="wrap_content" android:id="@+id/SeekBar01"
  39. android:layout_width="fill_parent"></SeekBar>
  40. </LinearLayout>

/res/drawable 目录下放需要的图片资源文件。skip...

MusicPlayer.java:

Java代码  
  1. package com.icox.android;
  2. import java.io.File;
  3. import java.io.FilenameFilter;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6. import android.app.Activity;
  7. import android.app.AlertDialog;
  8. import android.content.DialogInterface;
  9. import android.media.MediaPlayer;
  10. import android.media.MediaPlayer.OnCompletionListener;
  11. import android.media.MediaPlayer.OnErrorListener;
  12. import android.os.Bundle;
  13. import android.os.Handler;
  14. import android.os.Message;
  15. import android.util.Log;
  16. import android.view.View;
  17. import android.widget.AdapterView;
  18. import android.widget.ArrayAdapter;
  19. import android.widget.ImageButton;
  20. import android.widget.ListView;
  21. import android.widget.SeekBar;
  22. import android.widget.TextView;
  23. public class MusicPlayer extends Activity implements Runnable {
  24. /** Called when the activity is first created. */
  25. private MediaPlayer MediaPlayer = null;
  26. private SeekBar SeekBar = null;
  27. private ListView ListView = null;
  28. private ImageButton btnLast = null;
  29. private ImageButton btnStart = null;
  30. private ImageButton btnPause = null;
  31. private ImageButton btnStop = null;
  32. private ImageButton btnNext = null;
  33. private ImageButton btnLoop = null;
  34. private TextView TextView = null;
  35. private List<String> MusicList = null;
  36. private int Current = 0;
  37. private int count = 0;
  38. private boolean isrun = false;
  39. private boolean isauto = false;
  40. private static final String PATH = "/sdcard/";
  41. @Override
  42. public void onCreate(Bundle savedInstanceState) {
  43. super.onCreate(savedInstanceState);
  44. // setContentView(R.layout.music);
  45. setContentView(R.layout.main);
  46. ListView = (ListView) this.findViewById(R.id.lv_music);
  47. SeekBar = (SeekBar) this.findViewById(R.id.SeekBar01);
  48. TextView = (TextView) this.findViewById(R.id.mTextView);
  49. TextView.setText("Louisa 的迷你音乐播放器");
  50. btnLoop = (ImageButton) findViewById(R.id.imgbtn_loop);
  51. btnLast = (ImageButton) this.findViewById(R.id.imgbtn_last);
  52. btnStart = (ImageButton) this.findViewById(R.id.imgbtn_start);
  53. btnPause = (ImageButton) this.findViewById(R.id.imgbtn_pause);
  54. btnStop = (ImageButton) this.findViewById(R.id.imgbtn_stop);
  55. btnNext = (ImageButton) this.findViewById(R.id.imgbtn_next);
  56. MusicList = new ArrayList<String>();
  57. MediaPlayer = new MediaPlayer();
  58. // 循环按钮
  59. btnLoop.setOnClickListener(new ImageButton.OnClickListener() {
  60. public void onClick(View v) {
  61. LoopMusic();
  62. }
  63. });
  64. // 开始按钮
  65. btnStart.setOnClickListener(new ImageButton.OnClickListener() {
  66. @Override
  67. public void onClick(View v) {
  68. PlayMusic(PATH + MusicList.get(Current));
  69. }
  70. });
  71. // 下一首
  72. btnNext.setOnClickListener(new ImageButton.OnClickListener() {
  73. @Override
  74. public void onClick(View v) {
  75. // TODO Auto-generated method stub
  76. NextMusic();
  77. }
  78. });
  79. // 上一首
  80. btnLast.setOnClickListener(new ImageButton.OnClickListener() {
  81. @Override
  82. public void onClick(View v) {
  83. // TODO Auto-generated method stub
  84. LastMusic();
  85. }
  86. });
  87. // 暂停
  88. btnPause.setOnClickListener(new ImageButton.OnClickListener() {
  89. @Override
  90. public void onClick(View v) {
  91. // TODO Auto-generated method stub
  92. isrun = true;
  93. isauto = false;
  94. btnStart.setVisibility(View.VISIBLE);// 显示启动按钮
  95. btnPause.setVisibility(View.GONE);// 隐藏暂停按钮
  96. // 是否正在播放
  97. if (MediaPlayer.isPlaying()) {
  98. MediaPlayer.pause();
  99. }
  100. }
  101. });
  102. // 停止
  103. btnStop.setOnClickListener(new ImageButton.OnClickListener() {
  104. @Override
  105. public void onClick(View v) {
  106. // TODO Auto-generated method stub
  107. StopMusic();
  108. }
  109. });
  110. // 单击音乐播放列表,播放歌曲事件
  111. ListView.setOnItemClickListener(new ListView.OnItemClickListener() {
  112. @Override
  113. public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
  114. long arg3) {
  115. Current = arg2;
  116. StopMusic();
  117. PlayMusic(PATH + MusicList.get(Current));
  118. }
  119. });
  120. SeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
  121. @Override
  122. public void onProgressChanged(SeekBar seekBar, int progress,
  123. boolean fromUser) {
  124. if (!isauto) {
  125. // int n = mMediaPlayer.getCurrentPosition();
  126. // mMediaPlayer.pause();
  127. MediaPlayer.seekTo(progress);
  128. // mMediaPlayer.start();
  129. // isauto = true;
  130. }
  131. }
  132. @Override
  133. public void onStartTrackingTouch(SeekBar seekBar) {
  134. isauto = false;
  135. }
  136. @Override
  137. public void onStopTrackingTouch(SeekBar seekBar) {
  138. isauto = true;
  139. }
  140. });
  141. this.MusicList();
  142. new Thread(this).start();
  143. }
  144. public void PlayMusic(String path) {
  145. try {
  146. btnStart.setVisibility(View.GONE);// 隐藏启动按钮
  147. btnPause.setVisibility(View.VISIBLE);// 显示暂停按钮
  148. if (!isrun) {
  149. MediaPlayer.reset();// 重置
  150. MediaPlayer.setDataSource(path);// 设置数据源
  151. MediaPlayer.prepare();// 准备
  152. MediaPlayer.start();// 开始播放
  153. count = MediaPlayer.getDuration();
  154. Log.i("TAG-count", count + "");
  155. SeekBar.setMax(count);// 设置最大值.
  156. this.TextView.setText("当前播放歌曲:" + MusicList.get(Current));
  157. MediaPlayer
  158. .setOnCompletionListener(new OnCompletionListener() {
  159. @Override
  160. public void onCompletion(MediaPlayer mp) {
  161. // TODO Auto-generated method stub
  162. NextMusic();
  163. }
  164. });
  165. MediaPlayer.setOnErrorListener(new OnErrorListener() {
  166. @Override
  167. public boolean onError(MediaPlayer mp, int what, int extra) {
  168. ShowDialog("Error");
  169. MediaPlayer.reset();
  170. return true;
  171. }
  172. });
  173. } else {
  174. MediaPlayer.start();// 暂停之后接着播放
  175. }
  176. isauto = true;
  177. } catch (Exception ex) {
  178. this.ShowDialog("播放音乐异常:" + ex.getMessage());
  179. }
  180. }
  181. public void LoopMusic(){
  182. isrun=true;
  183. if(btnLoop.isPressed()==true  && MediaPlayer.isPlaying()){
  184. MediaPlayer.setLooping(true);
  185. MediaPlayer.start();
  186. }
  187. }
  188. public void NextMusic() {
  189. int num = MusicList.size();
  190. if (++Current >= num) {
  191. Current = 0;
  192. }
  193. StopMusic();
  194. PlayMusic(PATH + MusicList.get(Current));
  195. }
  196. public void LastMusic() {
  197. int num = MusicList.size();
  198. if (--Current < 0) {
  199. Current = num - 1;
  200. }
  201. StopMusic();
  202. PlayMusic(PATH + MusicList.get(Current));
  203. }
  204. @Override
  205. protected void onPause() {
  206. super.onPause();
  207. isauto = false;
  208. if (MediaPlayer.isPlaying()) {
  209. MediaPlayer.stop();// 停止
  210. }
  211. MediaPlayer.reset();
  212. MediaPlayer.release();
  213. // mMediaPlayer = null;
  214. }
  215. public void StopMusic() {
  216. isrun = false;
  217. // isauto = false;
  218. btnPause.setVisibility(View.GONE);// 隐藏暂停按钮
  219. btnStart.setVisibility(View.VISIBLE);// 显示启动按钮
  220. if (MediaPlayer.isPlaying()) {
  221. MediaPlayer.stop();// 停止
  222. }
  223. // mSeekBar.setProgress(0);
  224. }
  225. // 关于循环播放的设置:
  226. // if (Common.PLAY_MODE_SINGLE_LOOP == mPlayMode) {
  227. // mMediaPlayer.setLooping(true); // 单曲循环
  228. // } else {
  229. // mMediaPlayer.setLooping(false); // 不循环播放
  230. // }
  231. // mMediaPlayer.start(); // 开始播放
  232. /**
  233. * 文件过滤器
  234. *
  235. * @author Louisa.Smart
  236. *
  237. */
  238. class MusicFilter implements FilenameFilter {
  239. @Override
  240. public boolean accept(File dir, String filename) {
  241. // TODO Auto-generated method stub
  242. return (filename.endsWith(".mp3"));
  243. }
  244. }
  245. /**
  246. * 播放列表
  247. */
  248. public void MusicList() {
  249. try {
  250. File home = new File(PATH);
  251. File[] f = home.listFiles(new MusicFilter());
  252. if (f.length > 0) {
  253. for (int i = 0; i < f.length; i++) {
  254. File file = f[i];
  255. MusicList.add(file.getName().toString());
  256. }
  257. ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
  258. android.R.layout.simple_list_item_1, MusicList);
  259. ListView.setAdapter(adapter);
  260. }
  261. } catch (Exception ex) {
  262. this.ShowDialog("显示音乐列表异常:" + ex.getMessage());
  263. }
  264. }
  265. public void ShowDialog(String str) {
  266. new AlertDialog.Builder(this).setTitle("提示").setMessage(str)
  267. .setPositiveButton("OK", new DialogInterface.OnClickListener() {
  268. @Override
  269. public void onClick(DialogInterface dialog, int which) {
  270. }
  271. }).show();
  272. }
  273. @Override
  274. public void run() {
  275. // TODO Auto-generated method stub
  276. while (true) {
  277. try {
  278. if (isauto) {
  279. int n = MediaPlayer.getCurrentPosition();
  280. Message msg = new Message();
  281. msg.what = n;
  282. handler.sendMessage(msg);
  283. }
  284. Thread.sleep(100);
  285. } catch (Exception ex) {
  286. ex.printStackTrace();
  287. }
  288. }
  289. }
  290. public Handler handler = new Handler() {
  291. public void handleMessage(Message msg) {
  292. super.handleMessage(msg);
  293. SeekBar.setProgress(msg.what);
  294. SeekBar.invalidate();
  295. }
  296. };
  297. }

run as android application 的时候请选择有sdcard 支持的模拟器,若放在真机里运行,请先确定设备是否是root 权限。

截图如下所示:

MediaPlayer 之音乐循环播放器相关推荐

  1. 低仿网易云音乐音频播放器!自动获取歌曲封面,并旋转

    这个是实习的时候做的了,当时看了半本第一行代码就去上班,Java 都没学过,最后实习走的时候还做了挺多东西,这个音频播放器就是其一,现在写个博客纪念一下上班两年了,虽然还是菜狗程序员! 前言 实习的时 ...

  2. html在线音频播放器实训总结,HTML5音乐列表播放器SMusic开发总结

    前段时间写过一篇介绍简单音乐播放器效果开发的博文<为你的博客添加简单的CSS3音乐播放器>,实现了单曲循环播放效果,这个效果也是我的博客首页一直有的效果,同时文中也介绍了一些简单的HTML ...

  3. 【Python】音乐可视化播放器(PyQt5 + matplotlib.animation)

    前言 最近同学有个作业,做音乐可视化播放器,为了学习PyQt,我就尝试做了做.该设计主要分为音乐播放器和可视化两部分.两部分单独做相对于结合在一起容易很多,结合的过程遇到了很多麻烦. 音乐播放器: 采 ...

  4. 解决Chrome浏览器打开虾米音乐网页播放器时的排版问题

    2019独角兽企业重金招聘Python工程师标准>>> 几年了,虾米音乐网页播放器听音乐都有个纠结的地方,就是用Chrome浏览器打开时,排版会出错,表现为播放器右边一部分显示不出来 ...

  5. Python 实现图片轮播及音乐循环播放

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/enland_lan/article/d ...

  6. android第三方开源音频播放器,Android第三方开源SeekBarCompat:音乐类播放器等APP进度条常用...

     Android第三方开源SeekBarCompat:音乐类播放器等APP进度条常用 Android平台原生的SeekBar设计简单,然而,比如现在流行的一些音乐播放器的播放进度控制条,如果直接使 ...

  7. MediaPlayer 之简易音频播放器

    应当随时学习,学习一切:应当集中全力,以求知道更多,知道一切. 目录结构 1. 前言 2. MediaPlayer介绍 3. MediaPlayer 实战 3.1 简易音频播放器 第一步:布局设置 第 ...

  8. 网易云音乐——歌曲播放器页面

    网易云音乐--歌曲播放器页面 git地址 https://gitee.com/chen-haibin799/netease-cloud-music.git 实现步骤 效果图 1.实现顶部导航栏 这个写 ...

  9. android图片本地播放器下载,安卓音乐照片播放器

    音乐照片播放器app是一个给力的图像工具,可以提供非常好用的幻灯片播放功能,同时还有超级享受的相册图库应用功能,音乐照片播放器app在西西软件园下载之后,你绝对不会后悔的. 功能介绍 用户通过软件可以 ...

最新文章

  1. 洛谷P4705 玩游戏(生成函数+多项式运算)
  2. Unsupervised Feature Selection in Signed Social Networks 阅读笔记
  3. VC6.0:“Setup was unable to create a DCOM user account“的解决方案
  4. MYSQL 分析表、检查表和优化表
  5. Apache版本兼容性问题
  6. 安装CUDA时出现黑屏的现象解决办法
  7. 你还在 Docker 中跑 MySQL?恭喜你,好下岗了!
  8. 复变函数在计算机科学中的应用,051复变函数与实变函数
  9. 超级搜索术3-吸收应用/一键直达
  10. blockquote
  11. 一卡通(M1卡)破解过程记录——准备篇
  12. canvas下雪效果(原生js)
  13. 漫画:位运算技巧整理汇总+一道被嫌弃的题目
  14. 复合型人才八种能力_我国一流大学人才培养目标的特点与问题
  15. HP-UX Samba服务配置手册
  16. win7怎么更换锁屏壁纸
  17. 软件架构师 第一部分 基础篇 第四章 识别架构特性
  18. Immersionbar学习笔记
  19. BUUCTF~Misc~Test3
  20. Excel函数VLOOKUP常用方法

热门文章

  1. MATLAB 2008a 激活成功后还要激活(许可证过期)
  2. 3dmax第二次安装遇到的问题及解决方案
  3. Java堆排序(大顶堆小顶堆及应用实例)
  4. MCS-51系列单片机指令系统分类
  5. 氢气球飞行位置的预测
  6. UltraISO 创建的虚拟光驱盘符 G 更改为 H
  7. 三款破解PHP加密程序工具软件
  8. 【华为OD机试】答疑 + 注意事项
  9. 超简单的React项目打包后部署到服务器上
  10. 视频文件 wrf格式,可以通过WRF格式视频转换器_wrf转成wmv 转换成 wmv格式,可以在电脑或手机上观看,且声音也能转换过来。之前wrf用耳机貌似播放不出来,之后是可以播放出来的。