文件下载主要代码也不多,使用原生的DownloadManage来实现该功能:
AndroidManifest中添加权限
<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />网络访问权限是必须的,下载地址为sdcard的话需要添加sdcard写权限。
// 测试文件下载地址(格式为http://..../文件名.文件类型)
String url = "http://soft3.xzstatic.com//1210/BatchDoc_DownZa.Cn.rar";
// 实例化requset对象
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
// 设置在什么网络情况下进行下载(默认为任意网络)
// request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE);
// 设置通知栏标题(手机系统不同,有些可能不显示;这里设置的是下载完成后仍然显示,还有完成后就不显示的等)
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
// 设置下载时通知显示的标题
request.setTitle(getFileName(url));
// 设置下载时通知显示的提示
request.setDescription("正在下载");
// 用于设置漫游状态下是否可以下载
request.setAllowedOverRoaming(false);
// 设置文件存放目录(前一个为文件保存路径,可自定义;后一个为保存后的文件名及类型)
request.setDestinationInExternalPublicDir("/" + ConfigUtil.ROOT_FILE + "/download/", getFileName(url));
// 获取系统通知服务
downManager = (DownloadManager)getSystemService(Context.DOWNLOAD_SERVICE);
// 获取每一条通知的id(唯一)
id = downManager.enqueue(request);
DownLoadCompleteReceiver receiver = new DownLoadCompleteReceiver();
// 注册下载完成/未完成的广播
LeaderDetailActivity.this.registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
LeaderDetailActivity.this.registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_NOTIFICATION_CLICKED));
// 广播响应事件
private class DownLoadCompleteReceiver extends BroadcastReceiver {
@Override public void onReceive(Context context, Intent intent) { if(intent.getAction().equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)){ // 下载成功操作 }else if(intent.getAction().equals(DownloadManager.ACTION_NOTIFICATION_CLICKED)){ downManager.remove(id); // 下载取消(在未完成时点击通知触发) } } } // 获取文件名与类型
public String getFileName(String pathandname){ // 获取链接中最后一个/的下标 int start = pathandname.lastIndexOf("/"); int end = pathandname.lastIndexOf("."); if(start != -1 && end != -1){ return pathandname.substring(start+1,pathandname.length()); //截取获得:文件名.文件类型 }else{ return null; } }