在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;

}

}

}

}

最后需要的权限是:

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

request.setShowRunningNotification(false);

request.setVisibleInDownloadsUi(false);

加入下面的权限:

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

android 调用下载,使用Android系统提供的DownloadManager来下载文件相关推荐

  1. Android 调用相册 拍照 实现系统控件缩放 切割图片

    android 下如果做处理图片的软件 可以调用系统的控件 实现缩放切割图片 非常好的效果 今天写了一个demo分享给大家. package cn.m15.test;import java.io.By ...

  2. android 调用微信语音识别,Android 仿微信语音识别

    参考于:Android模仿微信语音聊天功能,这代码跑起来有问题,自己改动了一下,基本上没什么大问题 先贴下效果图 1.三个布局文件 activity_main.xml dialog_manger.xm ...

  3. android调用js接口,Android代码和JavaScript互相调用

    WebView加载一个使用JavaScript的网页,并且要实现相互之间的调用,需要启用WebView对JavaScript的支持,一旦启用之后你就可以通过接口来实现本地代码和JavaScript代码 ...

  4. android调用web接口,Android调用WebService系列之请求调用

    好久没写博客,快有3年了.当初想在CTO把自己的技术文章一直延续,可却没有坚持! 开发Android网络App,通讯方式决定了你App所需的能力! 最近正在用Web Service进行通讯,那么就让我 ...

  5. android调用相机分辨率,Android菜鸟笔记-获取摄像头像素值

    前言: 获取摄像头的像素值,通过获取相机设置中支持拍照的最大宽度和最大高度就可算到摄像头的像素值了,当然跟手机厂商标称的还是有差别的.比如标称200W的通过计算1200*1600=1920000=19 ...

  6. android安装成功找不到指定文件夹,安装Android SDK报错:系统找不到指定的文件 解决办法...

    换了系统html Windows 7 64位,从新安装Android SDK,结果遇到了点小问题:java 在检测系统是否安装JDK的时候老是提示:Java SE Development Kit (J ...

  7. android调用日历库,Android学习教程之日历库使用(15)

    本教程为大家分享了Android日历库的使用方法,供大家参考,具体内容如下 MainActivity.java代码: package siso.weekv; import android.conten ...

  8. XP系统访问网页无法下载php,windowsxp系统下IE浏览器无法下载的解决方法

    IE是很多用户经常会使用到的一款浏览器,其本身自带下载功能.不过,最近一些windowsxp系统用户反馈电脑中IE浏览器下载功能突然不能用了,这该怎么办呢?下面是小编整理的一些有关IE浏览器不能下载的 ...

  9. android调用音量方法,android中获取当前音量大小

    android中获取当前音量大小 (2012-11-07 08:40:41) 标签: it 通过程序获取android系统手机的铃声和音量.同样,设置铃声和音量的方法也很简单! 设置音量的方法也很简单 ...

最新文章

  1. C++中函数重载分析
  2. 【小白学习PyTorch教程】十七、 PyTorch 中 数据集torchvision和torchtext
  3. oracle dbwr trace文件,ORA-01157: cannot identify/lock data file 19 - see DBWR trace file问题处理...
  4. Linux下CMAKE编译jsoncpp,c – 如何为jsoncpp编写cmake模块?
  5. 百度UEditor图片上传、SpringMVC、Freemarker、Tomcat、Nginx、静态资源
  6. CPDA项目数据分析师和CDA数据分析师有什么区别?
  7. 百度api翻译html,帮助文档首页
  8. arcgis数据导入mysql_ArcGIS Geodatabase教程:将数据导入到地理数据库
  9. Arduino时钟LCD显示
  10. Python猫眼电影数据采集与可视化分析实战
  11. 【生物信息学】正常和突变的蛋白质结构可视化?构建蛋白结构模型,常见的4种构建蛋白模型方法
  12. vue项目中将视频链接分享至推特的解决方法及踩坑记录
  13. 【001】光学系统的像质评价方法
  14. overflow属性的用法
  15. 线性代数笔记31——奇异值分解
  16. 搜狗大数据总监、Polarr 联合创始人关于深度学习的分享交流
  17. 《Long-term Recurrent Convolutional Networks for Visual Recognition and Description》论文翻译
  18. Python:类与结构体
  19. C#读写调整UVC摄像头画面-饱和度
  20. GIF制作器哪个好,如何制作表情包

热门文章

  1. Ansible介绍、安装、远程执行命令、拷贝文件或者目录、远程执行脚本
  2. 【二开】【JeecgBoot】修改分页参数
  3. 【Unity】励志成为最强UI仔—BeaverJoe项目之UI界面制作【上】代码优化-动态加载UI对象
  4. Hadoop百度百科
  5. Python基础之线程(Thread)
  6. Word粘贴快捷键不能用
  7. 【密码学-凯撒密码】
  8. 金蝶服务器响应异常,金蝶提示连接金蝶云服务器异常
  9. linux 网桥 权限,如何在 Ubuntu 上搭建网桥
  10. Zero-shot Learning / One-shot Learning