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;
}
}
}
}
相关推荐
使用android 自带的DownloadManager实现文件下载,兼容性强,代码简单,注释详细
android自带下载工具DownloadManager示例demo
本篇文章主要介绍了android中DownloadManager实现版本更新,监听下载进度实例。具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
使用DownloadManager 下载完 apk 自动提示安装的功能
这个广播接收者主要工作是把DownloadManager下载的文件拷贝到U盘中以解决在TVBox开发过程中想要直接把文件下载到U盘时产生的java.lang.SecurityException异常。没分的朋友可以直接前往:...
Android使用DownloadManager实现版本更新:http://luosifan.com/2014/09/21/Android-versionUpdate/
android系统DownloadManager下载工具类,进行封装处理,简单易用。
DownloadManager是系统开放给第三方应用使用的类,包含两个静态内部类DownloadManager.Query和DownloadManager.Request。DownloadManager.Request用来请求一个下载,DownloadManager.Query用来查询下载信息,这两个...
Android DownloadManager和自定义下载功能 ,简单易用
使用DownLoadManager实现Android文件下载功能。
之前一直都是自己写的自动更新下载,这次试了一下系统提供的DownloadManager下载类,发现非常方便也非常简单。就整理了一下分享给大家
android 文件下载DownloadManager,已经测试很好的例子
DownloadManager实现apk下载安装
Android DownLoadManager使用的小例子,主要使用DownloadManager.Request方法来下载文件,下载可在通知栏中显示
Android版本更新使用DownloadManager.
android DownloadManager 支持断点续传功能
主要介绍了Android中DownloadManager实现文件下载实例详解的相关资料,需要的朋友可以参考下
InternetDownloadManager 最新文件下载,最好用的下载工具。
DownloadManager(强制升级与自选升级.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。