需求1:将内存卡中的MP3音乐读取出来并显示到列表当中

1.   从数据库中查询所有音乐数据,保存到List集合当中,List当中存放的是Mp3Info对象
2.   迭代List集合,把每一个Mp3Info对象的所有属性,保存到Map对象当中
3.   定义一个List集合,把Map对象添加到List集合当中
4.   通过定义一个SimpleAdpter,调用setAdpter方法,将数据显示到列表当中
  1. /**
  2. * 用于从数据库中查询歌曲的信息,保存在List当中
  3. *
  4. * @return
  5. */
  6. public List<Mp3Info> getMp3Infos() {
  7. Cursor cursor = getContentResolver().query(
  8. MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,
  9. MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
  10. List<Mp3Info> mp3Infos = new ArrayList<Mp3Info>();
  11. for (int i = 0; i < cursor.getCount(); i++) {
  12. Mp3Info mp3Info = new Mp3Info();
  13. cursor.moveToNext();
  14. long id = cursor.getLong(cursor
  15. .getColumnIndex(MediaStore.Audio.Media._ID));   //音乐id
  16. String title = cursor.getString((cursor
  17. .getColumnIndex(MediaStore.Audio.Media.TITLE)));//音乐标题
  18. String artist = cursor.getString(cursor
  19. .getColumnIndex(MediaStore.Audio.Media.ARTIST));//艺术家
  20. long duration = cursor.getLong(cursor
  21. .getColumnIndex(MediaStore.Audio.Media.DURATION));//时长
  22. long size = cursor.getLong(cursor
  23. .getColumnIndex(MediaStore.Audio.Media.SIZE));  //文件大小
  24. String url = cursor.getString(cursor
  25. .getColumnIndex(MediaStore.Audio.Media.DATA));              //文件路径
  26. int isMusic = cursor.getInt(cursor
  27. .getColumnIndex(MediaStore.Audio.Media.IS_MUSIC));//是否为音乐
  28. if (isMusic != 0) {     //只把音乐添加到集合当中
  29. mp3Info.setId(id);
  30. mp3Info.setTitle(title);
  31. mp3Info.setArtist(artist);
  32. mp3Info.setDuration(duration);
  33. mp3Info.setSize(size);
  34. mp3Info.setUrl(url);
  35. mp3Infos.add(mp3Info);
  36. }
  37. }
  38. return mp3Infos;
  39. }
  1. /**
  2. * 填充列表
  3. * @param mp3Infos
  4. */
  5. public void setListAdpter(List<Mp3Info> mp3Infos) {
  6. List<HashMap<String, String>> mp3list = new ArrayList<HashMap<String, String>>();
  7. for (Iterator iterator = mp3Infos.iterator(); iterator.hasNext();) {
  8. Mp3Info mp3Info = (Mp3Info) iterator.next();
  9. HashMap<String, String> map = new HashMap<String, String>();
  10. map.put("title", mp3Info.getTitle());
  11. map.put("Artist", mp3Info.getArtist());
  12. map.put("duration", String.valueOf(mp3Info.getDuration()));
  13. map.put("size", String.valueOf(mp3Info.getSize()));
  14. map.put("url", mp3Info.getUrl());
  15. mp3list.add(map);
  16. }
  17. mAdapter = new SimpleAdapter(this, mp3list,
  18. R.layout.music_list_item_layout, new String[] { "title", "Artist", "duration" },
  19. new int[] { R.id.music_title, R.id.music_Artist, R.id.music_duration });
  20. mMusiclist.setAdapter(mAdapter);
  21. }

实现效果如图:

需求2:点击列表的每一项,启动一个服务来播放音乐

1.   注册条目点击监听器OnItemClickListener

2.   定义一个实现OnItemClickListener接口的内部类

3.   定义一个继承Service的服务类PlayerServie

1.   注册条目点击监听器OnItemClickListener

  1. mMusiclist = (ListView) findViewById(R.id.music_list);
  2. mMusiclist.setOnItemClickListener(new MusicListItemClickListener());
  3. mp3Infos = getMp3Infos();
  4. setListAdpter(getMp3Infos());

2.   定义一个实现OnItemClickListener接口的内部类

  1. private class MusicListItemClickListener implements OnItemClickListener {
  2. @Override
  3. public void onItemClick(AdapterView<?> parent, View view, int position,
  4. long id) {
  5. if(mp3Infos != null) {
  6. Mp3Info mp3Info = mp3Infos.get(position);
  7. Log.d("mp3Info-->", mp3Info.toString());
  8. Intent intent = new Intent();
  9. intent.putExtra("url", mp3Info.getUrl());
  10. intent.putExtra("MSG", AppConstant.PlayerMsg.PLAY_MSG);
  11. intent.setClass(MainActivity.this, PlayerService.class);
  12. startService(intent);       //启动服务
  13. }
  14. }
  15. }

3.   定义一个继承Service的服务类PlayerServie(未完善的Service类)

  1. package com.wwj.sb.service;
  2. import android.annotation.SuppressLint;
  3. import android.app.Service;
  4. import android.content.Intent;
  5. import android.media.MediaPlayer;
  6. import android.media.MediaPlayer.OnPreparedListener;
  7. import android.os.IBinder;
  8. import com.wwj.sb.domain.AppConstant;
  9. @SuppressLint("NewApi")
  10. public class PlayerService extends Service {
  11. private MediaPlayer mediaPlayer =  new MediaPlayer();       //媒体播放器对象
  12. private String path;                        //音乐文件路径
  13. private boolean isPause;                    //暂停状态
  14. @Override
  15. public IBinder onBind(Intent arg0) {
  16. return null;
  17. }
  18. @Override
  19. public int onStartCommand(Intent intent, int flags, int startId) {
  20. if(mediaPlayer.isPlaying()) {
  21. stop();
  22. }
  23. path = intent.getStringExtra("url");
  24. int msg = intent.getIntExtra("MSG", 0);
  25. if(msg == AppConstant.PlayerMsg.PLAY_MSG) {
  26. play(0);
  27. } else if(msg == AppConstant.PlayerMsg.PAUSE_MSG) {
  28. pause();
  29. } else if(msg == AppConstant.PlayerMsg.STOP_MSG) {
  30. stop();
  31. }
  32. return super.onStartCommand(intent, flags, startId);
  33. }
  34. /**
  35. * 播放音乐
  36. * @param position
  37. */
  38. private void play(int position) {
  39. try {
  40. mediaPlayer.reset();//把各项参数恢复到初始状态
  41. mediaPlayer.setDataSource(path);
  42. mediaPlayer.prepare();  //进行缓冲
  43. mediaPlayer.setOnPreparedListener(new PreparedListener(position));//注册一个监听器
  44. }
  45. catch (Exception e) {
  46. e.printStackTrace();
  47. }
  48. }
  49. /**
  50. * 暂停音乐
  51. */
  52. private void pause() {
  53. if (mediaPlayer != null && mediaPlayer.isPlaying()) {
  54. mediaPlayer.pause();
  55. isPause = true;
  56. }
  57. }
  58. /**
  59. * 停止音乐
  60. */
  61. private void stop(){
  62. if(mediaPlayer != null) {
  63. mediaPlayer.stop();
  64. try {
  65. mediaPlayer.prepare(); // 在调用stop后如果需要再次通过start进行播放,需要之前调用prepare函数
  66. } catch (Exception e) {
  67. e.printStackTrace();
  68. }
  69. }
  70. }
  71. @Override
  72. public void onDestroy() {
  73. if(mediaPlayer != null){
  74. mediaPlayer.stop();
  75. mediaPlayer.release();
  76. }
  77. }
  78. /**
  79. *
  80. * 实现一个OnPrepareLister接口,当音乐准备好的时候开始播放
  81. *
  82. */
  83. private final class PreparedListener implements OnPreparedListener {
  84. private int positon;
  85. public PreparedListener(int positon) {
  86. this.positon = positon;
  87. }
  88. @Override
  89. public void onPrepared(MediaPlayer mp) {
  90. mediaPlayer.start();    //开始播放
  91. if(positon > 0) {    //如果音乐不是从头播放
  92. mediaPlayer.seekTo(positon);
  93. }
  94. }
  95. }
  96. }

public class MusicActivity extends Activity {
private boolean isStop = false;
private MediaPlayer mPlayer;
public final String TITLE = Environment.getExternalStorageDirectory()
+ "/iwantyourlove.mp3";

private File file;

private SeekBar seekBar;
private ImageView play;
private TextView title;

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.music_main);

initWidgets();

}

// 重新初始化播放器
public void initWidgets() {
play = (ImageView) findViewById(R.id.img_stop);
title = (TextView) findViewById(R.id.title);
seekBar = (SeekBar) findViewById(R.id.seek);

seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

@Override
public void onStopTrackingTouch(SeekBar seekBar) {
//seekBar.setProgress(mPlayer.getCurrentPosition() *seekBar.getMax() / total);
//Log.i("sss", seekBar.getProgress()+"");
//mPlayer.seekTo(mPlayer.getCurrentPosition());
mPlayer.seekTo(seekBar.getProgress() * mPlayer.getDuration() /100 );
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// Log.i("progress", ""+progress);
// Log.i("qqq", seekBar.getProgress()+"");
// progress = currentPosition * 100 / duration;

//progress*duration/100
//mPlayer.seekTo(progress * mPlayer.getDuration() /100 );
}
});

file = new File(TITLE);

title.setText(file.getName());

mPlayer = new MediaPlayer();
try {
mPlayer.setDataSource(TITLE);
mPlayer.prepare();
} catch (Exception e) {
e.printStackTrace();
}
}

public void play(View v) {
if (!mPlayer.isPlaying()) {
mPlayer.start();
}
}

public void pause(View v) {
if (mPlayer.isPlaying()) {
mPlayer.pause();
}
}

public void replay(View v) {
mPlayer.reset();
initWidgets();// 重新构建播放器
// mPlayer.start();
play(v);
}

public void stop(View v) {
isStop = true;
mPlayer.stop();

play.setImageResource(R.drawable.player_play);
}

// 用图片代替按钮
public void playOrPause(View v) {
if (isStop) {// 停止后重新开始播放
mPlayer.reset();
initWidgets();
mPlayer.start();
play.setImageResource(R.drawable.player_pause);
isStop = false;
} else if (mPlayer.isPlaying()) {// 播放状态
play.setImageResource(R.drawable.player_play);
mPlayer.pause();
} else {// 暂停状态
play.setImageResource(R.drawable.player_pause);
mPlayer.start();
}

// 异步任务
new MusicTask().execute();
}

@Override
protected void onDestroy() {
super.onDestroy();
// 释放资源
mPlayer.release();
}

// 音乐播放异步任务
class MusicTask extends AsyncTask<Void, Void, Void> {
//int current = mPlayer.getCurrentPosition();// 当前播放是什么位置,
int total = mPlayer.getDuration(); // 音乐总共多长时间

@Override
protected Void doInBackground(Void... params) {
// 让SeekBar跟着音乐一起向右边走
while (mPlayer.getCurrentPosition() <= total&&!isStop) { //!isPause不是停止状态
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
publishProgress();
}
return null;
}

@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
// Log.i("msg", ""+mPlayer.getCurrentPosition() * 100 / total);
seekBar.setProgress(mPlayer.getCurrentPosition() *seekBar.getMax() / total);
}

@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
}
}
}

Android应用开发--MP3音乐播放器代码实现(一)的更多相关文章

  1. Flex4/Flash开发在线音乐播放器 , 含演示地址

    要求 必备知识 本文要求基本了解 Adobe Flex编程知识和JAVA基础知识. 开发环境 MyEclipse10/Flash Builder4.6/Flash Player11及以上 演示地址 演 ...

  2. 推荐美丽的flash网页MP3音乐播放器

    文章来源:PHP开发学习门户 地址:http://www.phpthinking.com/archives/491 在网页制作中.假设想在网页中插入mp3音乐来增添网页的互动感,提升用户体验度,这个时 ...

  3. 吴裕雄--天生自然python学习笔记:python 用pygame模块制作 MP3 音乐播放器

    利用 music 对象来制作一个 MP3 音乐播放器 . 应用程序总览 从歌曲清单中选择指定的歌曲,单击“播放”按钮可开始播放, 在播放 xxx 歌曲”的信息. 歌曲播放的过程中,可以暂停.停止,也可 ...

  4. Android开发之音乐播放器的实现

    Android音乐播放器 使用到Android的Actiivity和Service组件 播放音频的代码应该运行在服务中,定义一个播放服务MusicService,服务里定义play.stop.paus ...

  5. Android开发之音乐播放器

    做了一天的音乐播放器小项目,已经上传到github,将链接发到这里供大家参阅提议 https://github.com/wangpeng0531/MusicPlayer.git

  6. Android基于发展Service音乐播放器

    这是一个基于Service组件的音乐播放器,程序的音乐将会由后台的Service组件负责播放,当后台的播放状态改变时,程序将会通过发送广播通知前台Activity更新界面:当用户单击前台Activit ...

  7. python 开发在线音乐播放器-简易版

    在线音乐播放器,使用python的Tkinter库做了一个界面,感觉这个库使用起来还是挺方便的,音乐的数据来自网易云音乐的一个接口,通过urllib.urlopen模块打开网址,使用Json模块进行数 ...

  8. 项目源码--Android类似酷狗音乐播放器

    下载源码 知识技能概要: 1.音乐文件的扫描与管理 2.音频流的解码 3. UI控件的综合使用 4.播放列表方式管理 5.随机播放方式 6.源码带详细的中文注释 ...... 详细介绍 1. 音乐文件 ...

  9. Android 仿百度网页音乐播放器圆形图片转圈播放效果

    百度网页音乐播放器的效果  如下 : http://www.baidu.com/baidu?word=%E4%B8%80%E7%9B%B4%E5%BE%88%E5%AE%89%E9%9D%99& ...

随机推荐

  1. 5 Tips for creating good code every day; or how to become a good software developer

    Being a good developer is like being any other good professional, it’s all it’s about doing as much ...

  2. C++ 的语言杂谈(一)--C++不是新手友好的

    C++的语言品味是独特的,喜欢的人特别喜欢,讨厌的人特别讨厌.虽然Bjane Stroustrup不断地宣称C++的发展方向是新手友好的,但实际上对新手来说,最重要的还是有强大方便的标准库可以使用(像 ...

  3. (转载)解决ListView中使用EditText所遇到的一些冲突

    大家都知道在listView中使用editText,在输入过程中是有冲突的.今天稍微研究了一下这个问题,有一点点小小的心得和大家一起分享下. 首先建立一个最简单的demo,主界面就是一个ListVie ...

  4. [Effective JavaScript 笔记]第38条:在子类的构造函数中调用父类的构造函数

    示例 场景类 场景图(scene)是在可视化的过程中(如游戏或图形仿真场景)描述一个场景的对象集合.一个简单的场景包含了在该场景中的所有对象(称角色),以及所有角色的预加载图像数据集,还包含一个底层图 ...

  5. Linux下使用Speedtest测试网速

    导读 Speedtest是用来测试网络性能的开源软件,在Linux下面安装Speedtest可以用来测试网络出口的上传和下载速度,帮助排查网络方面导致的故障. Speedtest介绍 由于公司几个项目 ...

  6. NGUI 粒子显示在上级

    http://bbs.taikr.com/thread-2272-1-1.html [NGUI]3.0+版本,粒子在UI后面显示 -- : 48人阅读 评论() 收藏 举报 [Unity3D][NGU ...

  7. crontab报错

    $mail 选择对应的数字查看邮件 File "/opt/app/python/tv-cms-for-ch/current/scripts/sync_cms_for_ch.py", ...

  8. Python爬虫经验

    有时候读取同一个url,服务器可能会返回不同的response,并不是爬虫程序代码的问题,而是服务器的问题,初次试验request时,最好 把response文本保存在一个txt文件当中,以便后续的比 ...

  9. maven An error occurred while filtering resources

    转自:http://stackoverflow.com/questions/18145774/eclipse-an-error-occurred-while-filtering-resources m ...

  10. spring无法扫描jar包的问题

    在日常开发中往往会对公共的模块打包发布,然后调用公共包的内容.然而,最近对公司的公共模块进行整理发布后.spring却无法扫描到相应的bean.折腾了好久,最终发现是认识上的误区. 2015-11-1 ...