现在的位置: 首页 > 综合 > 正文

文件下载

2013年05月01日 ⁄ 综合 ⁄ 共 2474字 ⁄ 字号 评论关闭

传统的文件下

  先来说一种简单地、传统的方式,即采用流的方式下载文件,步骤如下:

  建一个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
邮箱:theworldsong@foxmail.com

抱歉!评论已关闭.