【Android开发】网路编程及Internet应用-从指定网站上下载文件

利用前面学过的HttpUrlConnection和文件输入输出流来完成从Android端下载指定站点的文件。

写一个编辑框,用来输入要下载文件的URL路径,下面一个按钮,点击实现文件下载
res/layout/main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/ll1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <EditText android:id="@+id/url"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

	<Button android:id="@+id/button"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:text="下载"/>

</LinearLayout>

界面如图

MainActivity:

package com.example.test;  

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity{
	 private EditText UrlEdit;//获取一个输入url的编辑框对象
	 private Button button;//声明一个"发送POST请求"按钮对象
	 private Handler handler;//声明一个Handler对象
	 private boolean flag=false;//标记是否成功的变量
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        UrlEdit=(EditText)findViewById(R.id.url);
        button=(Button)findViewById(R.id.button);
        //为"下载"按钮添加单击事件监听
        button.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				//创建一个新线程用于从网络上获取文件
				new Thread(new Runnable(){

					@Override
					public void run() {
						try {
							String sourceUrl=UrlEdit.getText().toString();//获取下载地址
							URL url=new URL(sourceUrl);//创建下载地址对应的URL对象
							//创建一个连接
							HttpURLConnection conn=(HttpURLConnection)url.openConnection();
							InputStream is=conn.getInputStream();//获取输入流对象
							if(is!=null){
								String expandName=sourceUrl.substring(sourceUrl.lastIndexOf(".")+1,
										sourceUrl.length()).toLowerCase();//获取文件的拓展名
								String fileName=sourceUrl.substring(sourceUrl.lastIndexOf("/")+1,
										sourceUrl.lastIndexOf("."));//获取文件名
								//在SD卡上创建文件
								File file=new File("/sdcard/pictures/"+fileName+"."+expandName);
								FileOutputStream fos=new FileOutputStream(file);//创建一个文件输出流对象
								byte buf[]=new byte[1024];//创建一个字节数组
								//读取文件到输入流对象中
								while(true){
									int numread=is.read(buf);
									if(numread<=0){
										break;
									}else{
										fos.write(buf, 0, numread);
									}
								}
							}
							is.close();//关闭输入流对象
							conn.disconnect();//关闭连接
							flag=true;
						} catch (MalformedURLException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
							flag=false;
						} catch (IOException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
							flag=false;
						}
						Message m=handler.obtainMessage();//获取一个Message
						handler.sendMessage(m);//发送消息
					}

				}).start();//开启线程
			}

		});

        //重写Handler的handleMessage()方法,根据flag标记变量flag的值不同显示不同的提示
        handler=new Handler(){

			@Override
			public void handleMessage(Message msg) {
				if(flag){
					Toast.makeText(MainActivity.this, "文件下载完成!",
							Toast.LENGTH_SHORT).show();
				}else{
					Toast.makeText(MainActivity.this, "文件下载失败!",
							Toast.LENGTH_SHORT).show();
				}
				super.handleMessage(msg);
			}

        };
	}

}  

最后记得在AndroidManifest.xml配置文件中加入网络访问权限和向内存卡写文件的权限:

<!-- SD卡写入权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- 添加链接网络的权限 -->
<uses-permission android:name="android.permission.INTERNET"/>

运行实例,在下载地址编辑框中输入要下载文件的URL地址,单击下载按钮即可下载文件,下载成功后的文件保存在/sdcard/pictures/路径下。
注意,输入的URL路径必须真实存在且包含文件,不然就会下载失败。

这里我拿http://pics.sc.chinaz.com/files/pic/pic9/201505/apic12027.jpg做实验,里面是一个图片文件,如图

下载结果如图


转载请注明出处:http://blog.csdn.net/acmman/article/details/46489385

时间: 2024-11-10 07:53:25

【Android开发】网路编程及Internet应用-从指定网站上下载文件的相关文章

数据库-Android开发把知道的坐标显示到百度地图上

问题描述 Android开发把知道的坐标显示到百度地图上 如题所述,我从数据库中取出来上一次的坐标,怎么让它显示到百度地图上呀 解决方案 http://www.2cto.com/kf/201406/305878.html

Android开发艺术探索——第二章:IPC机制(上)

Android开发艺术探索--第二章:IPC机制(上) 本章主要讲解Android的IPC机制,首先介绍Android中的多进程概念以及多进程开发模式中常见的注意事项,接着介绍Android中的序列化机制和Binder,然后详细的介绍Bundle,文件共享,AIDL,Messenger,ContentProvider和Socker等进程间通讯的方法,为了更好的使用AIDL进行进程间通讯,本章引入了Binder连接池的概念,最后,本章讲解各种进程间通信方式的优缺点和使用场景,通过本章,可以让读者对

【Android开发】网路编程及Internet应用-使用WebView显示网页

Android提供了内置的浏览器,该浏览器使用了开源的WebKit引擎.WebKit不仅能够搜索网址.查看电子邮件,而且能够播放视频节目.在Android中,要使用内置的浏览器,需要通过WebView组件来实现.通过WebView组件可以轻松实现显示网页功能. 如何在Android中使用WebView组件: WebView组件使用方法同其它组件一样,既可以使用XML布局文件配置,也可以在java文件中通过new关键字创建.推荐使用XML布局文件配置,配置方法: <WebView android:

Android开发自学笔记(三):APP布局上_Android

hello,大家好,本文主要介绍如何开始开发一个美观.有情调.人见人爱的Android应用程序,已知我们在市面上有不少布局极其精美,在视觉上让人爱不释手的应用程序,如果让我们着手开发,我们该如何下手? 在移动互联网公司都有这样几个部门–UX/UE及UI,UX有的也称作UE是指做用户体验的是User Experience的缩写,这些人一般都毕业于美术学院专门搞设计,我们上面说到那些精美的程序往往都是由他们的手先设计出效果图,然后交由UI,也称GUI即Graphic User Interface或者

Android开发自学笔记(三):APP布局上

hello,大家好,本文主要介绍如何开始开发一个美观.有情调.人见人爱的Android应用程序,已知我们在市面上有不少布局极其精美,在视觉上让人爱不释手的应用程序,如果让我们着手开发,我们该如何下手? 在移动互联网公司都有这样几个部门–UX/UE及UI,UX有的也称作UE是指做用户体验的是User Experience的缩写,这些人一般都毕业于美术学院专门搞设计,我们上面说到那些精美的程序往往都是由他们的手先设计出效果图,然后交由UI,也称GUI即Graphic User Interface或者

Android中带有进度条百分比显示的可以从网络下载文件的适配器

http://blog.csdn.net/SunBo_Java/article/details/8234092 该Demo抛弃了ListView控件的使用,是直接使用ViewGroup或其子类进行多个子控件封装,从而达到修正多个附件同时下载时,列表中每个控件的显示错乱的问题(如有更好的方法,欢迎交流). 该Demo采用单线程下载模式,因为项目的需求,所以一直没改.大家可以直接将单线程改为多线程同步,因为该Demo中所用到的适配器就是根据多线程同步而设计的. 下面我会给出整个Demo的完整范例,但

【Android开发】经典范例1-在GridView中显示SD卡上的全部图片

实现一个在GridView中显示SD卡上的全部图片的实例. 在mian.xml布局文件中加入GridView组件,列数4,也就是每行显示4张图片 res/layout/main.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tool

编程-为什么我从开源网站上下载的源码全部都无法直接使用?

问题描述 为什么我从开源网站上下载的源码全部都无法直接使用? 好多的包都没有需要自己引入是网站的问题还是上传者的问题? 解决方案 一般开源都是maven工程,你把maven环境搭建好后就把对应jar包下载了就可以了 解决方案二: 另外,建议去github等口碑好的网站,它们是项目发布的第一来源,并且上面可以直接和作者互动,也有答疑.一些国内山寨小网站转贴过来,丢失文件,或者没有把作者的一些额外的说明文档贴过来,就看不懂了. 解决方案三: 你可以看一下开源代码对应的网站,如果是大的开源代码(如op

[转载红鱼儿]Delphi实现微信开发(3)如何使用multipart/form-data格式上传文件

开始前,先看下要实现的微信接口,上传多媒体文件,这个接口是用Form表单形式上传的文件.对我来说,对http的Form表单一知半解,还好,查到这个资料,如果你也和我一样,必须看看这篇文章. 在xalion窑主的指导下,我使用了indy自带的TIdMultiPartFormDataStre am类,来提交上传的文件. 如果使用indy的idhttp,则调用这个方法,即可以提交Form. function Post(AURL: string; ASource: TIdMultiPartFormDat