传统的文件下载
先来说一种简单地、传统的方式,即采用流的方式下载文件,步骤如下:
建一个HttpURLConnection的对象,可以通过URL对象的openConnection()方法获取,例如:HttpURLConnection urlConn = (HttpURLConnection)url.openconnection();
获取一个InputStream对象:urlConn.getInputStream()。有了InputStream,剩下的都是Java的标准I/O操作。
示例代码如下:
int data = 0; //目标文件地址为SD卡根目录,文件名为baidu.jpg File file = new File(Environment.getExternalStorageDirectory(),"baidu.jpg"); //输出流地址 FileOutputStream fos = new FileOutputStream(file); URL url = new URL("http://www.baidu.com/img/bdlogo.gif"); //开始请求 HttpURLConnection urlConn = (HttpURLConnection) url.openConnection(); //状态码。一般检测是否为200,如果是则继续。此处省略代码。 Log.i("code",""+urlConn.getResponseCode()); //获取输入流 InputStream is = urlConn.getInputStream(); //一个字节一个字节地写入,如果读取完毕,返回-1,while终止 while( (data=is.read())!=-1 ){ fos.write(data); } fos.flush(); fos.close();
记得在Androidmanifest.xml添加以下权限(网络权限/SD卡读写权限)
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <application> .... </application>
使用DownloadManager管理下载
在Android 2.3引入了DownloadManager可以处理复杂的文件下载,包括检查用户是否有数据联系(WIFI或者移动数据),当用户从一个有数据连接的地方移动到无连接的地方(例如离开了wifi或者3G data的access point),确保设备在下载过程中保持awake状态。DownloadManager可以处理HTTP URLs,但是不能处理HTTPS(SSL) URLs。注意,由于不支持2.3之前的版本,因此该功能只能在2.3或者更高版本的API上使用。
第一步,不要忘记在Androidmanifest.xml中添加权限:
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <application> .... </application>java源码如下,所有解释均在注释中体现:
long lastDownloadId = 0; // 步骤1 : 获取系统服务,并指明是下载服务,即DownloadManager。 DownloadManager mgr = (DownloadManager)getSystemService(DOWNLOAD_SERVICE); //注意,这个Uri是android.net.Uri,而不是java.net.URI Uri uri = Uri.parse("http://www.baidu.com/img/bdlogo.gif"); //步骤2: 通过向下载服务发出enqueue()的请求,将放在下载队列中,通常会触发立即下载,并返回下载的ID号 //根据这个号,可以查询相关的下载情况。分别设置请求的Uri,允许的数据访问方式,是否允许漫游,本地存储的位置,以及为这个下载设置title和描述信息。 lastDownloadId = mgr.enqueue(new DownloadManager.Request(uri) //可在移动网络和WIFI情况下下载。注意使用的是位运算符 .setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | DownloadManager.Request.NETWORK_WIFI) //缺省是true,true的情况下若是漫游也同样下载 .setAllowedOverRoaming(false) //下载任务的标题 .setTitle("MyTest") //下载任务的小标题 .setDescription("Something Useful") //第一个参数为路径,默认路径"/"即为SD卡根目录;第二个参数为目标文件名 .setDestinationInExternalPublicDir("/", "baidu111.gif"));
注意,对于任何的Internet访问都不建议在主线程中进行。否则会导致5秒卡死(Android程序若主程序在五秒钟内仍没有响应,就会被认为是卡死,请求退出)。
以上部分内容转载或参考来源如下:
http://blog.csdn.net/flowingflying/article/details/6925683
在此表示感谢。
转载请注明来源,版权归原作者所有,未经同意严禁用于任何商业用途。
微博:http://weibo.com/theworldsong
邮箱:[email protected]