android开发之MediaPlayer+Service MP3播放器

http://blog.csdn.net/zzy916853616/article/details/6450753

[java] view
plain
copy

  1. import java.io.File;

  2. import java.io.FilenameFilter;

  3. import java.util.ArrayList;

  4. import java.util.List;
  5. import android.app.ListActivity;

  6. import android.apps.service.PlayerService;

  7. import android.content.Intent;

  8. import android.media.AudioManager;

  9. import android.os.Bundle;

  10. import android.view.View;

  11. import android.view.View.OnClickListener;

  12. import android.widget.ArrayAdapter;

  13. import android.widget.Button;

  14. import android.widget.SeekBar;

  15. import android.widget.Toast;
  16. public class TestMediaPlayer extends ListActivity {

  17. /* 前段时间刚学习Android时就觉得MediaPlayer是个很神奇的东西,就试着做了个简单的音乐播放器。

  18. * 支持后台播放、进度条拖放、音量控制、读取sdCard音乐文件进行播放等。

  19. * */

  20. private Button playButton = null;

  21. private Button mFrontButton = null;

  22. private Button mLastButton = null;

  23. private Button exit = null;

  24. /* 声明音量管理器 */

  25. private AudioManager mAudioManager = null;
  26. /* 定义进度条 */

  27. public static SeekBar audioSeekBar = null;
  28. /* 定义音量大小 */

  29. private SeekBar audioVolume = null;
  30. /* 定于一个数据播放列表,用来存放从指定文件中搜索到的文件 */

  31. public static List<String> mMusicList = new ArrayList<String>();
  32. /* 定义音乐存放路径 */

  33. //  private static final String MUSIC_PATH = new String("/mnt/sdcard/"); //android 2.2

  34. private static final String MUSIC_PATH = new String("/sdcard/");//android 2.1

  35. /* 定义在播放列表中的当前选择项 */

  36. public static int currentListItme = 0;
  37. @Override

  38. public void onCreate(Bundle savedInstanceState) {

  39. super.onCreate(savedInstanceState);

  40. setContentView(R.layout.main);

  41. /* 更新列表 */

  42. musicList();

  43. /* 得到控件 */

  44. playButton = (Button) findViewById(R.id.StartMusic);

  45. mFrontButton = (Button) findViewById(R.id.FrontButton);

  46. mLastButton = (Button) findViewById(R.id.LastMusic);

  47. audioVolume = (SeekBar) findViewById(R.id.audioVolume);

  48. exit = (Button)findViewById(R.id.exit);

  49. audioSeekBar = (SeekBar) findViewById(R.id.seekbar01);

  50. /* 播放、暂停监听 */

  51. playButton.setOnClickListener(new OnClickListener() {
  52. @Override

  53. public void onClick(View v) {
  54. playMusic(AppConstant.PlayerMag.PAUSE);

  55. }

  56. });

  57. /* 监听下一首 */

  58. mFrontButton.setOnClickListener(new OnClickListener() {
  59. @Override

  60. public void onClick(View v) {

  61. nextMusic();

  62. }

  63. });

  64. /* 监听上一首 */

  65. mLastButton.setOnClickListener(new View.OnClickListener() {
  66. @Override

  67. public void onClick(View v) {

  68. FrontMusic();

  69. }

  70. });

  71. /*退出监听*/

  72. exit.setOnClickListener(new OnClickListener() {
  73. @Override

  74. public void onClick(View v) {

  75. Intent intent = new Intent();

  76. intent.setClass(TestMediaPlayer.this, PlayerService.class);

  77. stopService(intent);//停止Service

  78. try {

  79. TestMediaPlayer.this.finish();//关闭当前Activity

  80. } catch (Throwable e) {

  81. e.printStackTrace();

  82. }
  83. }

  84. });

  85. /* 播放进度监听 */

  86. audioSeekBar.setOnSeekBarChangeListener(new SeekBarChangeEvent());

  87. /*退出后再次进去程序时,进度条保持持续更新*/

  88. if(PlayerService.mMediaPlayer!=null){

  89. //设置进度条最大值

  90. TestMediaPlayer.audioSeekBar.setMax(PlayerService.mMediaPlayer.getDuration());

  91. audioSeekBar.setProgress(PlayerService.mMediaPlayer.getCurrentPosition());

  92. }
  93. /* 得到当前音量对象 */

  94. mAudioManager = (AudioManager) getSystemService(AUDIO_SERVICE);

  95. /* 把当前音量值赋给进度条 */

  96. audioVolume.setProgress(mAudioManager

  97. .getStreamVolume(AudioManager.STREAM_MUSIC));

  98. /* 监听音量 */

  99. audioVolume.setOnSeekBarChangeListener(new AudioVolumeChangeEvent());

  100. }
  101. public void playMusic(int action) {

  102. Intent intent = new Intent();

  103. intent.putExtra("MSG", action);

  104. intent.setClass(TestMediaPlayer.this, PlayerService.class);
  105. /* 启动service service要在AndroidManifest.xml注册如:<service></service>*/
  106. startService(intent);

  107. }
  108. /* 检测sdcard MP3文件并加入到List列表 */

  109. public void musicList() {

  110. // 先清除list中的缓存

  111. mMusicList.clear();

  112. /* 从指定的路径中读取文件,并与播放列表关联 */

  113. File home = new File(MUSIC_PATH);
  114. System.out.println(home.canRead());

  115. /* 读取指定类型的文件,在本程序,指定播放类型为mp3 */

  116. if (home.listFiles(new MusicFilter()).length > 0) {

  117. /* 读取文件 */

  118. for (File file : home.listFiles(new MusicFilter())) {

  119. mMusicList.add(file.getName());

  120. }

  121. /* 播放文件与播放列表关联 */

  122. ArrayAdapter<String> musicList = new ArrayAdapter<String>(

  123. TestMediaPlayer.this, R.layout.musictime, mMusicList);

  124. setListAdapter(musicList);

  125. }

  126. }
  127. /* 音量监听 */

  128. class AudioVolumeChangeEvent implements SeekBar.OnSeekBarChangeListener {
  129. @Override

  130. public void onProgressChanged(SeekBar seekBar, int progress,

  131. boolean fromUser) {
  132. // mAudioManager.adjustVolume(AudioManager.ADJUST_LOWER, 0);

  133. mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress,

  134. 0);
  135. }
  136. @Override

  137. public void onStartTrackingTouch(SeekBar seekBar) {

  138. }
  139. @Override

  140. public void onStopTrackingTouch(SeekBar seekBar) {

  141. }
  142. }
  143. /* 音乐选择监听 */

  144. @Override

  145. protected void onListItemClick(android.widget.ListView l, View v,

  146. int position, long id) {

  147. super.onListItemClick(l, v, position, id);

  148. currentListItme = position;

  149. playMusic(AppConstant.PlayerMag.PLAY_MAG);

  150. }
  151. /* 播放下一首 */

  152. private void nextMusic() {

  153. if (++currentListItme >= mMusicList.size()) {

  154. Toast.makeText(TestMediaPlayer.this, "已到最后一首歌曲", Toast.LENGTH_SHORT)

  155. .show();

  156. currentListItme = mMusicList.size() - 1;

  157. } else {

  158. playMusic(AppConstant.PlayerMag.PLAY_MAG);

  159. }

  160. }
  161. /* 播放上一首歌曲 */

  162. private void FrontMusic() {

  163. if (--currentListItme >= 0) {

  164. playMusic(AppConstant.PlayerMag.PLAY_MAG);
  165. } else {

  166. Toast.makeText(TestMediaPlayer.this, "已到第一首歌曲", Toast.LENGTH_SHORT)

  167. .show();

  168. currentListItme = 0;

  169. }

  170. }

  171. }
  172. /* 播放文件选择类 */

  173. class MusicFilter implements FilenameFilter {

  174. public boolean accept(File dir, String name) {

  175. /* 指定扩展名类型 ,可以加其他的音乐格式*/

  176. return (name.endsWith(".mp3"));

  177. }

  178. }
  179. /* 拖放进度监听 ,别忘了Service里面还有个进度条刷新*/

  180. class SeekBarChangeEvent implements SeekBar.OnSeekBarChangeListener {
  181. @Override

  182. public void onProgressChanged(SeekBar seekBar, int progress,

  183. boolean fromUser) {

  184. /*假设改变源于用户拖动*/

  185. if (fromUser) {

  186. PlayerService.mMediaPlayer.seekTo(progress);// 当进度条的值改变时,音乐播放器从新的位置开始播放

  187. }

  188. }
  189. @Override

  190. public void onStartTrackingTouch(SeekBar seekBar) {

  191. PlayerService.mMediaPlayer.pause(); // 开始拖动进度条时,音乐暂停播放

  192. }
  193. @Override

  194. public void onStopTrackingTouch(SeekBar seekBar) {

  195. PlayerService.mMediaPlayer.start(); // 停止拖动进度条时,音乐开始播放

  196. }

  197. }

service类

首先建议不要把播放音乐放在Activity中,因为关闭Activity后就不能实现后台播放。所以播放音乐要放在Service中,我们只需要管理Activity与Service间的通信就好了。下面就是个Service类。直接看注释和代码:

[java] view
plain
copy

  1. package android.apps.service;
  2. import java.io.IOException;
  3. import android.app.Service;

  4. import android.content.Intent;

  5. import android.media.MediaPlayer;

  6. import android.net.Uri;

  7. import android.os.IBinder;

  8. import android.widget.Toast;
  9. import android.apps.*;
  10. public class PlayerService extends Service implements Runnable,

  11. MediaPlayer.OnCompletionListener {

  12. /* 定于一个多媒体对象 */

  13. public static MediaPlayer mMediaPlayer = null;

  14. // 是否单曲循环

  15. private static boolean isLoop = false;

  16. // 用户操作

  17. private int MSG;
  18. /* 定义要播放的文件夹路径 */

  19. private static final String MUSIC_PATH = new String("/sdcard/");
  20. @Override

  21. public IBinder onBind(Intent intent) {

  22. return null;// 这里的绑定没的用,上篇我贴出了如何将activity与service绑定的代码

  23. }
  24. @Override

  25. public void onCreate() {

  26. super.onCreate();

  27. if (mMediaPlayer != null) {

  28. mMediaPlayer.reset();

  29. mMediaPlayer.release();

  30. mMediaPlayer = null;

  31. }

  32. mMediaPlayer = new MediaPlayer();

  33. /* 监听播放是否完成 */

  34. mMediaPlayer.setOnCompletionListener(this);

  35. }
  36. @Override

  37. public void onDestroy() {

  38. super.onDestroy();
  39. if (mMediaPlayer != null) {

  40. mMediaPlayer.stop();

  41. mMediaPlayer.release();

  42. mMediaPlayer = null;

  43. }
  44. System.out.println("service onDestroy");

  45. }

  46. /*启动service时执行的方法*/

  47. @Override

  48. public int onStartCommand(Intent intent, int flags, int startId) {

  49. /*得到从startService传来的动作,后是默认参数,这里是我自定义的常量*/

  50. MSG = intent.getIntExtra("MSG", AppConstant.PlayerMag.PLAY_MAG);

  51. if (MSG == AppConstant.PlayerMag.PLAY_MAG) {

  52. playMusic();

  53. }

  54. if (MSG == AppConstant.PlayerMag.PAUSE) {

  55. if (mMediaPlayer.isPlaying()) {// 正在播放

  56. mMediaPlayer.pause();// 暂停

  57. } else {// 没有播放

  58. mMediaPlayer.start();

  59. }

  60. }
  61. return super.onStartCommand(intent, flags, startId);

  62. }
  63. @SuppressWarnings("static-access")

  64. public void playMusic() {

  65. try {

  66. /* 重置多媒体 */

  67. mMediaPlayer.reset();

  68. /* 读取mp3文件 */

  69. mMediaPlayer.setDataSource(MUSIC_PATH+TestMediaPlayer.mMusicList.get(TestMediaPlayer.currentListItme));

  70. //          Uri uri = Uri.parse(MUSIC_PATH+TestMediaPlayer.mMusicList.get(TestMediaPlayer.currentListItme));

  71. //

  72. //          mMediaPlayer.create(PlayerService.this,uri);

  73. /* 准备播放 */

  74. mMediaPlayer.prepare();

  75. /* 开始播放 */

  76. mMediaPlayer.start();

  77. /* 是否单曲循环 */

  78. mMediaPlayer.setLooping(isLoop);

  79. // 设置进度条最大值

  80. TestMediaPlayer.audioSeekBar.setMax(PlayerService.mMediaPlayer

  81. .getDuration());

  82. new Thread(this).start();

  83. } catch (IOException e) {

  84. }
  85. }
  86. // 刷新进度条

  87. @Override

  88. public void run() {

  89. int CurrentPosition = 0;// 设置默认进度条当前位置

  90. int total = mMediaPlayer.getDuration();//

  91. while (mMediaPlayer != null && CurrentPosition < total) {

  92. try {

  93. Thread.sleep(1000);

  94. if (mMediaPlayer != null) {

  95. CurrentPosition = mMediaPlayer.getCurrentPosition();

  96. }

  97. } catch (InterruptedException e) {

  98. e.printStackTrace();

  99. }

  100. TestMediaPlayer.audioSeekBar.setProgress(CurrentPosition);

  101. }
  102. }
  103. @Override

  104. public void onCompletion(MediaPlayer mp) {

  105. /* 播放完当前歌曲,自动播放下一首 */
  106. if (++TestMediaPlayer.currentListItme >= TestMediaPlayer.mMusicList

  107. .size()) {

  108. Toast.makeText(PlayerService.this, "已到最后一首歌曲", Toast.LENGTH_SHORT)

  109. .show();

  110. TestMediaPlayer.currentListItme--;

  111. TestMediaPlayer.audioSeekBar.setMax(0);

  112. } else {

  113. playMusic();

  114. }

  115. }

  116. }

参数封装

[java] view
plain
copy

  1. /**

  2. * @把参数这样封装易于管理和阅读

  3. *

  4. */

  5. public interface AppConstant {

  6. public class PlayerMag{

  7. public static final int PLAY_MAG=1;//开始播放

  8. public static final int PAUSE=2;//暂停播放

  9. }

  10. }

详细代码下载:http://download.csdn.net/source/3318587

android开发之MediaPlayer+Service MP3播放器,布布扣,bubuko.com

时间: 2024-10-27 06:06:32

android开发之MediaPlayer+Service MP3播放器的相关文章

Android开发之MediaPlayer和SurfaceView播放视频

使用MediaPlayer出了了可以播放音频之外,还可以播放视频文件,只不过使用MediaPlayer播放视频时,没有提供图像输出界面.可以使用SurfaceView组件来显示视频图像.使用MediaPlayer和SurfaceView播放视频大致可以分为如下四个步骤: 1)定义SurfaceView组件.最好在布局文件中实现. 2)创建MediaPlayer对象,并为其加载要播放的视频. 3)将所播放的视频画面输出到SurfaceView中.使用MediaPlayer对象的setDisplay

Android开发之AudioManager(音频管理器)详解

AudioManager简介: AudioManager类提供了访问音量和振铃器mode控制.使用Context.getSystemService(Context.AUDIO_SERVICE)来得到这个类的一个实例. 公有方法: Public Methods int abandonAudioFocus(AudioManager.OnAudioFocusChangeListenerl) 放弃音频的焦点. void adjustStreamVolume(int streamType, int dir

Android开发之Mediaplayer

Android提供了常见的音频.视频的编码.解码机制.借助于多媒体类MediaPlayer的支持,开发者能够非常方便在在应用中播放音频.视频.本篇博客主要解说在Android平台下怎样播放一个音频文件. 本篇博客主要内容例如以下: MediaPlayer MediaPlayer的音频源 使用MediaPlayer播放音乐 MediaPlayer使用技巧 Demo--一个简单的MP3播放器 MediaPlayer 上面提到过,Android下对于音频.视频的支持均须要使用到MediaPlayer,

Android开发之Mediaplayer状态转换图及音频焦点

前言 之前博客里已经将了MediaPlayer的简单应用,如何使用MediaPlayer在Android应用中播放音频.这篇博客在MediaPlayer使用的基础上,讲解一下MediaPlayer的一些高级功能的使用,以及它的状态转换.对MediaPlayer还不了解的朋友可以先看看之前那篇博客:Android--MP3播放器MediaPlayer. 本篇博客主要内容如下: MediaPlayer的状态变换 MediaPlayer的唤醒锁 MediaPlayer的音频焦点 MediaPlayer

Android开发之AudioManager(音频管理器)具体解释

AudioManager简单介绍: AudioManager类提供了訪问音量和振铃器mode控制. 使用Context.getSystemService(Context.AUDIO_SERVICE)来得到这个类的一个实例. 公有方法: Public Methods int abandonAudioFocus(AudioManager.OnAudioFocusChangeListenerl) 放弃音频的焦点. void adjustStreamVolume(int streamType, int

Android练习项目 Mp3播放器实现(一)

对于Android的学习,需要掌握的东西有点多,需要我们认真,小心,不断的进取.前天突然有个想法,觉得Mp3播放器是一个可以练习的项目,于是在网上搜了下,发现有人已经写了博客,看了他们的博客后,我觉得他们说的一点很对,Mp3播放器基本用到了Android里面的许多知识点,做完这个过后,可能对于Android整个架构有了一定了解,我于是也想尝试下,于是准备边做,编写博客,来记录自己开发的过程,这个也许叫作项目开发日志吧. 第一个我的想法是先做:本地音乐播放器. 于是我用了个粗浅的方法来加载mp3文

Android练习项目 Mp3播放器实现(二)

在经过几天的折腾之后,迎来了Mp3播放器的第二篇博客,这篇文章主要将如何实现播放器的播放,下一首,上一首,顺序播放,循环播放,随机播放,单曲循环等操作. 其实操作的过程中主要是通过参数的传递来实现功能的. 在activity里面互相传参有很多中方法,但对于activity和service进行交互有些方法并不适合,通过对Broadcast和BroadcastReceiver等操作,来控制播放的实现. 我们先设定好广播,然后通过发送信号来进行传递数据. 主要在activity里面动态注册广播,通过传

Android开发---MediaPlayer简单音乐播放器

Android开发-MediaPlayer简单音乐播放器 功能介绍 实现一个简单的播放器,类似网易云音乐形式,功能包括: 播放.暂停,停止,退出功能: 后台播放功能: 进度条显示播放进度.拖动进度条改变进度功能: 播放时图片旋转,显示当前播放时间功能: 界面样式 功能实现 1. MediaPlayer的实现 MediaPlayer常用方法介绍 MediaPlayer的实现包括初始化MediaPlayer,MediaPlayer的功能实现,包括播放.暂停.停止.离开等,具体细节如下: MediaP

【Android】利用安卓的数据接口、多媒体处理编写内存卡Mp3播放器app

通过调用安卓的MediaPlayer可以直接完成Mp3等主流音频的播放,同时利用ContentResolver与Cursor可以直接读取安卓内在数据库的信息,直接获取当前sdcard中所有音频的列表,无须像<[Android]内存卡图片读取器,图库app>(点击打开链接)一样利用原始的Java代码去遍历整个sdcard卡,直接调用安卓固有的类既便捷又快速.最后,读取出来的Mp3可以通过适配器直接加载到ListView列表,做出如下所示的内存卡Mp3播放器app效果.本app在自己的真实的16G