使用Android系统提供的DownloadManager来下载文件
程序员文章站
2024-03-01 12:20:52
在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"/>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: 在子页中隐藏模板页中的div示例代码
下一篇: Java随机数算法原理与实现方法实例详解