android音乐播放器——通过webview下载歌曲
最近在自己的音乐播放器中添加了一个下载网络歌曲的功能,虽然还没有做到边下边播放的功能,不过总算是开了一个头了,下载功搞定了,离目标也就不远了。
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下载歌曲相关推荐
- android音乐播放器开发 SweetMusicPlayer 载入歌曲列表
上一篇写了播放器的总体实现思路,http://blog.csdn.net/huweigoodboy/article/details/39855653,如今来总结下载入歌曲列表. 代码地址:https: ...
- android 音乐播放器----歌词在线下载
本文来自CSDN丹丹博客,转载请必须注明出处: http://blog.csdn.net/dany1202/archive/2011/06/09/6533513.aspx 使用百度的歌词API,如: ...
- linux 音频播放器源码,Android音乐播放器源码
相当完整的Android音乐播放器,直接上效果图及源代码,自己欣赏,具体不再解释了,可以说是一个很给力的Android音乐播放器. 示例代码: /* * Copyright (C) 2009 Tele ...
- Android音乐播放器制作(二 )点击歌曲实现播放
上次我们实现了把手机里的音频扫描到,然后放在list集合里面,用ListView展示在手机界面上,如果没有看过的可以去看看本人的博客:Android音乐播放器制作(一)扫描本地音乐显示在手机上 这次是 ...
- Android音乐播放器开发(6)—ListView组件创建歌曲播放列表(内含原理分析)
1. 说明 源码已同步到Gitee仓库,GitHub仓库,觉得还不错的话帮忙点个"star"吧,非常感谢. 以往的文章 服务端:Android音乐播放器开发–服务端 登录:Andr ...
- Android音乐播放器歌手分类,本地音乐:歌曲分类模式比较_软件资讯软件评测-中关村在线...
■歌曲分类模式比较 用户需要在平板电脑本地存取歌曲,当歌曲的数量达到一个比较大的量级之后,如果没有针对本地音乐较大数量级的歌曲进行有效的分类,那么在您需要寻找一首特定歌曲的时候,您可能会遇到很大的麻烦 ...
- 基于android音乐播放器的设计
本科毕业论文(设计)诚信声明 本人郑重声明:所呈交的毕业论文(设计),题目<---基于android音乐播放器的设计----------->是本人在指导教师的指导下,进行研究工作所取得的成 ...
- 自编Win8风格Android音乐播放器应用源码(单机版)
用闲暇的两天时间,研究编写了一个类Win8风格的android音乐播放器,实现了大部分基本功能.下面看具体描述: 基本实现功能: 注意事项:Android系统版本须在2.2以上,保证手机安装有SD卡( ...
- android七大主流Android音乐播放器横向评测
随着智能手机和3G网络的普及,移动互联网日益成为人们生活娱乐的重心之一.在音乐领域,竞争也十分激烈,在PC之后,几大提供音乐服务的厂商正在加紧占据手机客户端. 本期我们在Android平台挑选了七家国 ...
- android 音乐播放器框架,Android音乐播放器 -- 实现框架
MediaPlayer 框架有两种方案 第一种是通过全局变量保存当前状态,触发状态后获取全局变量进行配置 第二种是通过intent,让 Media player service 和 activity之 ...
最新文章
- 修改python plot折线图的坐标轴刻度
- PLATFORM软件有限公司
- 偏差/方差、经验风险最小化、联合界、一致收敛
- Python 中reload一个文件时报错 ( reload() argument must be module)
- 最大值减最小值等于区间长度_呆哥数学每日一题 ——三角函数求余弦最小值...
- opencomm在c语言中的作用,使用OpenMPI从Fortran调用C语言
- 分压式静态工作点稳定电路
- 数据分析CSV模块的基本使用(以分析复杂的天气情况为例),附完整的Python代码及csv文件详解---数据可视化
- Excel 2016新增函数之IFS
- 使用raphael.js绘制中国地图
- 生日快乐网站_【总结 】文化自信源自基层贺房氏网站建站十五周年
- OC和Swift混合编程引用Pods管理的模块
- 网络核心之数据交换-报文、分组交换2
- 根据百度日历获取当年所有天数,以及判断今天是周几 以及是是节假日或者工作日,阴历阳历
- android通过经纬度获取地址,Android编程实现根据经纬度查询地址并对获取的json数据进行解析的方法...
- 2017初二上期中考试总结
- 计算机游戏动漫制作自我鉴定,关于游戏实习的自我鉴定
- GPT-3会是第一个通用人工智能吗?
- Win10系统打不开html文件,电脑无法打开html文件
- 网易云音乐实时计算平台设计及实践