Android应用开发--MP3音乐播放器代码实现(一)
需求1:将内存卡中的MP3音乐读取出来并显示到列表当中
1. 从数据库中查询所有音乐数据,保存到List集合当中,List当中存放的是Mp3Info对象
2. 迭代List集合,把每一个Mp3Info对象的所有属性,保存到Map对象当中
3. 定义一个List集合,把Map对象添加到List集合当中
4. 通过定义一个SimpleAdpter,调用setAdpter方法,将数据显示到列表当中
- /**
- * 用于从数据库中查询歌曲的信息,保存在List当中
- *
- * @return
- */
- public List<Mp3Info> getMp3Infos() {
- Cursor cursor = getContentResolver().query(
- MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,
- MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
- List<Mp3Info> mp3Infos = new ArrayList<Mp3Info>();
- for (int i = 0; i < cursor.getCount(); i++) {
- Mp3Info mp3Info = new Mp3Info();
- cursor.moveToNext();
- long id = cursor.getLong(cursor
- .getColumnIndex(MediaStore.Audio.Media._ID)); //音乐id
- String title = cursor.getString((cursor
- .getColumnIndex(MediaStore.Audio.Media.TITLE)));//音乐标题
- String artist = cursor.getString(cursor
- .getColumnIndex(MediaStore.Audio.Media.ARTIST));//艺术家
- long duration = cursor.getLong(cursor
- .getColumnIndex(MediaStore.Audio.Media.DURATION));//时长
- long size = cursor.getLong(cursor
- .getColumnIndex(MediaStore.Audio.Media.SIZE)); //文件大小
- String url = cursor.getString(cursor
- .getColumnIndex(MediaStore.Audio.Media.DATA)); //文件路径
- int isMusic = cursor.getInt(cursor
- .getColumnIndex(MediaStore.Audio.Media.IS_MUSIC));//是否为音乐
- if (isMusic != 0) { //只把音乐添加到集合当中
- mp3Info.setId(id);
- mp3Info.setTitle(title);
- mp3Info.setArtist(artist);
- mp3Info.setDuration(duration);
- mp3Info.setSize(size);
- mp3Info.setUrl(url);
- mp3Infos.add(mp3Info);
- }
- }
- return mp3Infos;
- }
- /**
- * 填充列表
- * @param mp3Infos
- */
- public void setListAdpter(List<Mp3Info> mp3Infos) {
- List<HashMap<String, String>> mp3list = new ArrayList<HashMap<String, String>>();
- for (Iterator iterator = mp3Infos.iterator(); iterator.hasNext();) {
- Mp3Info mp3Info = (Mp3Info) iterator.next();
- HashMap<String, String> map = new HashMap<String, String>();
- map.put("title", mp3Info.getTitle());
- map.put("Artist", mp3Info.getArtist());
- map.put("duration", String.valueOf(mp3Info.getDuration()));
- map.put("size", String.valueOf(mp3Info.getSize()));
- map.put("url", mp3Info.getUrl());
- mp3list.add(map);
- }
- mAdapter = new SimpleAdapter(this, mp3list,
- R.layout.music_list_item_layout, new String[] { "title", "Artist", "duration" },
- new int[] { R.id.music_title, R.id.music_Artist, R.id.music_duration });
- mMusiclist.setAdapter(mAdapter);
- }
实现效果如图:
需求2:点击列表的每一项,启动一个服务来播放音乐
1. 注册条目点击监听器OnItemClickListener
2. 定义一个实现OnItemClickListener接口的内部类
3. 定义一个继承Service的服务类PlayerServie
1. 注册条目点击监听器OnItemClickListener
- mMusiclist = (ListView) findViewById(R.id.music_list);
- mMusiclist.setOnItemClickListener(new MusicListItemClickListener());
- mp3Infos = getMp3Infos();
- setListAdpter(getMp3Infos());
2. 定义一个实现OnItemClickListener接口的内部类
- private class MusicListItemClickListener implements OnItemClickListener {
- @Override
- public void onItemClick(AdapterView<?> parent, View view, int position,
- long id) {
- if(mp3Infos != null) {
- Mp3Info mp3Info = mp3Infos.get(position);
- Log.d("mp3Info-->", mp3Info.toString());
- Intent intent = new Intent();
- intent.putExtra("url", mp3Info.getUrl());
- intent.putExtra("MSG", AppConstant.PlayerMsg.PLAY_MSG);
- intent.setClass(MainActivity.this, PlayerService.class);
- startService(intent); //启动服务
- }
- }
- }
3. 定义一个继承Service的服务类PlayerServie(未完善的Service类)
- package com.wwj.sb.service;
- import android.annotation.SuppressLint;
- import android.app.Service;
- import android.content.Intent;
- import android.media.MediaPlayer;
- import android.media.MediaPlayer.OnPreparedListener;
- import android.os.IBinder;
- import com.wwj.sb.domain.AppConstant;
- @SuppressLint("NewApi")
- public class PlayerService extends Service {
- private MediaPlayer mediaPlayer = new MediaPlayer(); //媒体播放器对象
- private String path; //音乐文件路径
- private boolean isPause; //暂停状态
- @Override
- public IBinder onBind(Intent arg0) {
- return null;
- }
- @Override
- public int onStartCommand(Intent intent, int flags, int startId) {
- if(mediaPlayer.isPlaying()) {
- stop();
- }
- path = intent.getStringExtra("url");
- int msg = intent.getIntExtra("MSG", 0);
- if(msg == AppConstant.PlayerMsg.PLAY_MSG) {
- play(0);
- } else if(msg == AppConstant.PlayerMsg.PAUSE_MSG) {
- pause();
- } else if(msg == AppConstant.PlayerMsg.STOP_MSG) {
- stop();
- }
- return super.onStartCommand(intent, flags, startId);
- }
- /**
- * 播放音乐
- * @param position
- */
- private void play(int position) {
- try {
- mediaPlayer.reset();//把各项参数恢复到初始状态
- mediaPlayer.setDataSource(path);
- mediaPlayer.prepare(); //进行缓冲
- mediaPlayer.setOnPreparedListener(new PreparedListener(position));//注册一个监听器
- }
- catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- * 暂停音乐
- */
- private void pause() {
- if (mediaPlayer != null && mediaPlayer.isPlaying()) {
- mediaPlayer.pause();
- isPause = true;
- }
- }
- /**
- * 停止音乐
- */
- private void stop(){
- if(mediaPlayer != null) {
- mediaPlayer.stop();
- try {
- mediaPlayer.prepare(); // 在调用stop后如果需要再次通过start进行播放,需要之前调用prepare函数
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- @Override
- public void onDestroy() {
- if(mediaPlayer != null){
- mediaPlayer.stop();
- mediaPlayer.release();
- }
- }
- /**
- *
- * 实现一个OnPrepareLister接口,当音乐准备好的时候开始播放
- *
- */
- private final class PreparedListener implements OnPreparedListener {
- private int positon;
- public PreparedListener(int positon) {
- this.positon = positon;
- }
- @Override
- public void onPrepared(MediaPlayer mp) {
- mediaPlayer.start(); //开始播放
- if(positon > 0) { //如果音乐不是从头播放
- mediaPlayer.seekTo(positon);
- }
- }
- }
- }
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音乐播放器代码实现(一)的更多相关文章
- Flex4/Flash开发在线音乐播放器 , 含演示地址
要求 必备知识 本文要求基本了解 Adobe Flex编程知识和JAVA基础知识. 开发环境 MyEclipse10/Flash Builder4.6/Flash Player11及以上 演示地址 演 ...
- 推荐美丽的flash网页MP3音乐播放器
文章来源:PHP开发学习门户 地址:http://www.phpthinking.com/archives/491 在网页制作中.假设想在网页中插入mp3音乐来增添网页的互动感,提升用户体验度,这个时 ...
- 吴裕雄--天生自然python学习笔记:python 用pygame模块制作 MP3 音乐播放器
利用 music 对象来制作一个 MP3 音乐播放器 . 应用程序总览 从歌曲清单中选择指定的歌曲,单击“播放”按钮可开始播放, 在播放 xxx 歌曲”的信息. 歌曲播放的过程中,可以暂停.停止,也可 ...
- Android开发之音乐播放器的实现
Android音乐播放器 使用到Android的Actiivity和Service组件 播放音频的代码应该运行在服务中,定义一个播放服务MusicService,服务里定义play.stop.paus ...
- Android开发之音乐播放器
做了一天的音乐播放器小项目,已经上传到github,将链接发到这里供大家参阅提议 https://github.com/wangpeng0531/MusicPlayer.git
- Android基于发展Service音乐播放器
这是一个基于Service组件的音乐播放器,程序的音乐将会由后台的Service组件负责播放,当后台的播放状态改变时,程序将会通过发送广播通知前台Activity更新界面:当用户单击前台Activit ...
- python 开发在线音乐播放器-简易版
在线音乐播放器,使用python的Tkinter库做了一个界面,感觉这个库使用起来还是挺方便的,音乐的数据来自网易云音乐的一个接口,通过urllib.urlopen模块打开网址,使用Json模块进行数 ...
- 项目源码--Android类似酷狗音乐播放器
下载源码 知识技能概要: 1.音乐文件的扫描与管理 2.音频流的解码 3. UI控件的综合使用 4.播放列表方式管理 5.随机播放方式 6.源码带详细的中文注释 ...... 详细介绍 1. 音乐文件 ...
- Android 仿百度网页音乐播放器圆形图片转圈播放效果
百度网页音乐播放器的效果 如下 : http://www.baidu.com/baidu?word=%E4%B8%80%E7%9B%B4%E5%BE%88%E5%AE%89%E9%9D%99& ...
随机推荐
- PDP 有多种定义,具体哪一种还需研究!!!!
PDP (用户面进行隧道转发的信息的保存协议) 编辑 本词条缺少名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! 即PDP上下文,保存用户面进行隧道转发的所有信息,包括RNC/GGSN的 ...
- APN APN指一种网络接入技术,是通过手机上网时必须配置的一个参数,它决定了手机通过哪种接入方式来访问网络。
apn 锁定 本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . APN指一种网络接入技术,是通过手机上网时必须配置的一个参数,它决定了手机通过哪种接入方式来访问网络. 对于手机用户来说,可 ...
- margin标记可以带一个、二个、三个、四个参数,各有不同的含义。
margin标记可以带一个.二个.三个.四个参数,各有不同的含义. margin: 20px;(上.下.左.右各20px.) margin: 20px 40px;(上.下20px:左.右40px.) ...
- ACM Computer Factory(dinic)
ACM Computer Factory Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5596 Accepted: 1 ...
- Power of Cryptography(用double的泰勒公式可行分析)
Power of Cryptography Time limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option=com_onli ...
- hibernate杂记
1.hibernate中get和load方法有什么不同? (1)执行get方法,会立即加载对象, 执行load方法,若不使用该对象,则不会立即执行查询操作. (2)load 方法可能会抛出 LazyI ...
- Linux_DHCP服务搭建
Linux网络参数的设置 1. 修改主机名 # vim /etc/sysconfig/network NETWORKING=yes HOSTNAME=bj.com 2. 修 ...
- Java单链表、双端链表、有序链表实现
单链表: insertFirst:在表头插入一个新的链接点,时间复杂度为O(1) deleteFirst:删除表头的链接点,时间复杂度为O(1) 有了这两个方法,就可以用单链表来实现一个栈了,见htt ...
- C#中Const和Readonly的区别
const 的概念就是一个包含不能修改的值的变量.常数表达式是在编译时可被完全计算的表达式.因此不能从一个变量中提取的值来初始化常量.如果 const int a = b+1;b是一个变量,显然不能再 ...
- python动态获取对象的属性和方法
http://blog.csdn.net/kenkywu/article/details/6822220首先通过一个例子来看一下本文中可能用到的对象和相关概念.01 #coding: UTF- ...