android+多米音乐+自动播放,android 高仿多米音乐播放器 (有图有码有真相)
半年前写了个音乐播放器,仿的是多米的UI界面
之前发表在eoe社区,今天也发到csdn上来
不罗嗦,先上效果图:
下面简单介绍下代码:
MusicPlayer 播放音乐的核心类,该类有以下成员变量
private final static String TAG = "MusicPlayer";
private final String BROCAST_NAME = "com.genius.musicplay.brocast";
private MediaPlayer mMediaPlayer; // 播放器对象
private List mMusicFileList; // 音乐文件列表
private int mCurPlayIndex; // 当前播放索引
private int mPlayState; // 播放器状态
private int mPLayMode; // 歌曲播放模式
private Random mRandom;
private Context mContext;
其实该类就是将MediaPlayer做了一层封装,提供出一些播放音乐的相关操作如播放,暂停,上一曲,下一曲等等
MusicService 是播放音乐的服务继承自service,MediaPlayer作为它的成员变量
所以对MediaPlayer的操作就委托给了MusicService
ServiceManager,管理服务的对象,采用AIDL接口方式实现远程操作,对AIDL熟悉的童鞋你懂得
private final static String TAG = "ServiceManager";
private final static String SERVICE_NAME = "com.genius.service.musicservices";
private Boolean mConnectComplete;
private ServiceConnection mServiceConnection;
private MusicConnect mMusicConnect;
private IOnServiceConnectComplete mIOnServiceConnectComplete;
private Context mContext;
MusicConnect就是AIDL接口对象
MusicData音乐歌曲的信息,由于要在AIDL接口传递,所以需要实现Parcelable接口
public class MusicData implements Parcelable{
public final static String KEY_MUSIC_DATA = "MusicData";
private final static String KEY_MUSIC_NAME = "MusicName";
private final static String KEY_MUSIC_TIME = "MusicTime";
private final static String KEY_MUSIC_PATH = "MusicPath";
private final static String KEY_MUSIC_ARITST = "MusicAritst";
public String mMusicName;
public int mMusicTime;
public String mMusicPath;
public String mMusicAritst;
public MusicData()
{
mMusicName = "";
mMusicTime = 0;
mMusicPath = "";
mMusicAritst = "";
}
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
// TODO Auto-generated method stub
Bundle mBundle=new Bundle();
mBundle.putString(KEY_MUSIC_NAME, mMusicName);
mBundle.putInt(KEY_MUSIC_TIME, mMusicTime);
mBundle.putString(KEY_MUSIC_PATH, mMusicPath);
mBundle.putString(KEY_MUSIC_ARITST, mMusicAritst);
dest.writeBundle(mBundle);
}
public static final Parcelable.Creator CREATOR = new Parcelable.Creator()
{
@Override
public MusicData createFromParcel(Parcel source) {
// TODO Auto-generated method stub
MusicData Data = new MusicData();
Bundle mBundle=new Bundle();
mBundle = source.readBundle();
Data.mMusicName = mBundle.getString(KEY_MUSIC_NAME);
Data.mMusicTime = mBundle.getInt(KEY_MUSIC_TIME);
Data.mMusicPath = mBundle.getString(KEY_MUSIC_PATH);
Data.mMusicAritst = mBundle.getString(KEY_MUSIC_ARITST);
return Data;
}
@Override
public MusicData[] newArray(int size) {
// TODO Auto-generated method stub
return new MusicData[size];
}
};
}
音乐播放模式类
public class MusicPlayMode {
public static final int MPM_SINGLE_LOOP_PLAY = 0; // 单曲循环
public static final int MPM_ORDER_PLAY = 1; // 顺序播放
public static final int MPM_LIST_LOOP_PLAY = 2; // 列表循环
public static final int MPM_RANDOM_PLAY = 3; // 随即播放
}
音乐播放状态类
public class MusicPlayState {
public static final int MPS_NOFILE = -1; // 无音乐文件
public static final int MPS_INVALID = 0; // 当前音乐文件无效
public static final int MPS_PREPARE = 1; // 准备就绪
public static final int MPS_PLAYING = 2; // 播放中
public static final int MPS_PAUSE = 3; // 暂停
public static final String PLAY_STATE_NAME = "PLAY_STATE_NAME";
public static final String PLAY_MUSIC_INDEX = "PLAY_MUSIC_INDEX";
public static final String MUSIC_INVALID = "MUSIC_INVALID";
public static final String MUSIC_PREPARE = "MUSIC_PREPARE";
public static final String MUSIC_PLAY = "MUSIC_PLAY";
public static final String MUSIC_PAUSE = "MUSIC_PAUSE";
public static final String MUSIC_STOP = "MUSIC_STOP";
}
MusicPlayActivity,应用程序主界面,该类代码也最多,不过里面细分了几个内部类,如UIManager里面就包含了很多控件对象以及对它们的操作
private final static String TAG = "MusicPlayActivity";
private final String BROCAST_NAME = "com.genius.musicplay.brocast";
private final static int REFRESH_PROGRESS_EVENT = 0x100;
private final static int ABOUT_DIALOG_ID = 1;
private Handler mHandler;
private UIManager mUIManager;
private ServiceManager mServiceManager; // 本地服务管理
private MusicTimer mMusicTimer; // 检测歌曲进度的定时器
private MusicPlayStateBrocast mPlayStateBrocast; // 音乐播放状态的广播接收器
private SDStateBrocast mSDStateBrocast; // SD卡变化接收器
private List m_MusicFileList; // 音乐列表
private ListViewAdapter mListViewAdapter;
private boolean mIsSdExist = false; // SD卡是否存在
private boolean mIsHaveData = false; // 是否有音乐文件
private int mCurMusicTotalTime = 0;
private int mCurPlayMode = MusicPlayMode.MPM_LIST_LOOP_PLAY;
MySlidingDrawer,自定义抽屉控件,属于UIManager的一部分
MusicTimer,用于定时获取歌曲进度的定时器
其它的东东就不多说了,有兴趣的童鞋自个儿下代码(有注释)看吧
android+多米音乐+自动播放,android 高仿多米音乐播放器 (有图有码有真相)相关推荐
- Flutter+FishRedux高仿网易云音乐
flutter_netease_cloud_music 采用FishRedux框架与开源网易云音乐api开发的高仿网易云音乐APP,技术栈主要是:Flutter+FishRedux,目前主要是偏重AP ...
- android高仿酷狗音乐播放器源码下载
这是一款简单的读取SD卡音乐文件进行播放.暂停.删除.切歌等功能的高仿酷狗音乐播放器. 主要功能: 模块 简要说明 扫描SD卡音乐 扫描SD卡,并显示出本地音乐列表 提供歌词跟随音乐滚动更能 采用 ...
- android 仿网易标签切换,高仿网易云音乐客户端的Home页面切换Tabhost-IT蓝豹
1.高仿网易云音乐客户端的Home页面切换Tabhost 高仿网易云音乐客户端的Home页面切换Tabhost,并且三角形是透明的, 实现方式,自定义AnimTabsView继承 RelativeLa ...
- 【游戏开发创新】手把手教你使用Unity制作一个高仿酷狗音乐播放器,滨崎步,旋律起,爷青回(声音可视化 | 频谱 | Audio)
文章目录 一.前言 二.获取UI素材 三.使用UGUI制作界面 1.界面布局 2.账号圆形头像 3.搜索框 4.调节UI层 5.黑色按钮悬浮高亮效果 6.纯文字按钮 7.滚动列表自适应 8.歌名与视频 ...
- linux源码共享,Android之高仿飞鸽传书热点创建与共享源码
这两天,无意中看到飞鸽传书这个小东东,然后又突然对他的wifi热点创建与共享比较感兴趣,于是乎把他的APK给反编译了,很蛋疼的还原了一下他的这一小模块代码,感觉效果差不多,所以跟大家分享一下,下面我们 ...
- Vue3.0 + typescript 高仿网易云音乐 WebApp
Vue3.0 + typescript 高仿网易云音乐 WebApp 前言 Vue3.0 的正式发布,让我心动不已,于是尝试用 vue3 实现一个完整的项目,整个项目全部使用了 composition ...
- 新鲜出炉高仿网易云音乐 APP
我的引语 晚上好,我是吴小龙同学,我的公众号「菜鸟翻身」会推荐 GitHub 上好玩的项目,一分钟 get 一个优秀的开源项目,挖掘开源的价值,欢迎关注我. 项目中成长是最快的,如何成长,就是解决问题 ...
- 高仿网易云音乐(vue实战项目)
高仿网易云音乐(Vue实战项目)
- 基于vue的高仿网易云音乐网站,实现大多数功能
文章目录 前言 项目演示地址 线上地址 项目仓库 总结 前言 基于Vue + Vue-Router + Vuex + axios + elementui,ui参考网易云音乐,后端接口使用网易云音乐接口 ...
- Android高仿网易云音乐播放界面
现在很多的播放器的播放界面都是采用光盘的转动,下面是我仿造网易的播放界面.先上两张图: 第一张为播放前的界面,第二张为点击播放按钮的图片.布局文件如下: <RelativeLayout xmln ...
最新文章
- 计算机主机组装的过程,电脑主机组装需要怎样的操作流程简单至极?
- html5赛车小游戏,html5公路赛车小游戏
- rocketmq 消息 自定义_RocketMQ的消息发送及消费
- android 自定义控件央视,Android自定义ViewGroup之第一次接触ViewGroup
- 哈啰单车涨价:起步价1元/15分钟 仅限北京地区
- 【干货】企业如何进行数字化转型及如何称为数据驱动型企业?
- DataFrame.apply()
- Servlet-请求匹配,创建Servlet的三种方式,API 1
- 从零开始学数据库-MySQL
- flutter 生命周期源码解析
- 几个Gerrit代码检查checkstyle问题总结
- 腾讯广告终于迎来全面整合
- 2017 ACM Arabella Collegiate Programming Contest(solved 9/13, complex 12/13)
- 高可用的“异地多活”架构设计
- WiFi认证是如何保证企业WiFi的安全?
- 20161012 Python 读书笔记之 输出、循环
- ansible自动化运维工具
- [白话解析] 深入浅出边缘计算
- 第6届蓝桥杯大赛个人赛省赛(软件类)真题\Java语言B组\4
- 一键生成PDF文档的书签和目录(书签,目录页带页码 都行)
热门文章
- adc0809工作过程C语言,ADC0809的工作原理
- [JavaSE](static关键字、继承、super关键字、this关键字、多态、(成员变量、静态成员方法、实例成员方法)在多态中的调用情况)
- 区间取点问题 C++实现
- 使用JSR303进行参数校验
- 下列关于计算机软件的表述 不正确的是,下列关于会计核算软件的表述中,不正确的是()...
- 查询湖南计算机二级官网准考证,湖南计算机二级考试准考证打印
- 华为od统一考试B卷【迷宫问题】Python 实现
- Intrepid 英特佩斯 Vehicle spy vspy3使用
- mediawiki 页面的导出和离线浏览
- Linux集群管理软件clustershell