具体功能实现:
欢迎页面

登录页面
可输入账户密码进行登录、登录失败弹出提示、登陆成功转到主页
可选择忘记密码进行修改
可选择新用户注册进行注册

修改界面
可输入已有账户进行修改
输入成功出现提示
后跳转可进行密码修改

播放页面

操作及注意事项:
先注册,注册成功后可进行修改密码和和登录
登陆成功后可进行常规点击播放音乐与其他操作
主要类:

音乐播放服务类

/*** 类说明:音乐播放服务类* @author wangzhihao* @version */
public class ControlPlay extends Service {//声明一个音频播放器public static MediaPlayer myMediaPlayer;public static MainActivity c_ma;public static int playing_id = 0;public static Music_infoAdapter m_in;//创建线程public Thread thread;Handler handler = new Handler();public boolean playFlag = true;public int vTemp = 0;@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {super.onCreate();initMediaSource(initMusicUri(0));}@Overridepublic void onDestroy() {super.onDestroy();if (myMediaPlayer != null) {myMediaPlayer.stop();myMediaPlayer.release();myMediaPlayer = null;}}@Overridepublic void onStart(Intent intent, int startId) {String playFlag = intent.getExtras().getString("control");if ("play".equals(playFlag)) {playMusic();} else if ("next".equals(playFlag)) {playNext();} else if ("front".equals(playFlag)) {playFront();} else if ("listClick".equals(playFlag)) {playing_id = intent.getExtras().getInt("musicId_1");initMediaSource(initMusicUri(playing_id));playMusic();} else if ("gridClick".equals(playFlag)) {playing_id = intent.getExtras().getInt("musicId_2");initMediaSource(initMusicUri(playing_id));playMusic();}}/*** 初始化媒体对象* * @param mp3Path*            mp3路径*/public void initMediaSource(String mp3Path) {Uri mp3Uri = Uri.parse(mp3Path);if (myMediaPlayer != null) {myMediaPlayer.stop();myMediaPlayer.reset();myMediaPlayer = null;}// 为myMediaPlayer创建对象myMediaPlayer = MediaPlayer.create(this, mp3Uri);//myMediaPlayer = MediaPlayer.create(this, R.raw.aaaa);//  c_ma.startRhythm(myMediaPlayer);}/*** 返回列表第几行的歌曲路径* * @param _id*            表示歌曲序号,从0开始*/public String initMusicUri(int _id) {playing_id = _id;String s;// 判断列表和列表长度不为空时才获取if (Music_infoAdapter.musicList != null&& Music_infoAdapter.musicList.size() != 0) {s = Music_infoAdapter.musicList.get(_id).getMusicPath();return s;} else {// 否则返回空字符串return "";}}/*** 音乐播放方法,并且带有暂停方法*/public void playMusic() {// 判断歌曲不能为空
System.out.println("sfajfdsa");if (myMediaPlayer != null && Music_infoAdapter.musicList.size() != 0) {if (myMediaPlayer.isPlaying()) {// 歌曲暂停myMediaPlayer.stop();// 更换播放按钮背景MainActivity.play_ImageButton.setBackgroundResource(R.drawable.play_button);} else {System.out.println("sfajfdsa2");//       myMediaPlayer.start();try {       if(myMediaPlayer != null)  {  myMediaPlayer.stop();  }      myMediaPlayer.prepare();  myMediaPlayer.start();  } catch (Exception e) {  e.printStackTrace();  }// /// 初始化歌词配置 /// //// 更换背景-MainActivity.play_ImageButton.setBackgroundResource(R.drawable.pause_button);// 启动线程更新SeekBarstartSeekBarUpdate();// 截取.mp3字符串String a = Music_infoAdapter.musicList.get(playing_id).getMusicName();// 切换带动画更新歌曲名MainActivity.music_Name.setText(a);MainActivity.music_Name.setAnimation(AnimationUtils.loadAnimation(ControlPlay.this, R.anim.translate_z));// 带动画更新专辑名MainActivity.music_Album.setText(Music_infoAdapter.musicList.get(playing_id).getMusicAlbum());MainActivity.music_Album.setAnimation(AnimationUtils.loadAnimation(ControlPlay.this, R.anim.alpha_y));// 更新歌曲时间MainActivity.time_right.setText(Music_infoAdapter.toTime(Music_infoAdapter.musicList.get(playing_id).getMusicTime()));}/*** 监听播放是否完成*/myMediaPlayer.setOnCompletionListener(new OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer mp) {// TODO Auto-generated method stub// 播放完当前歌曲,自动播放下一首playNext();}});} else {Toast.makeText(ControlPlay.this, "木有在手机里找到歌曲啊...",Toast.LENGTH_SHORT).show();}}/*** 播放下一首*/public void playNext() {// 判断歌曲不能为空if (Music_infoAdapter.musicList.size() != 0) {// 如果到了最后一首则一直播放最后一首if (playing_id == Music_infoAdapter.musicList.size() - 1) {playing_id = Music_infoAdapter.musicList.size() - 1;Toast.makeText(ControlPlay.this, "已经是最后一首啦!",Toast.LENGTH_SHORT).show();MainActivity.play_ImageButton.setBackgroundResource(R.drawable.play_button);MainActivity.mNotificationManager.cancel(1);} else {initMediaSource(initMusicUri(++playing_id));playMusic();}} else {Toast.makeText(ControlPlay.this, "木有找到歌曲啊!", Toast.LENGTH_SHORT).show();}}/*** 播放上一首*/public void playFront() {// 判断歌曲不能为空if (Music_infoAdapter.musicList.size() != 0) {// 如果到了第一首则一直播放第一首if (playing_id == 0) {playing_id = 0;Toast.makeText(ControlPlay.this, "现在就是第一首哦!",Toast.LENGTH_SHORT).show();} else {initMediaSource(initMusicUri(--playing_id));playMusic();}} else {Toast.makeText(ControlPlay.this, "木有找到歌曲啊!", Toast.LENGTH_SHORT).show();}}public void startSeekBarUpdate() {handler.post(start);}Runnable start = new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubhandler.post(updatesb);}};Runnable updatesb = new Runnable() {@Overridepublic void run() {// 获取SeekBar走动到那的时间MainActivity.play_time = myMediaPlayer.getCurrentPosition();// 设置填充当前获取的进度MainActivity.seekbar.setProgress(MainActivity.play_time);// SeekBar的最大值填充歌曲时间MainActivity.seekbar.setMax(Music_infoAdapter.musicList.get(playing_id).getMusicTime());// 线程延迟1000毫秒启动handler.postDelayed(updatesb, 1000);}};}

MainActivity类

public class MainActivity extends Activity {private ImageButton left_ImageButton;// 上一曲public static ImageButton play_ImageButton;// 播放private ImageButton right_ImageButton;// 下一曲public static Context mContext;private ListView musicListView;// 歌曲列表// 绑定SeekBar和各种属性TextViewpublic static SeekBar seekbar;public static TextView time_left;public static TextView time_right;public static TextView music_Name;public static TextView music_Album;public static ImageView music_AlbumArt;// 为歌曲时间和播放时间定义静态变量public static int song_time = 0;public static int play_time = 0;public static Music_infoAdapter music_info;public static NotificationManager mNotificationManager;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mContext = MainActivity.this;musicListView = (ListView) findViewById(R.id.listView1);time_left = (TextView) findViewById(R.id.time_tv1);time_right = (TextView) findViewById(R.id.time_tv2);music_Name = (TextView) findViewById(R.id.music_name);music_Album = (TextView) findViewById(R.id.music_album);seekbar = (SeekBar) findViewById(R.id.player_seekbar);// 创建对象获得系统服务mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);ShowMp3List();// 监听播放列表点击事件musicListView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {Intent play_1 = new Intent(mContext, ControlPlay.class);play_1.putExtra("control", "listClick");play_1.putExtra("musicId_1", arg2);startService(play_1);}});/*** 监听“上一首”并实现功能*/left_ImageButton = (ImageButton) findViewById(R.id.ib1);left_ImageButton.setOnClickListener(new ImageButton.OnClickListener() {@Overridepublic void onClick(View v) {Intent play_left = new Intent(mContext, ControlPlay.class);play_left.putExtra("control", "front");startService(play_left);}});/*** 监听“下一首”并实现功能*/right_ImageButton = (ImageButton) findViewById(R.id.ib3);right_ImageButton.setOnClickListener(new ImageButton.OnClickListener() {@Overridepublic void onClick(View v) {Intent play_right = new Intent(mContext, ControlPlay.class);play_right.putExtra("control", "next");startService(play_right);}});/*** 播放按钮,实现方法* */play_ImageButton = (ImageButton) findViewById(R.id.ib2);play_ImageButton.setOnClickListener(new ImageButton.OnClickListener() {@Overridepublic void onClick(View v) {Intent play_center = new Intent(mContext, ControlPlay.class);play_center.putExtra("control", "play");startService(play_center);}});// 判断歌曲不能为空并且后缀为.mp3if (music_info.getCount() > 0&& Music_infoAdapter.musicList.get(ControlPlay.playing_id).getMusicName().endsWith(".mp3")) {// 显示获取的歌曲时间time_right.setText(Music_infoAdapter.toTime(Music_infoAdapter.musicList.get(ControlPlay.playing_id).getMusicTime()));// 截取.mp3字符串String a = Music_infoAdapter.musicList.get(ControlPlay.playing_id).getMusicName();int b = a.indexOf(".mp3");String c = a.substring(0, b);// 显示获取的歌曲名music_Name.setText(c);music_Name.setAnimation(AnimationUtils.loadAnimation(mContext,R.anim.translate_z));} else {System.out.println("请点击列表播放歌曲!");}/*** 监听拖动SeekBar事件*/seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {// TODO Auto-generated method stub}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {// TODO Auto-generated method stub}@Overridepublic void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {// 判断用户是否触拖SeekBar并且不为空才执行if (fromUser && ControlPlay.myMediaPlayer != null) {ControlPlay.myMediaPlayer.seekTo(progress);}time_left.setText(Music_infoAdapter.toTime(progress));}});}private void ShowMp3List() {// 用游标查找媒体详细信息Cursor cursor = this.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,new String[] { MediaStore.Audio.Media.TITLE,// 标题,游标从0读取MediaStore.Audio.Media.DURATION,// 持续时间,1MediaStore.Audio.Media.ARTIST,// 艺术家,2MediaStore.Audio.Media._ID,// id,3MediaStore.Audio.Media.DISPLAY_NAME,// 显示名称,4MediaStore.Audio.Media.DATA,// 数据,5MediaStore.Audio.Media.ALBUM_ID,// 专辑名称ID,6MediaStore.Audio.Media.ALBUM,// 专辑,7MediaStore.Audio.Media.SIZE }, null, null,MediaStore.Audio.Media.ARTIST);// 大小,8/*** 判断游标是否为空,有些地方即使没有音乐也会报异常。而且游标不稳定。稍有不慎就出错了,其次,如果用户没有音乐的话,* 不妨可以告知用户没有音乐让用户添加进去*/if (cursor != null && cursor.getCount() == 0) {Toast.makeText(mContext, "你的手机未找到音乐,请添加音乐", Toast.LENGTH_LONG).show();return;}System.out.println(" cursor size " + cursor.getCount());music_info = new Music_infoAdapter(this, cursor);new MusicListView().disPlayList(musicListView, this, cursor);}}

歌曲适配类

/*** 类说明:歌曲列表适配类* @author wangzhihao* @version */
public class Music_infoAdapter extends BaseAdapter {// 用来装查询到得音乐文件数据//游标public Cursor mCursor;// 歌曲列表信息public static List<MusicInfomation> musicList;public MusicInfomation mi;public Context mContext;// 音乐信息:1、歌曲名,2、歌手,3、歌曲时间,4、专辑,5、歌曲大小public Music_infoAdapter(Context context,Cursor cursor) {System.out.println("Music_infoAdapter");this.mContext = context;this.mCursor = cursor;musicList = new ArrayList<MusicInfomation>();/** 将游标移到第一位 **/mCursor.moveToFirst();if (mCursor != null) {// 移动到第一个mCursor.moveToFirst();// 获得歌曲的各种属性for (int i = 0; i < mCursor.getCount(); i++) {// 过滤mp3文件if (mCursor.getString(5).endsWith(".mp3")) {mi = new MusicInfomation();mi.setMusicName(mCursor.getString(0));//歌曲名称mi.setMusicTime(mCursor.getInt(1));//歌曲时间长度mi.setMusicAlbum(mCursor.getString(2));//专辑mi.setMusicSinger(mCursor.getString(3));//歌手mi.setMusicSize(mCursor.getInt(4));//大小mi.setMusicPath(mCursor.getString(5));//路径mi.set_id(mCursor.getInt(6));//歌曲idmusicList.add(mi);}// 移动到下一个mCursor.moveToNext();}System.out.println("musicList size "+ musicList.size());}}@Overridepublic int getCount() {return musicList.size();}@Overridepublic Object getItem(int arg0) {return musicList.get(arg0);}@Overridepublic long getItemId(int arg0) {return 0;}@Overridepublic View getView(int arg0, View arg1, ViewGroup arg2) {LayoutInflater li = LayoutInflater.from(mContext);View v = li.inflate(R.layout.musiclist_item, null);TextView tv1;TextView tv2;TextView tv3;TextView tv4;// ImageView iv1;tv1 = (TextView) v.findViewById(R.id.tv1);tv2 = (TextView) v.findViewById(R.id.tv2);tv3 = (TextView) v.findViewById(R.id.tv3);tv4 = (TextView) v.findViewById(R.id.tv4);tv1.setText(musicList.get(arg0).getMusicName());tv2.setText(toTime(musicList.get(arg0).getMusicTime()));//tv3.setText(musicList.get(arg0).getMusicPath());tv3.setText(musicList.get(arg0).getMusicAlbum());tv4.setText(toMB(musicList.get(arg0).getMusicSize()) + "MB");return v;}/*** 时间转化处理*/public static String toTime(int time) {time /= 1000;int minute = time / 60;int second = time % 60;minute %= 60;return String.format(" %02d:%02d ", minute, second);}/*** 文件大小转换,将B转换为MB*/public String toMB(int size) {float a = (float) size / (float) (1024 * 1024);String b = Float.toString(a);int c = b.indexOf(".");String fileSize = "";fileSize += b.substring(0, c + 2);return fileSize;}/*** 歌曲专辑图片显示,如果有歌曲图片,才会返回,否则为null,要注意判断* * @param trackId是音乐的id* @return 返回类型是String 类型的图片地址,也就是uri*/public String getAlbumArt(int trackId) {return "";}/*** 1、歌曲名 2、歌手 3、歌曲时间 4、专辑(专辑图片,专辑名称,专辑ID[用来获取图片]) 5、歌曲大小*/public class MusicInfomation {private int _id;private String musicName;private String musicSinger;private int musicTime;private String musicAlbum;private int musicSize;private String musicPath;public int get_id() {return _id;}public void set_id(int _id) {this._id = _id;}public String getMusicName() {return musicName;}public void setMusicName(String musicName) {this.musicName = musicName;}public String getMusicSinger() {return musicSinger;}public void setMusicSinger(String musicSinger) {this.musicSinger = musicSinger;}public int getMusicTime() {return musicTime;}public void setMusicTime(int musicTime) {this.musicTime = musicTime;}public String getMusicAlbum() {return musicAlbum;}public void setMusicAlbum(String musicAlbum) {this.musicAlbum = musicAlbum;}public int getMusicSize() {return musicSize;}public void setMusicSize(int musicSize) {this.musicSize = musicSize;}public String getMusicPath() {return musicPath;}public void setMusicPath(String musicPath) {this.musicPath = musicPath;}}}

如需源码可私信

Android音乐播放器相关推荐

  1. 简单android音乐播放器课程设计,android音乐播放器课程设计报告.doc

    android音乐播放器课程设计报告 android音乐播放器课程设计报告 基于Android音乐播放器的设计与实现 滨江学院 <移动通信程序设计> 课程设计 题 目 院 系 专 业学生姓 ...

  2. android音乐播放器完整教程,android实现简单音乐播放器

    本文实例为大家分享了android音乐播放器的具体代码,供大家参考,具体内容如下 话不多说先上效果 前言 写这个音乐播放器实在是迫不得已.因为我们Andoird课程要求写一个音乐播放器.所以就有了此项 ...

  3. 自编Win8风格Android音乐播放器应用源码(单机版)

    用闲暇的两天时间,研究编写了一个类Win8风格的android音乐播放器,实现了大部分基本功能.下面看具体描述: 基本实现功能: 注意事项:Android系统版本须在2.2以上,保证手机安装有SD卡( ...

  4. 基于android音乐播放器的设计

    本科毕业论文(设计)诚信声明 本人郑重声明:所呈交的毕业论文(设计),题目<---基于android音乐播放器的设计----------->是本人在指导教师的指导下,进行研究工作所取得的成 ...

  5. Android音乐播放器的设计与实现

    课程设计报告 实习名称 课程设计2 设计题目 Android音乐播放器的设计与实现 目录 摘要11 1 引言22 2 可行性分析22 2.1 技术可行性22 2.2 经济可行性33 2.3 管理可行性 ...

  6. Android音乐播放器开发(2)—登录

    1. 说明 本音乐播放器基于Android开发,原为我和另外两个小伙伴在上学期间一起做的一个小项目,近来有时间整理一下.之前我有文章已经介绍了播放界面的功能实现(Android音乐播放器开发),但介绍 ...

  7. Android音乐播放器开发(3)—注册

    1. 说明 本音乐播放器基于Android开发,原为我和另外两个小伙伴在上学期间一起做的一个小项目,近来有时间整理一下.之前我有文章已经介绍了播放界面的功能实现(Android音乐播放器开发),但介绍 ...

  8. Android音乐播放器开发(4)—修改密码

    1. 说明 本音乐播放器基于Android开发,原为我和另外两个小伙伴在上学期间一起做的一个小项目,近来有时间整理一下.之前我有文章已经介绍了播放界面的功能实现(Android音乐播放器开发),但介绍 ...

  9. Android 音乐播放器的开发教程(三) 小卷毛播放器的主界面开发 ---- 小达

    Android 音乐播放器的开发教程(三) 小卷毛播放器的主界面开发 拿好素材之后,打开你们的开发工具,小达这里用的是android studio1.0, 新建一个项目,打开activity_main ...

  10. android七大主流Android音乐播放器横向评测

    随着智能手机和3G网络的普及,移动互联网日益成为人们生活娱乐的重心之一.在音乐领域,竞争也十分激烈,在PC之后,几大提供音乐服务的厂商正在加紧占据手机客户端. 本期我们在Android平台挑选了七家国 ...

最新文章

  1. 1475 m进制转十进制
  2. Netty源码分析第1章(Netty启动流程)----第4节: 注册多路复用
  3. 学习spring过程看的笔记(一)
  4. Objective-C 日记④ 集合家族
  5. linux初始:命令行解释器(shell)、权限
  6. 今日讨论:你们测试组有公共用例库吗?
  7. springboot12 MVC自动配置原理
  8. 《Spring Cloud Netflix》 -- 服务注册和服务发现-Eureka的常用配置
  9. 深入理解地球的经度和纬度换算
  10. [图文]TDateTime And TTime(转)
  11. nar神经网络_动态神经网络(NAR)做预测
  12. 孢子社群:今日推荐人工智能微信群:粤、沪、鄂人工智能产业化集群1
  13. 使用经验-深度学习云服务器mist GPU
  14. 全球时间与北京时间、UTC时间关系表
  15. 梅科尔工作室-于天姿-鸿蒙笔记4
  16. 父类的对象指向子类对象,父类可以调用子类的方法吗?
  17. 漫画绘制技法大放送(上)
  18. 1、Python学习笔记第一课:python介绍
  19. linux驱动 设备驱动模型
  20. Terraform 和 Oracle Cloud Infrastructure

热门文章

  1. Mysql主从切换自动_keepalived实现对mysql主从复制的主备自动切换
  2. 百年铁树要开花,贾跃亭要还钱了?
  3. 软件开发中什么是CI/CD
  4. 中国有句俗语叫“三天打鱼两天晒网”。某人从1990年1月1日起开始“三天打鱼两天晒网”, 问这个人在以后的某一天中是“打鱼”还是“晒网”?(考虑中间有几个闰年)
  5. 一个屌丝程序猿的人生(五十)
  6. 面试总结-2023届安全面试题总汇
  7. windows server 2012 NIC组合---概念
  8. 「职称」2022年度中高级职称线下申报材料组卷要求(下)
  9. 区块链马拉松|Blockathon(2018)上海站开放报名(HiBlock)
  10. 【VS2015】Win7 X64上面安装VS2015