Android 下载文件至SD卡,并用progressBar显示下载进度

Android 下载文件至SD卡,并用progressBar显示下载进度


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.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.Toast;

public class ProgressBarActivity extends Activity {

	private final static String TAG = "MainActivity";
	private final static String downloadAddress = "http://e.hiphotos.baidu.com/image/w%3D2048/sign=96d9aaaf552c11dfded1b823571f63d0/eaf81a4c510fd9f9232a3825272dd42a2834a4b9.jpg";
	private final static String musicName = "美女.jpg";
	Button startButton = null;
	Button endButton = null;
	ProgressBar progressBar = null;
	Handler handler = null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.progressbar);
		startButton = (Button) this.findViewById(R.id.start);
		endButton = (Button) this.findViewById(R.id.end);
		progressBar = (ProgressBar) this.findViewById(R.id.progressBar);
		progressBar.setMax(100);
		startButton.setClickable(true);
		endButton.setClickable(false);
		handler = new Handler() {

			@Override
			public void handleMessage(Message msg) {
				int progress = msg.arg1;
				if (progress >= 99) {
					Toast.makeText(ProgressBarActivity.this,
							"download is finished", Toast.LENGTH_SHORT).show();
				}
				progressBar.setProgress(progress);
				super.handleMessage(msg);
			}
		};
		startButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// startOnClick();
				new Thread(runnable).start();
				Log.i(TAG, "StartButton is pressed.....");
				startButton.setClickable(false);
				endButton.setClickable(true);
			}
		});
		endButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				handler.removeCallbacks(runnable);
				Log.i(TAG, "EndButton is pressed.....");
				endButton.setClickable(false);
				startButton.setClickable(true);
			}
		});

	}

	Runnable runnable = new Runnable() {

		@Override
		public void run() {
			URL url = null;
			InputStream inputStream = null;
			FileOutputStream fileOutputStream = null;
			try {
				// 设置下载路径
				String path = Environment.getExternalStorageDirectory()
						.getAbsolutePath() + File.separator + musicName;
				// 检查SD卡状态
				if (Environment.getExternalStorageState().equals(
						Environment.MEDIA_MOUNTED)) {
					fileOutputStream = new FileOutputStream(path);
					url = new URL(downloadAddress);
					HttpURLConnection connection = (HttpURLConnection) url
							.openConnection();
					inputStream = connection.getInputStream();
					long total_length = connection.getContentLength();
					byte[] buf = new byte[1024];
					int len = 0;
					int now_length = 0;
					while ((len = inputStream.read(buf)) != -1) {
						fileOutputStream.write(buf, 0, len);
						now_length += len;
						Message msg = handler.obtainMessage();
						//计算下载进度
						msg.arg1 = ((int) ((now_length / (float) total_length) * 100));
						msg.sendToTarget();
					}
				} else {
					Toast.makeText(ProgressBarActivity.this,
							"Please check SD card", Toast.LENGTH_SHORT).show();
				}
			} catch (MalformedURLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} finally {
				try {
					if (inputStream != null)
						inputStream.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	};
}


别忘了要加上权限
<!-- sdCard增加删除与读写权限 -->
<uses-permission android:name="android.permission.INTERNET" />



    <!-- sdCard增加删除与读写权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一些关于在 Android Studio 中使用 ProgressBar 实现下载进度展示功能的建议。 首先,在布局文件中添加一个 ProgressBar 组件。例如,您可以在您的布局文件中添加如下代码: ``` <ProgressBar android:id="@+id/progressBar" android:layout_width="match_parent" android:layout_height="wrap_content" style="?android:attr/progressBarStyleHorizontal" android:progress="0" android:max="100"/> ``` 在这个代码中,我们定义了一个 id 为 progressBarProgressBar 组件,并设置其宽度为 match_parent,高度为 wrap_content。我们还设置了该组件的样式为 progressBarStyleHorizontal,并将其初始进度设置为 0,最大进度设置为 100。 接下来,在您的 Java 代码中,您需要实现一个异步任务来下载文件并更新 ProgressBar进度。例如,您可以编写如下代码: ``` private class DownloadTask extends AsyncTask<String, Integer, String> { // 在执行异步任务之前调用 @Override protected void onPreExecute() { super.onPreExecute(); // 在这里设置 ProgressBar 的初始状态 progressBar.setProgress(0); } // 在后台执行异步任务 @Override protected String doInBackground(String... urls) { int count; try { URL url = new URL(urls[0]); URLConnection connection = url.openConnection(); connection.connect(); int lengthOfFile = connection.getContentLength(); InputStream input = new BufferedInputStream(url.openStream()); OutputStream output = new FileOutputStream("/sdcard/file_name.extension"); byte data[] = new byte[1024]; long total = 0; while ((count = input.read(data)) != -1) { total += count; publishProgress((int) (total * 100 / lengthOfFile)); output.write(data, 0, count); } output.flush(); output.close(); input.close(); } catch (Exception e) { Log.e("Error: ", e.getMessage()); } return null; } // 在后台执行异步任务时更新进度 @Override protected void onProgressUpdate(Integer... progress) { super.onProgressUpdate(progress); progressBar.setProgress(progress[0]); } // 在异步任务执行完成后调用 @Override protected void onPostExecute(String result) { // 在这里设置 ProgressBar 的最终状态 progressBar.setProgress(100); } } ``` 在这个代码中,我们定义了一个名为 DownloadTask 的异步任务,并实现了它的 doInBackground() 方法来执行文件下载操作。我们还实现了 onProgressUpdate() 方法来更新 ProgressBar进度,并在任务执行完成后调用 onPostExecute() 方法来设置 ProgressBar 的最终状态。 最后,您可以在您的 Activity 中启动 DownloadTask 来执行文件下载操作并更新 ProgressBar进度。例如,您可以编写如下代码: ``` DownloadTask downloadTask = new DownloadTask(); downloadTask.execute("http://www.example.com/file_name.extension"); ``` 在这个代码中,我们实例化了一个 DownloadTask 对象,并调用其 execute() 方法来启动异步任务。您可以将 http://www.example.com/file_name.extension 替换为您要下载文件的 URL。 希望这些建议可以帮助您在 Android Studio 中使用 ProgressBar 实现下载进度展示功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值