Android系统下载DownloadManager

转载 2015年11月18日 18:03:07

本文地址:http://blog.csdn.net/whyrjj3/article/details/8000740

android2.3及以后,系统把内部的下载程序开放出来了。让我们可以使用DownloadManager这个类了。使用方法如下:


[java] view plaincopy
  1.     DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);  
  2.           
  3.     Uri uri = Uri.parse("fileUrl");  
  4.     Request request = new Request(uri);  
  5.   
  6.     //设置允许使用的网络类型,这里是移动网络和wifi都可以    
  7.     request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE|DownloadManager.Request.NETWORK_WIFI);    
  8.   
  9.     //禁止发出通知,既后台下载,如果要使用这一句必须声明一个权限:android.permission.DOWNLOAD_WITHOUT_NOTIFICATION    
  10.     //request.setShowRunningNotification(false);    
  11.   
  12.     //不显示下载界面    
  13.     request.setVisibleInDownloadsUi(false);  
  14.         /*设置下载后文件存放的位置,如果sdcard不可用,那么设置这个将报错,因此最好不设置如果sdcard可用,下载后的文件        在/mnt/sdcard/Android/data/packageName/files目录下面,如果sdcard不可用,设置了下面这个将报错,不设置,下载后的文件在/cache这个  目录下面*/  
  15. //request.setDestinationInExternalFilesDir(this, null, "tar.apk");  
  16. long id = downloadManager.enqueue(request);  
  17. //TODO 把id保存好,在接收者里面要用,最好保存在Preferences里面  

这里注意的是这时候程序就必须至少声明两个权限:

[html] view plaincopy
  1. <uses-permission android:name="android.permission.INTERNET" />    
  2.     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  


用这个方法有好处,用户可以控制下载的过程,即如果没有下载完,并且不想下载了,可以终止下载,并且可以注册一个广播接收者,如果文件一下载完,就可以接收到一个广播。然后可以得到下载后的文件的路径:


[java] view plaincopy
  1. package cn.dotcreate.testProcess;  
  2.   
  3. import android.app.DownloadManager;  
  4. import android.app.DownloadManager.Query;  
  5. import android.content.BroadcastReceiver;  
  6. import android.content.Context;  
  7. import android.content.Intent;  
  8. import android.database.Cursor;  
  9. import android.net.Uri;  
  10. import android.widget.Toast;  
  11.   
  12. public class CompleteReceiver extends BroadcastReceiver {  
  13.   
  14.     private DownloadManager downloadManager;  
  15.   
  16.     @Override  
  17.     public void onReceive(Context context, Intent intent) {  
  18.           
  19.         String action = intent.getAction();  
  20.         if(action.equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) {  
  21.             Toast.makeText(context, "下载完成了....", Toast.LENGTH_LONG).show();  
  22.               
  23.             long id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0);                                                                                      //TODO 判断这个id与之前的id是否相等,如果相等说明是之前的那个要下载的文件  
  24.             Query query = new Query();  
  25.             query.setFilterById(id);  
  26.             downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);  
  27.             Cursor cursor = downloadManager.query(query);  
  28.               
  29.             int columnCount = cursor.getColumnCount();  
  30.             String path = null;                                                                                                                                       //TODO 这里把所有的列都打印一下,有什么需求,就怎么处理,文件的本地路径就是path  
  31.             while(cursor.moveToNext()) {  
  32.                 for (int j = 0; j < columnCount; j++) {  
  33.                     String columnName = cursor.getColumnName(j);  
  34.                     String string = cursor.getString(j);  
  35.                     if(columnName.equals("local_uri")) {  
  36.                         path = string;  
  37.                     }  
  38.                     if(string != null) {  
  39.                         System.out.println(columnName+": "+ string);  
  40.                     }else {  
  41.                         System.out.println(columnName+": null");  
  42.                     }  
  43.                 }  
  44.             }  
  45.             cursor.close();  
  46.         //如果sdcard不可用时下载下来的文件,那么这里将是一个内容提供者的路径,这里打印出来,有什么需求就怎么样处理                                                   if(path.startsWith("content:")) {  
  47.                                cursor = context.getContentResolver().query(Uri.parse(path), nullnullnullnull);  
  48.                                columnCount = cursor.getColumnCount();  
  49.                                while(cursor.moveToNext()) {  
  50.                                     for (int j = 0; j < columnCount; j++) {  
  51.                                                 String columnName = cursor.getColumnName(j);  
  52.                                                 String string = cursor.getString(j);  
  53.                                                 if(string != null) {  
  54.                                                      System.out.println(columnName+": "+ string);  
  55.                         }else {  
  56.                             System.out.println(columnName+": null");  
  57.                         }  
  58.                     }  
  59.                 }  
  60.                 cursor.close();  
  61.             }  
  62.               
  63.         }else if(action.equals(DownloadManager.ACTION_NOTIFICATION_CLICKED)) {  
  64.             Toast.makeText(context, "点击<span style="font-family: 宋体; ">通知</span><span style="font-size: 10.5pt; text-indent: 21pt; font-family: 宋体; ">了....", Toast.LENGTH_LONG).show();</span>  
  65.         }  
  66.     }  
  67. }  

在清单里面注册当前这个receiver:

[html] view plaincopy
  1. <receiver android:name=".CompleteReceiver">  
  2.             <intent-filter>  
  3.                 <action android:name="android.intent.action.DOWNLOAD_COMPLETE"/>  
  4.                 <action android:name="android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED"/>  
  5.             </intent-filter>  
  6.         </receiver>  

    需要说明的是在如果手机的sdcard可用,那么在上面那一步里面的path就是sdcard上面的路径,如果sdcard不可用,那么那个路径将是一个内容提供者的路径。


Android系统内置下载器服务DownloadManager的使用

Android 程序开发中如果需要下载文件,除了自己程序内部实现下载外,还可以直接使用Android系统自带的下载器进行下载,使用系统下载器通常有两种方式,即浏览器直接下载和系统内置下载器Downlo...
  • xietansheng
  • xietansheng
  • 2016年09月25日 21:39
  • 12664

立即获得下载任务完成的消息通知。Android DownloadManager通过注册一个广播监听系统的广播事件完成此操作,在创建广播时候,需要指明过滤器为:DownloadManager.ACTIO

立即获得下载任务完成的消息通知。Android DownloadManager通过注册一个广播监听系统的广播事件完成此操作,在创建广播时候,需要指明过滤器为:DownloadManager.ACTIO...
  • sinat_30474567
  • sinat_30474567
  • 2016年08月16日 17:28
  • 615

Android DownloadManager下载完成事件监听(系列4)

 Android DownloadManager下载完成事件监听(系列4) 我在之前写了写一些关于Android DownloadManager 的文章: (系列1)《Android大数据、...
  • zhangphil
  • zhangphil
  • 2015年10月19日 13:08
  • 6149

android中DownloadManager实现版本更新,监听下载进度实例

DownloadManager简介 DownloadManager是Android 2.3(API level 9)用系统服务(Service)的方式提供了DownloadManager来处...
  • d_o_n_g2
  • d_o_n_g2
  • 2017年09月19日 11:37
  • 251

Android系统下载管理DownloadManager

转载: http://www.trinea.cn/android/android-downloadmanager/ http://www.trinea.cn/android/android-d...
  • zhangfei2018
  • zhangfei2018
  • 2015年07月15日 14:13
  • 1778

Android 使用系统自带的DownloadManager下载apk

首先扯点别的:清明节回了一趟黄岛,去了学校看了看,也是物是人非了呀。酒也没少喝,前天做了一夜的车早上9点多到上海,然后直接杀奔公司上班,也是没谁了。今天记录一下DownloadManager的使用。参...
  • leilifengxingmw
  • leilifengxingmw
  • 2017年04月06日 23:08
  • 1532

Android调用系统下载器DownloadManager

一、DownloadManager简单介绍 DownloadManager是系统开放给第三方应用使用的类,包含两个静态内部类DownloadManager.Query和DownloadManager....
  • lu1024188315
  • lu1024188315
  • 2016年06月29日 18:54
  • 4308

Android DownloadManager下载进度查询(系列3)

 Android DownloadManager下载进度查询(系列3) 我在之前写了写一些关于Android DownloadManager 的文章: (系列1)《Android大数据、...
  • zhangphil
  • zhangphil
  • 2015年10月19日 12:37
  • 3705

Android-你还在用downloadmanager更新下载-out了!!!

轻松搞定下载MyDownloadManager 序言:      软件更新想必大家都用过,很多是用友盟的下载,但是也有自己公司服务器下载的处理方式,本文主要讲解的是自己下载的处理方法       ...
  • u014610664
  • u014610664
  • 2016年07月09日 16:12
  • 13377

Android DownloadManager详解

转至:http://blog.csdn.net/sir_zeng/article/details/8983430 从Android 2.3(API level 9)开始Android用系统服务...
  • h183288132
  • h183288132
  • 2016年04月08日 11:41
  • 1450
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android系统下载DownloadManager
举报原因:
原因补充:

(最多只允许输入30个字)