android下载实例

1、Androidmanifest.xml的文件一定要加上权限

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="chester.download"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk android:minSdkVersion="4" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:label="@string/app_name"
android:name=".DownLoadexample" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>

2、activity代码如下:

 

package chester.download;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
import chester.utils.HttpDownloader;

/**
 * 
 *@title        DownLoadexample
 *@describe		TODO 使用http协议下载txt文件和mp3文件
 *@author		Chester	
 *@date			2011-11-4
 *@version		V1.0
 */
public class DownLoadexample extends Activity {
	
	private Button downloadtxtButton =null;
	private Button downloadfilebuButton=null;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        /**
         * 得到两个button控件对象
         */
        downloadtxtButton=(Button)findViewById(R.id.downloadtxtbutton);
        downloadfilebuButton=(Button)findViewById(R.id.downloadmp3button);
        downloadtxtButton.setOnClickListener(new TxtButtonListener());
        downloadfilebuButton.setOnClickListener(new FileButtonListener());
    }
    
    /**
     * 
     *@title        TxtButtonLinstener
     *@describe		TODO 使用内部类实现TxtButtonLinstener监听器
     *@author		Chester	
     *@date			2011-11-4
     *@version		V1.0
     */
    class TxtButtonListener implements OnClickListener{

		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			//HttpDownloader 是自己写的类,封装起来,以后使用方便
			HttpDownloader httpDownloader=new HttpDownloader();
			//根据URL得到文件
			String str=httpDownloader.downloadfile("http://3g.sina.com.cn/");
			//得到的是sina的wap包wml语言
			System.out.println(str);
			Toast.makeText(DownLoadexample.this, str, Toast.LENGTH_LONG).show();
		}
    	
    }
    
    /**
     * 
     *@title        FileButtonListener
     *@describe		TODO 使用内部类实现Mp3ButtonLinstener监听器
     *@author		Chester	
     *@date			2011-11-4
     *@version		V1.0
     */
    
    class FileButtonListener implements OnClickListener{

		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			HttpDownloader httpDownloader=new HttpDownloader();
			int mp3int=httpDownloader.downloadFile("http://u.androidgame-store.com/android1/new/game1/24/110424/kwplayer_1.apk", "mymp3", "chester.apk");
			Toast.makeText(DownLoadexample.this, mp3int+"/", Toast.LENGTH_SHORT).show();
		}
    	
    }
}

 

  


3、HttpDownloader类的代码

package chester.utils;

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

/**
 * 
 *@title        HttpDownloader
 *@describe		TODO 根据URL下载文件类
 *					 1、首先创建一个URL对象
 *					 2、根据URL对象,创建一个HttpURLConnection对象
 *					 3、得到IputStream
 *					 4、从IputStream当中读取数据
 *@author		Chester	
 *@date			2011-11-4
 *@version		V1.0
 */
public class HttpDownloader {

	private URL url=null;
	
	/**
	 * 
	 *@title 		download
	 *@describe		TODO 根据url下载文件,前提是这个文件当中的内容是文本,函数返回值是这个文件的文本内容
	 *@param		@param urlsString
	 *@param		@return
	 *@throws
	 */
	public String downloadfile(String urlString) {
		
		StringBuffer stringBuffer=new StringBuffer();
		String line=null;
		BufferedReader bufferedReader=null;
		try {
			//创建一个URL对象
			url=new URL(urlString);
			//创建一个http连接
			HttpURLConnection urlConnection=(HttpURLConnection)url.openConnection();
			//使用IO流读取数据
			bufferedReader=new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
			while ((line=bufferedReader.readLine())!=null) {
				stringBuffer.append(line);
				
			}
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}finally{
			//下面还有加上try,有可能关不了
			try {
				bufferedReader.close();
			} catch (Exception e) {
				// TODO: handle exception
				e.printStackTrace();
			}
			
		}
		
		return stringBuffer.toString();
	}

	/**
	 * 
	 *@title 		downFile
	 *@describe		TODO 该函数可以下载任意文件。返回-1:代表下载文件出错,0:代表下载文件成功,1:代表文件已经存在
	 *@param		@param urString 网络地址
	 *@param		@param path     存放路径
	 *@param		@param fileName 存放文件名
	 *@param		@return
	 *@throws
	 */
	public int downloadFile(String urlStr,String path,String fileName) {
		InputStream inputStream=null;
		try {
			FileUtils fileUtils=new FileUtils();
			//判断文件是否存在,存在则返回1 path+"/"+fileName这个参数一定要写对。
			if (fileUtils.isFileExist(path+"/"+fileName)) {
				return 1;
			}else {
				//根据URL得到输入流
				inputStream=getInputStreamFromUrl(urlStr);
				File resultFile=fileUtils.write2SDFromInput(path, fileName, inputStream);
				if (resultFile==null) {
					//文件是空的就返回-1
					return -1;					
				}		
			}
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}finally{
			try {
				inputStream.close();
			} catch (Exception e2) {
				// TODO: handle exception
				e2.printStackTrace();
			}
		}
		return 0;
	}
	
	/**
	 * 
	 *@title 		getInputStreamFromUrl
	 *@describe		TODO 根据URL得到输入流
	 *@param		@param urlstr
	 *@param		@return
	 *@param		@throws MalformedURLException
	 *@param		@throws IOException
	 *@throws
	 */
	public InputStream getInputStreamFromUrl(String urlstr) throws MalformedURLException,IOException{
		url=new URL(urlstr);
		HttpURLConnection httpURLConnection=(HttpURLConnection)url.openConnection();
		InputStream inputStream=httpURLConnection.getInputStream();
		return inputStream;
	
		
	}
	
}

4、FileUtils代码

package chester.utils;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import android.os.Environment;

/**
 * 
 *@title        FileUtils
 *@describe		TODO
 *@author		Chester	
 *@date			2011-11-4
 *@version		V1.0
 */
public class FileUtils {

	//路径
	private String SDPATH;
	/**
	 * 
	 *@title 		getSDPATH
	 *@describe		TODO
	 *@param		@return
	 *@throws
	 */
	public String getSDPATH() {
		return SDPATH;
	}
	
	/**
	 * 
	 *@Title
	 *@describe		TODO 构造函数,得到SD当前目录
	 *@param
	 */
	public FileUtils(){
		//得到当前外部存储设备的目录
		// /SDCARD
		SDPATH=Environment.getExternalStorageDirectory()+"/";		
	}

	/**
	 * 
	 *@title 		createSDFile
	 *@describe		TODO 在SD卡中创建文件
	 *@param		@param fileName
	 *@param		@return
	 *@param		@throws IOException
	 *@throws
	 */
	public File createSDFile(String fileName) throws IOException{
		File file = new File(SDPATH + fileName);
		file.createNewFile();
		return file;
		
	}
	
	/**
	 * 
	 *@title 		createSDDir
	 *@describe		TODO 在SD卡上创建目录
	 *@param		@param fileName
	 *@param		@return
	 *@throws
	 */
	public File createSDDir(String fileName) {
		File dir =new File(SDPATH+fileName);
		dir.mkdir();
		return dir;
	}
	
	/**
	 * 
	 *@title 		isFileExist
	 *@describe		TODO 判定SD卡中的文件夹是否存在
	 *@param		@param fileName
	 *@param		@return
	 *@throws
	 */
	public boolean isFileExist(String fileName) {
		File file = new File(SDPATH + fileName);
		return file.exists();
	}
	
	/**
	 * 
	 *@title 		write2SDFromInput
	 *@describe		TODO 将一个inputstream的数据写入到SD卡中
	 *@param		@param path
	 *@param		@param fileName
	 *@param		@param inputStream
	 *@param		@return
	 *@throws
	 */
	public File write2SDFromInput(String path,String fileName,InputStream inputStream) {
		File file=null;
		OutputStream outputStream=null;
		
		try {
			//创建文件夹
			createSDDir(path);
		   //在path文件夹下创建文件,+"/"这个必须加
			file=createSDFile(path+"/"+fileName);
			outputStream=new FileOutputStream(file);
			//每一个以4K的速度写入
			byte buffer[]=new byte[4*1024];
			while ((inputStream.read(buffer))!=-1) {
				outputStream.write(buffer);
			}
			//清空一下缓存
			outputStream.flush();
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}finally{
			try {
				//把打开的流关闭掉
				outputStream.close();
			} catch (Exception e2) {
				// TODO: handle exception
				e2.printStackTrace();
			}
			
		}
		
		return file;
		
	}
	
}

  

  

  


posted @ 2011-11-04 19:08  蓝鸿鹄  阅读(787)  评论(0编辑  收藏  举报