博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WebView download 文件
阅读量:4056 次
发布时间:2019-05-25

本文共 3346 字,大约阅读时间需要 11 分钟。

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

  与这个过程类似,在笔者做的音乐播放器中,当用户选择“歌曲下载”时,会转到一个webview中,这里我将webview的初始url定向到“自定义”当点击MP3的下载链接时,就会将音乐下载到sdcard的根目录。webview所在 activity的代码如下:
Java代码:
  1. setContentView(R.layout.web);
  2. web = (WebView)findViewById(R.id.web);
  3. web.setWebViewClient(new DownLoadWebViewClient(this));
  4. WebSettings s = web.getSettings();
  5. s.setSaveFormData(false);
  6. s.setSavePassword(false);
  7. s.setUseWideViewPort(true);
  8. s.setJavaScriptEnabled(true);
  9. s.setLightTouchEnabled(true);
  10. web.setWebChromeClient(new WebChromeClient() {
  11. public void onProgressChanged(WebView view, int progress) {
  12. //Activity和Webview根据加载程度决定进度条的进度大小
  13. //当加载到100%的时候 进度条自动消失
  14. context.setProgress(progress * 100);
  15. }
  16. });
  17. 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代码:
  1. public class DownLoadWebViewClient extends WebViewClient {
  2. private Context context;
  3. public DownLoadWebViewClient(Context context){
  4. this.context = context;
  5. }
  6. @Override
  7. public boolean shouldOverrideUrlLoading(WebView view, String url) {
  8. Log.i("info", "open an url");
  9. String urlStr = "";
  10. //存放解码后的url
  11. //如果是utf8编码
  12. if (isUtf8Url(url)){
  13. urlStr = Utf8URLdecode(url);
  14. //如果不是utf8编码
  15. } else {
  16. urlStr = URLDecoder.decode(url);
  17. }
  18. //如果链接是下载top100.cn中的mp3文件
  19. if (url.substring(url.length()-4).equals(".mp3")&&url.substring(7,10).equals("221")){
  20. Log.i("info", "mp3 file");
  21. String ss[] = urlStr.split("/");
  22. String musicName = ss[ss.length-1]; //得到音乐文件的全名(包括后缀)
  23. Log.i("info", "musicfile: " + musicName);
  24. //将下载链接和文件名传递给下载模块
  25. Intent intent = new Intent(context,DownLoadService.class);
  26. intent.putExtra("url", url);
  27. intent.putExtra("musicName", musicName);
  28. context.startService(intent);
  29. }
  30. return super.shouldOverrideUrlLoading(view, url);
  31. }
复制代码
这里略去了url解码的相关方法。其中DownLoadService用于下载MP3文件并在,它接收DownLoadWebViewClient传递来的url和音乐文件名,代码如下:
Java代码:
  1. public class DownLoadService extends Service implements Runnable{ //实现Runable接口
  2. private String URL_str; //网络歌曲的路径
  3. private File download_file; //下载的文件
  4. private int total_read = 0; //已经下载文件的长度(以字节为单位)
  5. private int readLength = 0; //一次性下载的长度(以字节为单位)
  6. private int music_length = 0; //音乐文件的长度(以字节为单位)
  7. private boolean flag = false; //是否停止下载,停止下载为true
  8. private Thread downThread; //下载线程
  9. private String musicName; //下载的文件名
  10. @Override
  11. public IBinder onBind(Intent intent) {
  12. return null;
  13. }

第二种:

  在做的时候,其中有涉及到Android应用下载的功能,这个应用本身其实也比较简单,就是通过WebView控制调用相应的WEB页面进行展示。刚开始以为和普通的文件下载实现,只需要一个链接,然后点击就可以实现下载了,可是放到手机上试的时候,点击下载链接一点反应都没有,在普通页面里面点击是好的,且点击其它的普通链接是可以正常工作的。原来是因为WebView默认没有开启文件下载的功能,如果要实现文件下载的功能,需要设置WebView的DownloadListener,通过实现自己的DownloadListener来实现文件的下载。具体操作如下:

    1、设置WebView的DownloadListener:

    webView.setDownloadListener(new MyWebViewDownLoadListener());

    2、实现MyWebViewDownLoadListener这个类,具体可以如下这样:    

[java]
  1. private class MyWebViewDownLoadListener implements DownloadListener {  
  2.   
  3.         @Override  
  4.         public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype,  
  5.                                     long contentLength) {  
  6.             Uri uri = Uri.parse(url);  
  7.             Intent intent = new Intent(Intent.ACTION_VIEW, uri);  
  8.             startActivity(intent);  
  9.         }  
  10.   
  11.     }  
    这只是调用系统中已经内置的浏览器进行下载,还没有WebView本身进行的文件下载,不过,这也基本上满足我们的应用场景了。

转载地址:http://ppqci.baihongyu.com/

你可能感兴趣的文章
GitHub 优秀的 Android 开源项目
查看>>
vim修改文件格式,查看不可见字符等
查看>>
House Robber
查看>>
Reverse Words in a String
查看>>
LinkedHashMap和HashMap的比较使用
查看>>
LRU Cache
查看>>
Longest Valid Parentheses
查看>>
Multiply Strings
查看>>
Number of Islands
查看>>
Binary Tree Right Side View
查看>>
Rotate List
查看>>
Remove Duplicates from Sorted List II
查看>>
Spiral Matrix
查看>>
Sudoku Solver
查看>>
Bitwise AND of Numbers Range
查看>>
Happy Number
查看>>
Remove Linked List Elements
查看>>
Count Primes
查看>>
Isomorphic Strings
查看>>
Reverse Linked List
查看>>