android webview downloadManager 文件下载管理

android webview downloadManager 文件下载管理

2013年09月01日  ⁄ 综合 ⁄ 共 7429字 ⁄ 字号  小 中 大  ⁄ 评论关闭
id="cproIframe_u1788635_2" width="336" height="280" src="http://pos.baidu.com/acom?adn=3&at=231&aurl=&cad=1&ccd=24&cec=UTF-8&cfv=11&ch=0&col=zh-CN&conBW=0&conOP=1&cpa=1&dai=2&dis=0&ltr=&ltu=http%3A%2F%2Fwww.xuebuyuan.com%2F929369.html&lu_161=0&lunum=6&n=83099053_cpr&pcs=1366x642&pis=10000x10000&ps=326x909&psr=1366x768&pss=1366x346&qn=399dd936838e8819&rad=&rsi0=336&rsi1=280&rsi5=4&rss0=%23FFFFFF&rss1=%23FFFFFF&rss2=%230000ff&rss3=%23444444&rss4=%23008000&rss5=&rss6=%23e10900&rss7=&scale=&skin=tabcloud_skin_3&stid=5&td_id=1788635&titFF=%E5%AE%8B%E4%BD%93&titFS=12&titTA=left&tn=text_default_336_280&tpr=1432546553717&ts=1&version=2.0&xuanting=0&dtm=BAIDU_DUP2_SETJSONADSLOT&dc=2&di=u1788635&ti=android%20webview%20downloadManager%20%E6%96%87%E4%BB%B6%E4%B8%8B%E8%BD%BD%E7%AE%A1%E7%90%86%20%7C%20%E5%AD%A6%E6%AD%A5%E5%9B%AD&tt=1432546552595.1221.1349.1350" align="center,center" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true" style="margin: 0px; padding: 0px; border-width: 0px; background-color: transparent;">

一。downloadmanager类说明:

从Android 2.3开始新增了一个下载管理类,在SDK的文档中我们查找android.app.DownloadManager可以看到。下载管理类可以长期处理多个HTTP下载任务,客户端只需要给出请求的Uri和存放目标文件的位置即可,下载管理使用了一个AIDL服务器所以可以放心的在后台执行,同时实例化的方法需要使用getSystemService(Context.DOWNLOAD_SERVICE) ,Android123再次提醒使用API Level为9的用户可以轻松的通过新增的这个API实现Android平台上的文件下载操作。

DownloadManager类提供了以下几种方法来处理,

Java 代码   收藏代码
  1.   long  enqueue(DownloadManager.Request request)   //存入队列一个新的下载项  
  2.   
  3. ParcelFileDescriptor  openDownloadedFile(long id)  //打开一个下载后的文件用于读取,参数中的long型id是一个provider中的一条记录。  
  4.   
  5. Cursor  query(DownloadManager.Query query)  //查询一个下载,返回一个Cursor  
  6.   
  7. int  remove(long... ids)  //取消下载同时移除这些条从下载管理中。  

  我们可以看到提供的方法都比较简单,给我们操作的最终封装成为一个provider数据库的方式进行添加、查询和移除,但是对于查询和添加任务的细节,我们要看看DownloadManager.Request类和DownloadManager.Query 类了。

  一、DownloadManager.Request类的成员和定义

Java代码   收藏代码
  1. DownloadManager.Request  addRequestHeader(String header, String value)  // 添加一个Http请求报头,对于这两个参数,Android开发网给大家举个小例子,比如说User-Agent值可以为Android123或 Windows XP等等了,主要是给服务器提供标识。  
  2. DownloadManager.Request  setAllowedNetworkTypes(int flags)  //设置允许使用的网络类型,这一步Android 2.3做的很好,目前有两种定义分别为NETWORK_MOBILE和NETWORK_WIFI我们可以选择使用移动网络或Wifi方式来下载。  
  3. DownloadManager.Request  setAllowedOverRoaming(boolean allowed)  //对于下载,考虑到流量费用,这里是否允许使用漫游。  
  4. DownloadManager.Request  setDescription(CharSequence description)  //设置一个描述信息,主要是最终显示的notification提示,可以随便写个自己区别  
  5. DownloadManager.Request  setDestinationInExternalFilesDir(Context context, String dirType, String subPath)  //设置目标存储在外部目录,一般位置可以用 getExternalFilesDir()方法获取。  
  6. DownloadManager.Request  setDestinationInExternalPublicDir(String dirType, String subPath)  //设置外部存储的公共目录,一般通过getExternalStoragePublicDirectory()方法获取。  
  7. DownloadManager.Request  setDestinationUri(Uri uri)  //设置需要下载目标的Uri,可以是http、ftp等等了。  
  8. DownloadManager.Request  setMimeType(String mimeType)  //设置mime类型,这里看服务器配置,一般国家化的都为utf-8编码。  
  9. DownloadManager.Request  setShowRunningNotification(boolean show)  //是否显示下载进度的提示  
  10. DownloadManager.Request  setTitle(CharSequence title)  //设置notification的标题  
  11. DownloadManager.Request  setVisibleInDownloadsUi(boolean isVisible)  //设置下载管理类在处理过程中的界面是否显示  

  当然了Google还提供了一个简单的方法来实例化本类,这个构造方法为DownloadManager.Request(Uri uri) ,我们直接填写一个Uri即可,上面的设置使用默认情况。

二、DownloadManager.Query类

  对于当前下载内容的状态,我们可以使用DownloadManager.Query类来获取,本类比较简单,仅仅提供了两个方法。

Java代码   收藏代码
  1. DownloadManager.Query  setFilterById(long... ids)  //根据id来过滤查找。  
  2. DownloadManager.Query  setFilterByStatus(int flags) //根据任务的状态来查找。  

  详细的状态在android.app.DownloadManager类中有定义,目前Android 2.3中的定义为:

Java代码   收藏代码
  1. int STATUS_FAILED 失败  
  2. int STATUS_PAUSED 暂停  
  3. int STATUS_PENDING 等待将开始  
  4. int STATUS_RUNNING 正在处理中  
  5. int STATUS_SUCCESSFUL 已经下载成功  

最后Android开发网提醒大家要说的是因为DownloadManager类提供的query方法返回一个Cursor对象,这些状态保存在这个游标的COLUMN_STATUS 字段中。

  1. 下载的状态完成均是以广播的形式通知大家,目前API Level为9定义了下面三种Intent的action

Java代码   收藏代码
  1. ACTION_DOWNLOAD_COMPLETE下载完成的动作。  
  2. ACTION_NOTIFICATION_CLICKED 当用户单击notification中下载管理的某项时触发。  
  3. ACTION_VIEW_DOWNLOADS 查看下载项  

  2. 对于一个尚未完成的项,在Cursor中我们查找COLUMN_REASON字段,可能有以下定义:

Java代码   收藏代码
  1. int ERROR_CANNOT_RESUME 不能够继续,由于一些其他原因。  
  2. int ERROR_DEVICE_NOT_FOUND 外部存储设备没有找到,比如SD卡没有插入。  
  3. int ERROR_FILE_ALREADY_EXISTS 要下载的文件已经存在了,Android123提示下载管理类是不会覆盖已经存在的文件,所以如果需要重新下载,请先删除以前的文件。  
  4.   
  5. int ERROR_FILE_ERROR 可能由于SD卡原因导致了文件错误。  
  6. int ERROR_HTTP_DATA_ERROR 在Http传输过程中出现了问题。  
  7. int ERROR_INSUFFICIENT_SPACE 由于SD卡空间不足造成的   
  8.   
  9. int ERROR_TOO_MANY_REDIRECTS 这个Http有太多的重定向,导致无法正常下载  
  10. int ERROR_UNHANDLED_HTTP_CODE 无法获取http出错的原因,比如说远程服务器没有响应。  
  11. int ERROR_UNKNOWN 未知的错误类型.  

3. 有关暂停的一些状态,同样COLUMN_REASON字段的值可能是以下定义

Java代码   收藏代码
  1. int PAUSED_QUEUED_FOR_WIFI 由于移动网络数据问题,等待WiFi连接能用后再重新进入下载队列。  
  2. int PAUSED_UNKNOWN 未知原因导致了任务下载的暂停.  
  3. int PAUSED_WAITING_FOR_NETWORK 可能由于没有网络连接而无法下载,等待有可用的网络连接恢复。.  
  4. int PAUSED_WAITING_TO_RETRY 由于重重原因导致下载暂停,等待重试。  

  有关Android 2.3中新增的下载管理DownloadManager的介绍基本上已经完全讲完,如果你对Cursor、Provider这些基础概念了解的话,可以看到这个下载管理类可以帮我们减少很多不必要的代码编写

二。用downloadManager 下载:

    public void onDownloadStart(String url, String userAgent,
            String contentDisposition, String mimetype, long contentLength) {

        AppUtils.LogD(mimetype);

        // download file
        DownloadManager downloadManager = ((DownloadManager) activity
                .getSystemService(Activity.DOWNLOAD_SERVICE));
        Request request = new Request(Uri.parse(url));

        // set request header, 如session等
            request.addRequestHeader("Accept",
                    "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
            request.addRequestHeader("Accept-Language", "en-us,en;q=0.5");
            request.addRequestHeader("Accept-Encoding", "gzip, deflate");
            request.addRequestHeader("Accept-Charset",
                    "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
            request.addRequestHeader("Cache-Control", "max-age=0");

            String host = "";
            try {
                host = new URL(url).getHost();
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }

            String cookieStr = CookieManager.getInstance().getCookie(host);
            if (!AppUtils.isEmpty(cookieStr)) {
                request.addRequestHeader("Cookie", cookieStr + "; AcSe=0");
            }

            // generate filename dynamically
            String fileName = contentDisposition.replaceFirst(
                    "attachment; filename=", "");
            request.setDestinationInExternalPublicDir(
                    Environment.DIRECTORY_DOWNLOADS, fileName);

        downloadManager.enqueue(request);
    }

三。判断download finished:

         BroadcastReceiver receiver = new BroadcastReceiver() {
             @Override
             public void onReceive(Context context, Intent intent) {
                 String action = intent.getAction();
                 if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
                     long downloadId = intent.getLongExtra(
                             DownloadManager.EXTRA_DOWNLOAD_ID, 0);
                     Query query = new Query();
                     query.setFilterById(enqueue);
                     Cursor c = dm.query(query);
                     if (c.moveToFirst()) {
                         int columnIndex = c
                                 .getColumnIndex(DownloadManager.COLUMN_STATUS);
                         if (DownloadManager.STATUS_SUCCESSFUL == c
                                 .getInt(columnIndex)) {
 
                             ImageView view = (ImageView) findViewById(R.id.imageView1);
                             String uriString = c
                                     .getString(c
                                             .getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
                             view.setImageURI(Uri.parse(uriString));
                         }
                     }
                 }
             }
         };
 
         registerReceiver(receiver, new IntentFilter(
                 DownloadManager.ACTION_DOWNLOAD_COMPLETE));

四。获取系统download history list:

            Intent i = new Intent(DownloadManager.ACTION_VIEW_DOWNLOADS);
            startActivity(i);

五。 获得刚下载的文件 和 打开该文件:

    protected String getDownloadedFileName() {

        String fileName = "";

        DownloadManager downloadManager = (DownloadManager) activity
                .getSystemService(Activity.DOWNLOAD_SERVICE);
        DownloadManager.Query query = new DownloadManager.Query();
        query.setFilterByStatus(DownloadManager.STATUS_SUCCESSFUL);

        Cursor c = downloadManager.query(query);
        if (c.moveToFirst()) {
            fileName = c.getString(c
                    .getColumnIndex(DownloadManager.COLUMN_TITLE));
        }

        return fileName;
    }

    public void openFileFromSDCard(String fileStr, String mimeType) {
        Intent intent = new Intent();
        intent.setAction(android.content.Intent.ACTION_VIEW);
        File file = new File(fileStr);
        intent.setDataAndType(Uri.fromFile(file), mimeType);
        activity.startActivity(intent);
    }



转载:http://www.xuebuyuan.com/929369.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值