转载自:

http://blog.csdn.net/sunkes/article/details/51189189

Andriod小项目——在线音乐播放器

Android在线音乐播放器

从大一开始就已经开始自学Java和Android了,到现在差不多有一年了。

终于到了开始做项目实战的阶段了。就先DIY个在线音乐播放器。

实现了以下功能:

这个播放器可以从本机电脑搭建的简易服务器里异步读取并解析json数据,播放音乐,实现音乐切换时间显示,以及显示播放进度

程序有三个界面,启动画面,音乐列表,播放器页面,可以通过音乐列表点击进入到播放界面。

这篇文章只大概写了一下实现的思路,描述了一些关键的地方。

文章最后还提供了源代码,可以在文章结尾处  下载。

这是播放界面效果图:

具体思路如下:共6步


1.搭建简易服务器和接口设计

我们需要自己搭建一个简易的服务器,以便我们在手机客户端访问我们电脑目录中的音乐文件。

这里我们选择的是XAMPP套件,我们使用Apache服务器。

当然你选择电脑自带的IIS也是可以的,你可在控制板中开启它。在这里就不再多说了。

如果你和我一样使用了XAMPP,打开X:\xampp\htdocs

这里是Apache服务器的根目录。

我们一会可以通过在浏览器输入localhost访问到这里,或者局域网下电脑IP也可以访问到此处。

我们在htdocs 里新建文件夹music,接着拷贝几首音乐到刚刚我们建立的文件夹里。然后再新建music.json文件和我们的歌曲放在一起。

我们可以开始编辑json了,打开我们刚刚建立的Music.json:

[{"name":"Against The Grain","singer":"Akon","mp3":"music/101.mp3"},

{"name":"Entre Toi Et Moi","singer":"Mathieu Edward","mp3":"music/102.mp3"}]

好了,我们的简易服务器已经完成了。

我们的接口就是:

http://localhost/music/music.json

目录如下:

2.新建项目以及文件

与时俱进,我们使用谷歌前不久发布的Android Studio 2.0作为开发环境。

打开它新建工程,取一个名字。

然后我们创建一下目录:

activity---是我们的活动类,我们所所有的活动都在这里建立

adapter--适配器,保存一些像ListView适配器等

Model--实体类,用于存放Music实体。

Server--服务,我们将把后台服务代码建立在这里

util--工具,我们将设计一些播放音乐会使用的函数等内容,然后把它封装成类,便于使用

建立完后应如图所示:

3.设计启动界面,

启动画面,就类似于微信打开时的月球的那个页面。新建一个SplashActivity

我们需要让启动画面显示两秒钟左右,然后结束这个活动,跳转到进入主程序。代码如下:

我们使用Handler类里的postDelayed方法,第一个参数时一个Runnable接口,

我们直接传入并实现匿名接口,在run方法里启动另一个活动,这一步我们一气呵成。

  1. public class SplashActivity extends AppCompatActivity {
  2. @Override
  3. protected void onCreate(@Nullable Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.logo_show_layout);
  6.  
  7. //启动画面的代码:
  8. new Handler().postDelayed(new Runnable() {
  9. @Override
  10. public void run() {
  11. startActivity(new Intent(SplashActivity.this,MusicListMainActivity.class));
  12. SplashActivity.this.finish();
  13. }
  14. },1500);
  15. }
  16. }

4.编写显示音乐信息的列表活动。

新建MusicListMainActivity
这个活动也就是启动界面结束以后,启动的类。这个类将连接服务器,获取并解析,json数据。显然这需要线程异步处理,不然网络连接或阻塞到主线程,从而导致出现 ANR 。
这里我们使用AsyncTask,AsyncTask有不少缺点大家应该知道,如果可以还是使用java回调来与线程相结合。或者其他方法
我们虽然在这里使用了AsyncTask,但是还是提供java 线程+接口回调实现的方法:

接口设计:

  1. public interface HttpCallbackListener {
  2. void onFinish(String response);
  3. void onError(Exception e);
  4. }

在HttpUtil工具类里编写相关方法:

  1. public static void sendHttpRequest(final String address,
  2. final HttpCallbackListener listener) {
  3.  
  4. new Thread(new Runnable() {
  5. @Override
  6. public void run() {
  7.  
  8. try {
  9. ...
  10. while ((line = reader.readLine()) != null) {
  11. response.append(line);
  12. }
  13. if (listener != null) {
  14. // 回调onFinish()方法
  15. listener.onFinish(response.toString());
  16. }
  17. } catch (Exception e) {
  18. if (listener != null) {
  19. // 回调onError()方法
  20. listener.onError(e);
  21. }
  22. } finally {
  23. if (connection != null) {
  24. connection.disconnect();
  25. }
  26. }
  27. }
  28. }).start();
  29. }

然后我们可以在我们需要的地方调用了,传入相应参数即可,第二个参数是一个匿名接口的实现。

  1. HttpUtil.sendHttpRequest(address, new HttpCallbackListener() {
  2. @Override
  3. public void onFinish(final String response) {
  4.  
  5. }
  6.  
  7. @Override
  8. public void onError(Exception e) {
  9.  
  10. }
  11.  
  12. })

注意在里还是不能更新UI的,因为还是属于子线程里面。也需要Handler或者runOnUiThread(..)来 实现更新UI

好了,让我们来看看AsyncTask如何实现这种功能呢:
首先新建HttpResponseHandle类,把它放到Util文件夹里面,继承自 AsyncTask<String, Void, String>

AsyncTask这个类使用了Java泛型,第一个参数是执行时传入的参数,第二个是进度显示的参数,如果需要显示进度例如41%,这里就不能为空了。第三个参数是异步执行完成后返回类型。

  1. protected String doInBackground(String... params)
  2.  
  3. @Override
  4. protected void onPostExecute(String result) {
  5. onComplete(result);
  6. }

我们继承之后实现以上这两个函数,第一个函数是可以进行耗时操作的,因为android在底层实现了异步线程,第二个函数将在doInBackground结束完成后回调,并传入doInBackground返回值,这中间操作时自动完成的。这时我们后台操作已经完成了。我们在HttpResponseHandle 建一个抽象函数public abstract void onComplete(String result),以便实现类似与刚刚用接口回调的效果。
这个抽象函数将接收解析完成的数据,我们稍后会在MusicListMainActivity调用它。
在MusicListMainActivity的实现:

  1. HttpResponseHandle httpResponseHandle = new HttpResponseHandle() {
  2.  
  3. //执行到了onComplete说明我们编写的异步处理已经成功读取了数据,
  4. //由于是JSON格式的数据,我们可以在onComplete里开始解析它
  5. @Override
  6. public void onComplete(String result) {
  7. // 在这里接受数据,开始解析json数据
  8. }
  9. };

我们写的异步处理是不会自动启动的,我们需要调用execute()函数:

  1. //调用后会执行doInBackground(),并execute将参数传给它doInBackground
  2. httpResponseHandle.execute("http://192.168.41.3/music/music.json ");

5.服务类的设计思路
服务类通通过接收判断参数,从而执行不同的操作。
值得注意的是,android服务并不能直接执行耗时操作,还是需要自己另外开启多线程的。在调用MediaPlay.prepare()是个耗时操作,会导致主线程阻塞。
这里使用prepareAsync()就好了,不然就得自己开线程了或者其他方法来处理阻塞了。
 
 
6.MusicUtil工具类 
实现了初始化音乐,音乐的播放,暂停,还实现了实时更新音乐的进度。
更音乐的进度是这样实现的:

设置自己每秒执行500毫秒的Handler通过发送广播,通知MusicPlayer进行UI更新。
还有个MusicMediaUtil类可能用不到,这个类可以返回MediaPlayer对象,和new MediaPlayer()效果一样。设计这个类是因为在setDataSource切换歌曲时有的时候会报一些错误。我参考了许多资料,都说是无关紧要的错误(E/MediaPlayer: Should have subtitle controller already set ),就按照StackOverFlow提供的方法处理了。——这类直接使用JAVA的反射,对原代码稍稍修改一下,这样就不会出现E/MediaPlayer:
Should have ...的错误了。

好了最后说一说项目如何运行呢?

开启服务器,首先确保,电脑与你的手机在同一个局域网中,最简单的方法就是它们连接一个同WiFi,

然后电脑按Windows键+R 输入cmd打开命令行,输入ipconfig     ipv4 就是你电脑的IP了,把IP它填入MusicListMainActivity里面的root=" "里。这样手机端就可以正常连接电脑的服务器了。

到这里文章就到此结束了,感谢大家支持。: )

PS.

初学者文章,大神请轻拍!!

第一次写关于安卓的博客,大家要多多鼓励我哈~。

下载地址:

http://download.csdn.net/detail/sunkes/9495726

Andriod小项目——在线音乐播放器的更多相关文章

  1. 在线音乐播放器-----酷狗音乐api接口抓取

    首先身为一个在线音乐播放器,需要前端和数据库的搭配使用. 在数据库方面,我们没有办法制作,首先是版权问题,再加上数据量.所以我们需要借用其他网络播放器的数据库. 但是这些在线播放器,如百度,酷狗,酷我 ...

  2. python 开发在线音乐播放器-简易版

    在线音乐播放器,使用python的Tkinter库做了一个界面,感觉这个库使用起来还是挺方便的,音乐的数据来自网易云音乐的一个接口,通过urllib.urlopen模块打开网址,使用Json模块进行数 ...

  3. Flex4/Flash开发在线音乐播放器 , 含演示地址

    要求 必备知识 本文要求基本了解 Adobe Flex编程知识和JAVA基础知识. 开发环境 MyEclipse10/Flash Builder4.6/Flash Player11及以上 演示地址 演 ...

  4. 微信小程序 写音乐播放器 slider组件 将value设置为0 真机测试滑块不能回到起点

    最近在用微信小程序写一个音频播放页面,做时间进度的时候用到了slider插件,但是在自然播放完成,或者上/下切换的时候,将slider的value属性值设为0,开发工具上滑块会回到起点,有效.但是真机 ...

  5. 简单风格 在线音乐播放器(支持wav,MP3等)

    找了两天终于找到了,支持wav,MP3,其他格式没有测试. 1.修复了jQuery判断ie的bug, 2.修复播放循环 下载地址: http://pan.baidu.com/s/1o6upwHs

  6. uwp版的音乐播放器练手

    UWP项目之音乐播放器 这个项目本来是我女朋友的一个小作业,她做不出来,结果只能是我来代劳.经过几天的时间虽然赶出来了,但是自己不是很满意,还有很多不满意的地方,因此决定在最近的一段时间内,重新完成. ...

  7. Qt音乐播放器制作(一)Easy Player

    前几天忽然间认为,事到现在Qt的功底也有些基础了,为什么不试着自己做个玩意来玩玩呢?刚好在开源中国逛代码区的时候看到一个QKugou的项目,就想着做一个在线音乐播放器好了. 于是開始着手准备,忙活了一 ...

  8. html网页音乐播放器自带播放列表

    基于网页的音乐播放器demo  http://pan.baidu.com/s/1dDgm7HR 自己diy了一个手机端在线音乐播放器演示地址http://shanxi2014.com/zhuandiz ...

  9. ubuntu下一款有点感觉的 linux音乐播放器 clementine(小橘子))

    https://www.clementine-player.org/ 在linux听音乐的感觉确实不是很好,音乐播放器很多.但是仅仅只是数量上的优势,在确实不是很好用.自带的rhythmbox确实很占 ...

随机推荐

  1. .Net组件程序设计之上下文

    .Net组件程序设计之上下文 在后续篇幅的远程调用的文章里有说到应用程序域,那是大粒度的控制程序集的逻辑存在,那么想对对象的控制又由谁来做主呢?没错了,就是上下文.CLR把应用程序域更细化了,在应用程 ...

  2. Chrome插件整理

    本文内容都来源于偶整理的fetool. 想让更多使用Chrome的小伙伴,体验到这些令人愉悦的小工具,所以单独整理了这篇文章. 如果你是 前端/服务端/设计/面向Github编程/视觉控,相信下列的插 ...

  3. 修改注册表 去除Windows快捷方式图标小箭头

    一些朋友不喜欢Windows系统中快捷方式图标上面的小箭头,下面介绍如何修改注册表去除快捷方式图标上的小箭头. 1.开始->运行->输入regedit,启动注册表编辑器,然后; 2.依次展 ...

  4. Java中常见的29个运行异常

    ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotR ...

  5. Echarts3 关系图-力导向布局图

    因为项目需要,要求实现类似力导图效果的图,我就瞄上了echarts. 注意事项1:由于我的项目要部署到内网,所以js文件要在本地,网上大多力导图都是echarts2的,而其又依赖zrender基础库, ...

  6. 解密jQuery内核 Sizzle引擎筛选器 - 位置伪类(一)

    本章开始分析过滤器,根据API的顺序来 主要涉及的知识点 jQuery的组成 pushStack方法的作用 sizzle伪类选择器 首页我们知道jQuery对象是一个数组对象 内部结构 jQuery的 ...

  7. OPEN CASCADE Multiple Variable Function

    OPEN CASCADE Multiple Variable Function eryar@163.com Abstract. Multiple variable function with grad ...

  8. 深入理解DOM事件类型系列第二篇——键盘事件

    × 目录 [1]类型 [2]顺序 [3]按键信息[4]应用 前面的话 鼠标和键盘是电脑端主要的输入设备,上篇介绍了鼠标事件,本文将详细介绍键盘事件 类型 键盘事件用来描述键盘行为,主要有keydown ...

  9. c++面试常用知识(sizeof计算类的大小,虚拟继承,重载,隐藏,覆盖)

    一. sizeof计算结构体 注:本机机器字长为64位 1.最普通的类和普通的继承 #include<iostream> using namespace std; class Parent ...

  10. 平衡二叉树AVL删除

    平衡二叉树的插入过程:http://www.cnblogs.com/hujunzheng/p/4665451.html 对于二叉平衡树的删除采用的是二叉排序树删除的思路: 假设被删结点是*p,其双亲是 ...