Android应用开发--MP3音乐播放器代码实现(一)
来源:互联网 发布:ui设计的软件 编辑:程序博客网 时间:2024/05/05 08:03
------- android培训、java培训、期待与您交流! ----------
需求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;
- }
/*** 用于从数据库中查询歌曲的信息,保存在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));//音乐idString 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);
- }
/** * 填充列表 * @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());
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); //启动服务
- }
- }
- }
private class MusicListItemClickListener implements OnItemClickListener {@Overridepublic 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);
- }
- }
- }
- }
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;//暂停状态@Overridepublic IBinder onBind(Intent arg0) {return null;}@Overridepublic 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();}}}@Overridepublic 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;}@Overridepublic void onPrepared(MediaPlayer mp) {mediaPlayer.start();//开始播放if(positon > 0) {//如果音乐不是从头播放mediaPlayer.seekTo(positon);}}}}
以上代码实现了两个需求,显示音乐列表和实现列表点击事件启动Servic。下次会实现控制音乐播放的需求。
- Android应用开发--MP3音乐播放器代码实现(一)
- Android应用开发--MP3音乐播放器代码实现(一)
- Android应用开发--MP3音乐播放器代码实现(一)
- Android应用开发--MP3音乐播放器代码实现(二)
- Android应用开发--MP3音乐播放器代码实现(二)
- Android应用开发-MP3音乐播放器代码实现(三)
- Android应用开发-MP3音乐播放器代码实现(三)
- Android应用开发--MP3音乐播放器代码实现(二)
- Android应用开发--MP3音乐播放器代码实现(二)
- Android应用开发--MP3音乐播放器Service实现
- Android应用开发--MP3音乐播放器Service实现
- Android应用开发--MP3音乐播放器滚动歌词实现
- Android应用开发--MP3音乐播放器滚动歌词实现
- Android应用开发--MP3音乐播放器Service实现
- Android应用开发--MP3音乐播放器滚动歌词实现
- Android应用开发--MP3音乐播放器界面设计(1)
- Android应用开发--MP3音乐播放器界面设计(2)
- Android应用开发--MP3音乐播放器界面设计(1)
- ole date time 转换 tip 2209161600
- php 安全基础 第八章 共享主机 源码暴露
- bootstrap学习
- 各大网站架构简单总结[分享]
- VC6.0 error LNK2001: unresolved external symbol _main
- Android应用开发--MP3音乐播放器代码实现(一)
- C++ 默认构造函数
- platform_device与platform_driver
- C# 操作excel数据
- Linux应用的延时和丢包模拟
- 令人沮丧的是,我们还在谈论微创新。更他妈的为媒体整体报道这些无聊的互联网公司的微创新恶心。
- JAVA反射包应用功能GUI程序举例
- PHP时间
- Linux crontab 命令格式与详细例子