【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

相关文章
|
3天前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
24 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
1天前
|
存储 Java API
Android系统 文件访问权限笔记
Android系统 文件访问权限笔记
8 1
|
1天前
|
移动开发 Java Unix
Android系统 自动加载自定义JAR文件
Android系统 自动加载自定义JAR文件
10 1
|
1天前
|
存储 缓存 安全
Android系统 应用存储路径与权限
Android系统 应用存储路径与权限
5 0
Android系统 应用存储路径与权限
|
1天前
|
存储 安全 Android开发
Android系统 自定义系统和应用权限
Android系统 自定义系统和应用权限
5 0
|
1天前
|
Shell Android开发
Android系统 adb shell push/pull 禁止特定文件
Android系统 adb shell push/pull 禁止特定文件
7 1
|
1天前
|
Android开发
Android源代码定制:添加customize.mk文件进行分项目和分客户的定制
Android源代码定制:添加customize.mk文件进行分项目和分客户的定制
2 0
|
6天前
|
缓存 移动开发 Android开发
构建高效Android应用:从优化用户体验到提升性能表现
【4月更文挑战第18天】 在移动开发的世界中,打造一个既快速又流畅的Android应用并非易事。本文深入探讨了如何通过一系列创新的技术策略来提升应用性能和用户体验。我们将从用户界面(UI)设计的简约性原则出发,探索响应式布局和Material Design的实践,再深入剖析后台任务处理、内存管理和电池寿命优化的技巧。此外,文中还将讨论最新的Android Jetpack组件如何帮助开发者更高效地构建高质量的应用。此内容不仅适合经验丰富的开发者深化理解,也适合初学者构建起对Android高效开发的基础认识。
3 0
|
6天前
|
移动开发 Android开发 开发者
构建高效Android应用:采用Kotlin进行内存优化的策略
【4月更文挑战第18天】 在移动开发领域,性能优化一直是开发者关注的焦点。特别是对于Android应用而言,由于设备和版本的多样性,确保应用流畅运行且占用资源少是一大挑战。本文将探讨使用Kotlin语言开发Android应用时,如何通过内存优化来提升应用性能。我们将从减少不必要的对象创建、合理使用数据结构、避免内存泄漏等方面入手,提供实用的代码示例和最佳实践,帮助开发者构建更加高效的Android应用。
8 0
|
8天前
|
缓存 移动开发 Java
构建高效的Android应用:内存优化策略
【4月更文挑战第16天】 在移动开发领域,尤其是针对资源有限的Android设备,内存优化是提升应用性能和用户体验的关键因素。本文将深入探讨Android应用的内存管理机制,分析常见的内存泄漏问题,并提出一系列实用的内存优化技巧。通过这些策略的实施,开发者可以显著减少应用的内存占用,避免不必要的后台服务,以及提高垃圾回收效率,从而延长设备的电池寿命并确保应用的流畅运行。