当前位置: 移动技术网 > 移动技术>移动开发>Android > 使用Android系统提供的DownloadManager来下载文件

使用Android系统提供的DownloadManager来下载文件

2019年07月24日  | 移动技术网移动技术  | 我要评论
在android2.3以后android系统提供了一个系统组件来供其他app调用来下载东西,使用起来非常方便。 例如我们可以拿来下载app的新版本apk,同时在同时注

在android2.3以后android系统提供了一个系统组件来供其他app调用来下载东西,使用起来非常方便。

例如我们可以拿来下载app的新版本apk,同时在同时注册一个广播接收器来接收下载完成时downloadmanager发出的的广播,然后自动安装程序。

sdk在api level 9中加入了downloadmanager服务,可以将长时间的下载任务交给系统,完全由系统管理。

直接看实例代码:

package com.hebaijun.downloadtest; 
 
import java.io.unsupportedencodingexception; 
import java.net.urlencoder; 
 
import android.app.activity; 
import android.app.downloadmanager; 
import android.app.downloadmanager.request; 
import android.content.broadcastreceiver; 
import android.content.context; 
import android.content.intent; 
import android.content.intentfilter; 
import android.content.sharedpreferences; 
import android.database.cursor; 
import android.net.uri; 
import android.os.bundle; 
import android.preference.preferencemanager; 
import android.util.log; 
import android.webkit.mimetypemap; 
 
public class downloadtestactivity extends activity { 
  private downloadmanager downloadmanager; 
  private sharedpreferences prefs; 
  private static final string dl_id = "downloadid"; 
  /** called when the activity is first created. */ 
  @override 
  public void oncreate(bundle savedinstancestate) { 
    super.oncreate(savedinstancestate); 
    setcontentview(r.layout.main); 
    downloadmanager = (downloadmanager)getsystemservice(download_service); 
    prefs = preferencemanager.getdefaultsharedpreferences(this);  
  } 
  @override 
  protected void onpause() { 
    // todo auto-generated method stub 
    super.onpause(); 
    unregisterreceiver(receiver); 
  } 
  @override 
  protected void onresume() { 
    // todo auto-generated method stub 
    super.onresume(); 
    if(!prefs.contains(dl_id)) {  
      string url = "http://10.0.2.2/android/film/g3.mp4"; 
      //开始下载  
      uri resource = uri.parse(encodegb(url));  
      downloadmanager.request request = new downloadmanager.request(resource);  
      request.setallowednetworktypes(request.network_mobile | request.network_wifi);  
      request.setallowedoverroaming(false);  
      //设置文件类型 
      mimetypemap mimetypemap = mimetypemap.getsingleton(); 
      string mimestring = mimetypemap.getmimetypefromextension(mimetypemap.getfileextensionfromurl(url)); 
      request.setmimetype(mimestring); 
      //在通知栏中显示  
      request.setshowrunningnotification(true); 
      request.setvisibleindownloadsui(true); 
      //sdcard的目录下的download文件夹 
      request.setdestinationinexternalpublicdir("/download/", "g3.mp4"); 
      request.settitle("移动g3广告");  
      long id = downloadmanager.enqueue(request);  
      //保存id  
      prefs.edit().putlong(dl_id, id).commit();  
    } else {  
      //下载已经开始,检查状态 
      querydownloadstatus();  
    }  
 
    registerreceiver(receiver, new intentfilter(downloadmanager.action_download_complete)); 
  } 
   
  /** 
   * 如果服务器不支持中文路径的情况下需要转换url的编码。 
   * @param string 
   * @return 
   */ 
  public string encodegb(string string) 
  { 
    //转换中文编码 
    string split[] = string.split("/"); 
    for (int i = 1; i < split.length; i++) { 
      try { 
        split[i] = urlencoder.encode(split[i], "gb2312"); 
      } catch (unsupportedencodingexception e) { 
        e.printstacktrace(); 
      } 
      split[0] = split[0]+"/"+split[i]; 
    } 
    split[0] = split[0].replaceall("\\+", "%20");//处理空格 
    return split[0]; 
  } 
   
  private broadcastreceiver receiver = new broadcastreceiver() {  
    @override  
    public void onreceive(context context, intent intent) {  
      //这里可以取得下载的id,这样就可以知道哪个文件下载完成了。适用与多个下载任务的监听 
      log.v("intent", ""+intent.getlongextra(downloadmanager.extra_download_id, 0)); 
      querydownloadstatus();  
    }  
  };  
   
  private void querydownloadstatus() {  
    downloadmanager.query query = new downloadmanager.query();  
    query.setfilterbyid(prefs.getlong(dl_id, 0));  
    cursor c = downloadmanager.query(query);  
    if(c.movetofirst()) {  
      int status = c.getint(c.getcolumnindex(downloadmanager.column_status));  
      switch(status) {  
      case downloadmanager.status_paused:  
        log.v("down", "status_paused"); 
      case downloadmanager.status_pending:  
        log.v("down", "status_pending"); 
      case downloadmanager.status_running:  
        //正在下载,不做任何事情 
        log.v("down", "status_running"); 
        break;  
      case downloadmanager.status_successful:  
        //完成 
        log.v("down", "下载完成"); 
        break;  
      case downloadmanager.status_failed:  
        //清除已下载的内容,重新下载 
        log.v("down", "status_failed"); 
        downloadmanager.remove(prefs.getlong(dl_id, 0));  
        prefs.edit().clear().commit();  
        break;  
      }  
    } 
  } 
} 

最后需要的权限是:

<uses-permission android:name="android.permission.internet"/>
<uses-permission android:name="android.permission.write_external_storage"/>

如果需要隐藏下载工具的提示和显示,修改代码:

request.setshowrunningnotification(false);
request.setvisibleindownloadsui(false);

加入下面的权限:

<uses-permission android:name="android.permission.download_without_notification"/>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网