本文共 3346 字,大约阅读时间需要 11 分钟。
自带播放器支持“边下载边播放”的功能,当你使用系统浏览器点击一个“MP3的下载链接”时,它就会自动播放这首歌曲并保存到本地(不知道用第三方浏览器是否也如此,笔者认为应该是系统浏览器会自动识别MP3下载链接,并调用系统播放器来播放)。
与这个过程类似,在笔者做的音乐播放器中,当用户选择“歌曲下载”时,会转到一个webview中,这里我将webview的初始url定向到“自定义”当点击MP3的下载链接时,就会将音乐下载到sdcard的根目录。webview所在 activity的代码如下:
Java代码: - 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文件,代码如下:
Java代码:
- public class DownLoadWebViewClient extends WebViewClient {
- private Context context;
- public DownLoadWebViewClient(Context context){
- this.context = context;
- }
-
- @Override
- public 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和音乐文件名,代码如下:
Java代码:
- 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; //是否停止下载,停止下载为true
- private Thread downThread; //下载线程
- private String musicName; //下载的文件名
-
- @Override
- public IBinder onBind(Intent intent) {
- return null;
- }
第二种:
在做的时候,其中有涉及到Android应用下载的功能,这个应用本身其实也比较简单,就是通过WebView控制调用相应的WEB页面进行展示。刚开始以为和普通的文件下载实现,只需要一个链接,然后点击就可以实现下载了,可是放到手机上试的时候,点击下载链接一点反应都没有,在普通页面里面点击是好的,且点击其它的普通链接是可以正常工作的。原来是因为WebView默认没有开启文件下载的功能,如果要实现文件下载的功能,需要设置WebView的DownloadListener,通过实现自己的DownloadListener来实现文件的下载。具体操作如下:
1、设置WebView的DownloadListener:
webView.setDownloadListener(new MyWebViewDownLoadListener());
2、实现MyWebViewDownLoadListener这个类,具体可以如下这样:
- private class MyWebViewDownLoadListener implements DownloadListener {
-
- @Override
- public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype,
- long contentLength) {
- Uri uri = Uri.parse(url);
- Intent intent = new Intent(Intent.ACTION_VIEW, uri);
- startActivity(intent);
- }
-
- }
这只是调用系统中已经内置的浏览器进行下载,还没有WebView本身进行的文件下载,不过,这也基本上满足我们的应用场景了。
转载地址:http://ppqci.baihongyu.com/