最近在自己的音乐播放器中添加了一个下载网络歌曲的功能,虽然还没有做到边下边播放的功能,不过总算是开了一个头了,下载功搞定了,离目标也就不远了。

  android自带播放器支持“边下载边播放”的功能,当你使用系统浏览器点击一个“MP3的下载链接”时,它就会自动播放这首歌曲并保存到本地(不知道用第三方浏览器是否也如此,笔者认为应该是系统浏览器会自动识别MP3下载链接,并调用系统播放器来播放)。

  与这个过程类似,在笔者做的音乐播放器中,当用户选择“歌曲下载”时,会转到一个webview中,这里我将webview的初始url定向到"htpp://www.top100.cn"(巨鲸音乐),当点击MP3的下载链接时,就会将音乐下载到sdcard的根目录。webview所在activity的代码如下:

setContentView(R.layout.web);
web = (WebView)findViewById(R.id.web);
web.setWebViewClient(new DownLoadWebViewClient(this));
WebSettings s = web.getSettings();
s.setSaveFormData(false);
s.setSavePassword(false);
s.setUseWideViewPort(true);
s.setJavaScriptEnabled(true);
s.setLightTouchEnabled(true);
web.setWebChromeClient(new WebChromeClient() {public void onProgressChanged(WebView view, int progress) {//Activity和Webview根据加载程度决定进度条的进度大小//当加载到100%的时候 进度条自动消失context.setProgress(progress * 100);}
});
web.loadUrl("http://www.top100.cn/");


  web.setWebViewClient(new DownLoadWebViewClient(this));其中DownLoadWebViewClient就使我们下载MP3文件的关键,它继承自WebViewClient,这里我们Override它的public boolean shouldOverrideUrlLoading(WebView view, String url)方法,在方法中我们判断点击的链接时否为“下载MP3文件”,如果成立,则启动一个service来下载mp3文件,代码如下:

public class DownLoadWebViewClient extends WebViewClient {private Context context;public DownLoadWebViewClient(Context context){this.context = context;}@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {Log.i("info", "open an url");String urlStr = "";                                 //存放解码后的url//如果是utf8编码if (isUtf8Url(url)){urlStr = Utf8URLdecode(url);//如果不是utf8编码} else {urlStr = URLDecoder.decode(url);}//如果链接是下载top100.cn中的mp3文件if (url.substring(url.length()-4).equals(".mp3")&&url.substring(7,10).equals("221")){Log.i("info", "mp3 file");String ss[] = urlStr.split("/");String musicName = ss[ss.length-1];                //得到音乐文件的全名(包括后缀)Log.i("info", "musicfile: " + musicName);//将下载链接和文件名传递给下载模块Intent intent = new Intent(context,DownLoadService.class);intent.putExtra("url", url);intent.putExtra("musicName", musicName);context.startService(intent);}return super.shouldOverrideUrlLoading(view, url);}

  这里略去了url解码的相关方法。其中DownLoadService用于下载MP3文件并在,它接收DownLoadWebViewClient传递来的url和音乐文件名,代码如下:

public class DownLoadService extends Service implements Runnable{  //实现Runable接口private String URL_str;                        //网络歌曲的路径private File download_file;                    //下载的文件private int total_read = 0;                 //已经下载文件的长度(以字节为单位)private int readLength = 0;                   //一次性下载的长度(以字节为单位)private int music_length = 0;                  //音乐文件的长度(以字节为单位)private boolean flag = false;                   //是否停止下载,停止下载为trueprivate Thread downThread;                 //下载线程private String musicName;                 //下载的文件名@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {downThread = new Thread(this);          //初始化下载线程downThread.start();}@Overridepublic void onStart(Intent intent, int startId) {URL_str = intent.getExtras().getString("url");       //获取下载链接的urlmusicName = intent.getExtras().getString("musicName");//获取下载的文件名}@Overridepublic void onDestroy() {flag = true;                                //停止下载}//实现Run方法,进行歌曲的下载@Overridepublic void run() {                                                            FileOutputStream fos = null;               //文件输出流FileInputStream fis = null;             //文件输出流InputStream is = null;                  //网络文件输入流URL url = null;try {url = new URL(URL_str);              //网络歌曲的urlHttpURLConnection httpConnection = null;httpConnection = (HttpURLConnection)url.openConnection();               //打开网络连接download_file = new File(Environment.  //在sdcard根目录建立一个与要下载的文件的名字相同的文件getExternalStorageDirectory()+ "/" + musicName);fos = new FileOutputStream(download_file, true);        //初始化文件输出流fis = new FileInputStream(download_file);                //初始化文件输入流total_read = fis.available();                        //初始化“已下载部分”的长度,此处应为0music_length = httpConnection.getContentLength();      //要下载的文件的总长度if (is == null) {                             //如果下载失败则打印日志,并返回Log.i("info", "donload failed...");return;}byte buf[] = new byte[1024];                      //定义下载缓冲区readLength = 0;                           //一次性下载的长度Log.i("info", "download start...");                     //向前台发送开始下载广播Intent startIntent = new Intent();startIntent.setAction("com.alex.downloadstart");sendBroadcast(startIntent);//如果读取网络文件的数据流成功,且用户没有选择停止下载,则开始下载文件while (readLength != -1  && !flag) {                    if((readLength = is.read(buf))>0){fos.write(buf, 0, readLength);total_read += readLength;         //已下载文件的长度增加}   if (total_read == music_length) {         //当已下载的长度等于网络文件的长度,则下载完成flag = false;Log.i("info", "download complete...");//向前台发送下载完成广播Intent completeIntent = new Intent();completeIntent.setAction("com.alex.downloadcompleted");sendBroadcast(completeIntent);//关闭输入输出流fos.close();is.close();fis.close();}Thread.sleep(50);                         //当前现在休眠50毫秒Log.i("info", "download process : "                 //打印下载进度+ ((total_read+0.0)/music_length*100+"").substring(0, 4)+"%");}} catch (Exception e) {Intent errorIntent = new Intent();errorIntent.setAction("com.alex.downloaderror");sendBroadcast(errorIntent);e.printStackTrace();}}}

  这里有个小bug,如果下载同一首歌曲多次,程序不会多次新建文件,而将数据写入与之同名的文件中。

转载于:https://www.cnblogs.com/zchajax/archive/2011/05/15/2047129.html

android音乐播放器——通过webview下载歌曲相关推荐

  1. android音乐播放器开发 SweetMusicPlayer 载入歌曲列表

    上一篇写了播放器的总体实现思路,http://blog.csdn.net/huweigoodboy/article/details/39855653,如今来总结下载入歌曲列表. 代码地址:https: ...

  2. android 音乐播放器----歌词在线下载

    本文来自CSDN丹丹博客,转载请必须注明出处: http://blog.csdn.net/dany1202/archive/2011/06/09/6533513.aspx 使用百度的歌词API,如: ...

  3. linux 音频播放器源码,Android音乐播放器源码

    相当完整的Android音乐播放器,直接上效果图及源代码,自己欣赏,具体不再解释了,可以说是一个很给力的Android音乐播放器. 示例代码: /* * Copyright (C) 2009 Tele ...

  4. Android音乐播放器制作(二 )点击歌曲实现播放

    上次我们实现了把手机里的音频扫描到,然后放在list集合里面,用ListView展示在手机界面上,如果没有看过的可以去看看本人的博客:Android音乐播放器制作(一)扫描本地音乐显示在手机上 这次是 ...

  5. Android音乐播放器开发(6)—ListView组件创建歌曲播放列表(内含原理分析)

    1. 说明 源码已同步到Gitee仓库,GitHub仓库,觉得还不错的话帮忙点个"star"吧,非常感谢. 以往的文章 服务端:Android音乐播放器开发–服务端 登录:Andr ...

  6. Android音乐播放器歌手分类,本地音乐:歌曲分类模式比较_软件资讯软件评测-中关村在线...

    ■歌曲分类模式比较 用户需要在平板电脑本地存取歌曲,当歌曲的数量达到一个比较大的量级之后,如果没有针对本地音乐较大数量级的歌曲进行有效的分类,那么在您需要寻找一首特定歌曲的时候,您可能会遇到很大的麻烦 ...

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

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

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

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

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

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

  10. android 音乐播放器框架,Android音乐播放器 -- 实现框架

    MediaPlayer 框架有两种方案 第一种是通过全局变量保存当前状态,触发状态后获取全局变量进行配置 第二种是通过intent,让 Media player service 和 activity之 ...

最新文章

  1. 修改python plot折线图的坐标轴刻度
  2. PLATFORM软件有限公司
  3. 偏差/方差、经验风险最小化、联合界、一致收敛
  4. Python 中reload一个文件时报错 ( reload() argument must be module)
  5. 最大值减最小值等于区间长度_呆哥数学每日一题 ——三角函数求余弦最小值...
  6. opencomm在c语言中的作用,使用OpenMPI从Fortran调用C语言
  7. 分压式静态工作点稳定电路
  8. 数据分析CSV模块的基本使用(以分析复杂的天气情况为例),附完整的Python代码及csv文件详解---数据可视化
  9. Excel 2016新增函数之IFS
  10. 使用raphael.js绘制中国地图
  11. 生日快乐网站_【总结 】文化自信源自基层贺房氏网站建站十五周年
  12. OC和Swift混合编程引用Pods管理的模块
  13. 网络核心之数据交换-报文、分组交换2
  14. 根据百度日历获取当年所有天数,以及判断今天是周几 以及是是节假日或者工作日,阴历阳历
  15. android通过经纬度获取地址,Android编程实现根据经纬度查询地址并对获取的json数据进行解析的方法...
  16. 2017初二上期中考试总结
  17. 计算机游戏动漫制作自我鉴定,关于游戏实习的自我鉴定
  18. GPT-3会是第一个通用人工智能吗?
  19. Win10系统打不开html文件,电脑无法打开html文件
  20. 网易云音乐实时计算平台设计及实践

热门文章

  1. 关于修改思科WLC SSID
  2. 生产可能性曲线与机会成本
  3. Linux内核 失速(STALL) 警告说明文档翻译
  4. 1880-2010年间全美婴儿姓名
  5. 有关找共享单车那些事
  6. python 类的执行中保部存值_python 生成有效的四要素
  7. 一般计算机命名规则,详解intel处理器命名规则
  8. 琵琶行用计算机弹,琵琶行中的三次弹奏
  9. 转载.NET技术-.NET各大网站-编程技术网址
  10. 技术攻关:从零到精通