Android下载文件到sdcard并显示进度条

这里介绍下如何用Android模拟器去创建一个sdcard,并且学习在Android中去下载一个网上的文件保存到sdcard中,同时在Android下载文件的时候会显示一个进度条。这些就是我们这一篇代码要实现的内容。

 

1:页面结构,提供一个button,点击BUTTON,去下载一个图片,main.xml设计如下:

 

2:主程序

package android.study;

import java.io.BufferedInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class AndroAsync extends Activity {
	public static final int DIALOG_DOWNLOAD_PROGRESS = 0;
	private Button startBtn;
	private ProgressDialog mProgressDialog;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		startBtn = (Button)findViewById(R.id.startBtn);
		startBtn.setOnClickListener(new OnClickListener(){
			public void onClick(View v) {
				startDownload();
			}
		});
	}
	
	private void startDownload() {
		String url = "http://www.android-study.com/image/logo.gif";
		new DownloadFileAsync().execute(url);
	}
	
	@Override
	protected Dialog onCreateDialog(int id) {
		switch (id) {
		case DIALOG_DOWNLOAD_PROGRESS:
			mProgressDialog = new ProgressDialog(this);
			mProgressDialog.setMessage("Downloading file..");
			mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
			mProgressDialog.setCancelable(false);
			mProgressDialog.show();
			return mProgressDialog;
		default:
			return null;
		}
	}
	
	class DownloadFileAsync extends AsyncTask {
		@Override
		protected void onPreExecute() {
			super.onPreExecute();
			showDialog(DIALOG_DOWNLOAD_PROGRESS);
		}
		
		@Override
		protected String doInBackground(String... aurl) {
			int count;
			try {
				URL url = new URL(aurl[0]);
				URLConnection conexion = url.openConnection();
				conexion.connect();
				int lenghtOfFile = conexion.getContentLength();
				Log.d("ANDRO_ASYNC", "Lenght of file: " + lenghtOfFile);
				InputStream input = new BufferedInputStream(url.openStream());
				OutputStream output = new FileOutputStream("/sdcard/picture.jpg");
				byte data[] = new byte[1024];
				long total = 0;
				while ((count = input.read(data)) != -1) {
					total += count;
					publishProgress(""+(int)((total*100)/lenghtOfFile));
					output.write(data, 0, count);
				}
				output.flush();
				output.close();
				input.close();
			}
			catch (Exception e) {
				Log.e("error",e.getMessage().toString());
				System.out.println(e.getMessage().toString());
			}
			return null;
		}
		protected void onProgressUpdate(String... progress) {
			Log.d("ANDRO_ASYNC",progress[0]);
			mProgressDialog.setProgress(Integer.parseInt(progress[0]));
		}
		
		@Override
		protected void onPostExecute(String unused) {
			dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
		}
	}
}

注意这里,在startdownload方法中,调用了DownloadFileAsync内部类,这个内部类充分利用了AsyncTask的异步工作特性,是很方便的,onProgressUpdate是让进度条完成后消失。

最后,要记得在androidmanifest.xml中的</application>后加入:

让应用有访问互联网权限。

 

3:下面讲解下其中用到的,把图片保存到sdcard中去,由于是模拟器,因此只能在磁盘上模拟一个IMG文件来模拟,步骤如下:

 

1) 打开cmd,进入Android SDK安装路径下的tools目录下,输入如下命令:

mksdcard 1024M sdcard.img

该命令会在当前目录下生成一个sdcard.img文件,该文件是Android模拟器的SD卡镜像文件。1024M表示SD卡有1024M大小,即1G容量。目前Android支持8M~128G的SD卡。

 

2) 运行带sdcard的模拟器

A 在cmd中启动带有sdcard的模拟器

进入Android SDK安装路径下的tools目录中,运行下面命令:

emulator -avd name_avd -sdcard sdcard.img

其中,name_avd是已有的模拟器的名字,sdcard.img是第一步创建的SD卡镜像文件。

B 在eclipse中,新建模拟器的时候,指定SD卡镜像文件的路径,并且加入对SD卡的支持选项

打开eclipse,进入:window->android SDK and AVD manager,然后在create avd的时候,在SD CARD中选择"FILE",然后再选择sd support;

 

3)如何看SDCARD中的文件

1)在cmd中,进入Android SDK的安装路径下的tools目录中,运行命令:

adb push E:abc.jpg sdcard/abc.jpg

其中,E:abc.jpg 是本地要上传的文件,sdcard/abc.jpg 为上传到SD卡中的路径。

注意:adb push 电脑路径 模拟器路径

在电脑路径中,必须使用“”,在模拟器路径中必须使用“/”,并且模拟器的根路径是只读的。

2 ) 在eclipse环境中

在设置了RUN的命令参数后,RUN一个应用程序,然后使用DDMS的File Explorer工具导入导出文件。打开DDMS工具,在eclipse的windows->Open Perspective->Other...里面打开DDMS工具,在DDMS工具的File Explorer标签里面选择sdcard目录导入导出文件。

暂无评论
  • 1:请一针见血的评论。
  • 2:评论需要审核通过后才能显示。
  • 3:评论字数限制在1000字以内。
  • 当前字数:0
热门文章