Android应用开发--MP3音乐播放器代码实现(二)

这篇博客详细介绍了如何实现一个Android音乐播放器,包括自动显示音乐列表、播放控制、列表操作等功能。通过Service在后台播放音乐,使用BroadcastReceiver处理状态更新。主界面采用ListView填充SQLite数据,长按列表项可弹出自定义对话框。下篇将重点讲解服务类的实现。
               

Android应用开发--MP3音乐播放器代码实现(二)

 

2013年5月25日 简、美音乐播放器开发

小巫在这里罗列这个播放器已经实现的功能:

1.   自动显示音乐列表

2.   点击列表播放音乐

3.   长按列表弹出对话框

4.   暂停音乐

5.   上一首音乐

6.   下一首音乐

7.   自动播放下一首歌曲

8.   单曲循环

9.   全部循环

10.  随机播放

 

以上所有功能将会分为两篇博文来讲解,首先是主界面的,接着是播放界面的。在这里要说明一点,以上功能是小巫自己一点一点调试才实现的,并不能完全排除考虑不周的地方,原本这个软件实现起来并不太难,但确实要考虑到很多细节的地方,播放状态的切换和控制就是一块,也花了我不少实现,之前还很苦恼实现自己想要的效果,但后来还是经过思考和调试把功能实现。所以说,开发是一个需要很耐心的过程,各位童鞋,如果真正喜欢编程的话,想要做出一些小作品的话,那就好好掂量自己的耐心吧,好了,废话不多说,先贴一大段代码,后面在慢慢把需要注意的地方说一下。

主界面效果图:

            

以上界面的效果怎么实现的?

很简单的,就是ListView的数据填充,但要填的的东西就要考虑了,怎么把数据从SQLite中获取,小巫封装了一个工具类,用来获取与MP3相关的数据。

==>MediaUtils

package com.wwj.sb.utils;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import android.content.Context;import android.database.Cursor;import android.provider.MediaStore;import com.wwj.sb.domain.Mp3Info;public class MediaUtil /**  * 用于从数据库中查询歌曲的信息,保存在List当中  *   * @return  */ public static List<Mp3Info> getMp3Infos(Context context) {  Cursor cursor = context.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++) {   cursor.moveToNext();   Mp3Info mp3Info = new Mp3Info();   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集合中添加Map对象数据,每一个Map对象存放一首音乐的所有属性  * @param mp3Infos  * @return  */ public static List<HashMap<String, String>> getMusicMaps(   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", formatTime(mp3Info.getDuration()));   map.put("size", String.valueOf(mp3Info.getSize()));   map.put("url", mp3Info.getUrl());   mp3list.add(map);  }  return mp3list; }  /**  * 格式化时间,将毫秒转换为分:秒格式  * @param time  * @return  */ public static String formatTime(long time) {  String min = time / (1000 * 60) + "";  String sec = time % (1000 * 60) + "";  if (min.length() < 2) {   min = "0" + time / (1000 * 60) + "";  } else {   min = time / (1000 * 60) + "";  }  if (sec.length() == 4) {   sec = "0" + (time % (1000 * 60)) + "";  } else if (sec.length() == 3) {   sec = "00" + (time % (1000 * 60)) + "";  } else if (sec.length() == 2) {   sec = "000" + (time % (1000 * 60)) + "";  } else if (sec.length() == 1) {   sec = "0000" + (time % (1000 * 60)) + "";  }  return min + ":" + sec.trim().substring(0, 2); }}


好吧,来重头戏了,一大段代码来袭。

HomeActivity.Java

package com.wwj.sb.activity;import java.util.HashMap;import java.util.List;import android.app.Activity;import android.app.AlertDialog;import android.app.Service;import android.content.BroadcastReceiver;import android.content.Context;import android.content.DialogInterface;import android.content.Intent;import android.content.IntentFilter;import android.graphics.Color;import android.os.Bundle;import android.os.Vibrator;import android.view.ContextMenu;import android.view.ContextMenu.ContextMenuInfo;import android.view.KeyEvent;import android.view.View;import android.view.View.OnClickListener;import android.view.View.OnCreateContextMenuListener;import android.view.ViewGroup.LayoutParams;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.ArrayAdapter;import android.widget.Button;import android.widget.ImageView;import android.widget.ListView;import android.widget.SimpleAdapter;import android.widget.TextView;import android.widget.Toast;import com.wwj.sb.domain.AppConstant;import com.wwj.sb.domain.Mp3Info;import com.wwj.sb.service.PlayerService;import com.wwj.sb.utils.ConstantUtil;import com.wwj.sb.utils.CustomDialog;import com.wwj.sb.utils.MediaUtil;/** * 2013/5/7 * 简、美音乐播放器 * @author wwj *  */public class HomeActivity extends Activity private ListView mMusiclist; // 音乐列表 private List<Mp3Info> mp3Infos = nullprivate SimpleAdapter mAdapter; // 简单适配器 private Button previousBtn; // 上一首 private Button repeatBtn; // 重复(单曲循环、全部循环) private Button playBtn; // 播放(播放、暂停) private Button shuffleBtn; // 随机播放 private Button nextBtn; // 下一首 private TextView musicTitle;//歌曲标题 private TextView musicDuration; //歌曲时间 private Button musicPlaying; //歌曲专辑 private int repeatState;  //循环标识 private final int isCurrentRepeat = 1; // 单曲循环 private final int isAllRepeat = 2; // 全部循环 private final int isNoneRepeat = 3; // 无重复播放 private boolean isFirstTime
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值