`

下载网络文件到SD卡上

阅读更多
下面一个一个类的来进行介绍:
1.DownLoadProgress.java主控件界面:
package cn.com;

import android.app.Activity;
import android.media.MediaPlayer;
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.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

public class DownLoadProgress extends Activity {

	private Button download;// 下载按钮
	private MediaPlayer mMediaPlayer;
	Thread downThread;// 下载子线程
	private ProgressBar myProgressBar;//显示进度条的ProgressBar
	TextView resultView;
	//子线程发送消息给UI线程来更新ProgressBar的进度
	private Handler handler = new Handler() {
		public void handleMessage(Message msg) {
			if (!Thread.currentThread().isInterrupted()) {
				switch (msg.what) {
				case 1:
					int size = msg.getData().getInt("size");
					myProgressBar.setProgress(size);// 设置当前刻度
					int result = (int) (((float) myProgressBar.getProgress() / (float) myProgressBar
							.getMax()) * 100);
					resultView.setText(result + "%");
					if (myProgressBar.getMax() == myProgressBar.getProgress()) {
						Toast.makeText(DownLoadProgress.this, R.string.success,
								1).show();
					}
					break;
				case -1:
					String error = msg.getData().getString("error");
					Toast.makeText(DownLoadProgress.this, error, 1).show();
					break;
				}

			}
			super.handleMessage(msg);
		}
	};

	public Thread getThreadInstance() {
		return downThread;
	}

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		//在SD卡上新建文件夹来进行文件存储
		DirectoryHelper fileHelper = new DirectoryHelper();
		fileHelper.getSdCardPath();

		myProgressBar = (ProgressBar) findViewById(R.id.progressBar);
		resultView = (TextView) findViewById(R.id.result);

		download = (Button) findViewById(R.id.download);
		download.setOnClickListener(new OnClickListener() {
			public void onClick(View v) {
				downLoadVideo();
			}
		});
	}

	//新起一个线程进行文件下载
	public void downLoadVideo() {
		mMediaPlayer = new MediaPlayer();
		// Sets the audio stream type for this MediaPlayer
		mMediaPlayer.setAudioStreamType(2);
		MediaPlayerListener listener = new MediaPlayerListener();
		listener.setAllListener(mMediaPlayer);

		ThreadForRunnable thread = new ThreadForRunnable(this, myProgressBar,
				handler);
		new Thread(thread).start();
	}
}

2.当启动一个新线程后,就调用ThreadForRunnable类,此类实现了Runnable接口的类,就调用此类的run方法: ThreadForRunnable.java文件内容:
package cn.com;

import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.ProgressBar;

public class ThreadForRunnable implements Runnable {
	String TAG = "***********************";

	Context con;
	ProgressBar myProgressBar;
	Handler handler;

	public ThreadForRunnable(Context con, ProgressBar myProgressBar,
			Handler handler) {
		this.con = con;
		this.myProgressBar = myProgressBar;
		this.handler = handler;
	}

	@Override
	public void run() {

		// http://lh5.ggpht.com/_2N-HvtdpHZY/SYjwSZO8emE/AAAAAAAABGI/EHe7N52mywg/s144-c/20090129.jpg
		// http://forum.ea3w.com/coll_ea3w/attach/2008_10/12237832415.3gp
		//String url = "http://www.dubblogs.cc:8751/Android/Test/Media/3gp/test.3gp";
		//String url = "http://net.itcast.cn/QQWubiSetup.exe";
		String url = "http://wd.ggzx.net/myfile/xinge/wozaizheli.mp3";
		try {
			// 在线程运行中,调用自定义函数抓下文件
			VideoDownload vd = new VideoDownload(con, url, handler);
			vd.setDataSource1();
			//vd.setDataSource1();// 下特定视频文件
			//vd.setDataSource2();//下载exe文件
			//vd.setDataSource();// 下载apk文件
			//vd.videoGet();
			myProgressBar.setMax((int) vd.getFileSize());// 设置进度条的最大刻度
		} catch (Exception e) {
			Message msg = new Message();
			msg.what = -1;
			msg.getData().putString("error", "下载失败");
			handler.sendMessage(msg);
			Log.e(TAG, e.toString());
		}

	}

}



3.VideoDownload.java这个类文件主要是对各种文件进行下载的一些方法,里面我只使用了setDataSource1()方法,其他的方法,大家可以自己进行测试:
package cn.com;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

public class VideoDownload {
	String TAG = "***********************";
	Context con;
	private String downloadUrl;// 下载路径
	File dFile1;
	FileOutputStream outs1;
	private long fileSize = 0;// 原始文件大小
	Handler handler;

	/**
	 * 获取文件大小
	 * 
	 * @return
	 */
	public long getFileSize() {
		return fileSize;
	}

	public VideoDownload(Context con, String url, Handler handler) {
		this.con = con;
		this.downloadUrl = url;
		this.handler = handler;
	}

	public void videoGet() {//下载一个视频
		try {
			DefaultHttpClient httpclient = new DefaultHttpClient();
			HttpResponse response;
			HttpPost httpost = new HttpPost(Constants.videoURL);
			List<NameValuePair> nvps = new ArrayList<NameValuePair>();
			nvps.add(new BasicNameValuePair("type", "video"));
			nvps.add(new BasicNameValuePair("id", String.valueOf(29)));
			nvps.add(new BasicNameValuePair("fileId", String.valueOf(1)));
			httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
			// This is always a final response
			response = httpclient.execute(httpost);
			HttpEntity entity = response.getEntity();
			fileSize = entity.getContentLength();
			System.out.println("fileSize----------->" + fileSize);
			InputStream is = entity.getContent();
			if (is == null) {
				// 680kb
				throw new RuntimeException("stream is null");
			}
			dFile1 = new File(Constants.filePath, 29 + ".mp4");
			FileOutputStream fos = new FileOutputStream(dFile1);
			int numread = 0;
			int readLen = 0;
			byte buf[] = new byte[128];
			do {
				numread = is.read(buf);
				readLen = readLen + numread;
				System.out.println("readLen----------->" + readLen);
				if (fileSize != -1 ) {
					updateProgressBar(readLen);
				}

				if (numread < 0) {
					break;
				}
				fos.write(buf, 0, numread);
			} while (true);
			is.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void apkGet() {
		try {
			DefaultHttpClient httpclient = new DefaultHttpClient();
			HttpResponse response;
			HttpPost httpost = new HttpPost(Constants.imageURL);

			List<NameValuePair> nvps = new ArrayList<NameValuePair>();

			nvps.add(new BasicNameValuePair("type", "demo"));
			nvps.add(new BasicNameValuePair("id", String.valueOf(29)));
			nvps.add(new BasicNameValuePair("fileId", "1"));

			httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));

			// This is always a final response
			response = httpclient.execute(httpost);

			HttpEntity entity = response.getEntity();

			fileSize = entity.getContentLength();
			System.out.println("fileSize----------->" + fileSize);

			InputStream is = entity.getContent();
			System.out.println("***************************" + is);

			dFile1 = new File(Constants.filePath, 29 + ".apk");

			outs1 = new FileOutputStream(dFile1);
			byte buf[] = new byte[1024];
			int numread = 0;

			int readLen = 0;

			do {
				// Start reading data from the URL stream
				numread = is.read(buf);
				readLen = readLen + numread;
				updateProgressBar(readLen);

				if (numread < 0) {
					System.out.println("the end !!!!");
					break;
				}
				outs1.write(buf, 0, numread);

			} while (true);
			// openFile(dFile1);
			System.out.println("_____apk download success!!!_____");
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	//更新进度条(当可以通过getContentLength来获取文件长度的情况下)
	public void updateProgressBar(int readLen) {
		Message msg = new Message();
		msg.what = 1;
		msg.getData().putInt("size", readLen);
		//通过主线程的handler通知主线程更新UI进度条的进度
		handler.sendMessage(msg);
	}

	/* 自定义setDataSource,由线程启动 */
	public void setDataSource1() throws Exception {

		URL myURL = new URL(downloadUrl);
		URLConnection conn = myURL.openConnection();
		conn.connect();
		InputStream is = conn.getInputStream();

		//当可以返回下载文件大小的情况下
		//方便后续显示进度条的总内容长度
		fileSize = conn.getContentLength();

		System.out.println("fileSize--------------->" + fileSize);

		//将下载文件保存到指定文件夹
		File myFileTemp = new File(Constants.filePath, "video."
				+ getFileExtension(downloadUrl));

		// the file to which this stream writes
		FileOutputStream fos = new FileOutputStream(myFileTemp);
		byte buf[] = new byte[128];
		int numread = 0;
		int readLen = 0;
		do {
			numread = is.read(buf);
			if (numread <= 0) {
				break;
			}
			fos.write(buf, 0, numread);
			readLen = readLen + numread;
			System.out.println("readLen----------->" + readLen);
			if(fileSize != -1)
				//不断的更新进度条
			updateProgressBar(readLen);

		} while (true);

		try {
			is.close();
			System.out.println("Download is over!!!!!!");
		} catch (Exception ex) {
			Log.e(TAG, "error: " + ex.getMessage(), ex);
		}
	}

	//下载特定类型文件
	public void setDataSource2() throws Exception {

		URL myURL = new URL(downloadUrl);

		HttpURLConnection conn = (HttpURLConnection) myURL.openConnection();
		conn.setConnectTimeout(6 * 1000);
		conn.setRequestMethod("GET");
		conn.setRequestProperty(
				"Accept",
				"image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*");
		conn.setRequestProperty("Accept-Language", "zh-CN");
		conn.setRequestProperty("Referer", downloadUrl);
		conn.setRequestProperty("Charset", "UTF-8");
		conn.setRequestProperty(
				"User-Agent",
				"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)");
		conn.setRequestProperty("Connection", "Keep-Alive");
		conn.connect();

		InputStream is = conn.getInputStream();

		fileSize = conn.getContentLength();

		System.out.println("fileSize--------------->" + fileSize);

		File myFileTemp = new File(Constants.filePath, "video."
				+ getFileExtension(downloadUrl));

		// the file to which this stream writes
		FileOutputStream fos = new FileOutputStream(myFileTemp);
		byte buf[] = new byte[128];
		int numread = 0;
		int readLen = 0;
		do {
			numread = is.read(buf);
			if (numread <= 0) {
				break;
			}
			fos.write(buf, 0, numread);
			readLen = readLen + numread;
			updateProgressBar(readLen);

		} while (true);

		try {
			is.close();
			System.out.println("Download is over!!!!!!");
		} catch (Exception ex) {
			Log.e(TAG, "error: " + ex.getMessage(), ex);
		}
	}

	// 取得加载文件的后缀名
	private String getFileExtension(String strFileName) {
		File myFile = new File(strFileName);
		String strFileExtension = myFile.getName();
		strFileExtension = (strFileExtension.substring(strFileExtension
				.lastIndexOf(".") + 1)).toLowerCase();

		if (strFileExtension == "") {
			/* 若无法顺利取得扩展名,默认为.dat */
			strFileExtension = "dat";
		}
		return strFileExtension;
	}
}

4.DirectoryHelper.java文件,这个文件是在判断SD卡是否存在需要的文件夹的判断,如果没有就新建目标文件夹
package cn.com;

import java.io.File;
import android.os.Environment;

public class DirectoryHelper
{
	//构建应用在SD卡上的相关文件夹
	public void getSdCardPath()
	{
		File sdcardDir = Environment.getExternalStorageDirectory();
		String path = sdcardDir.getParent() + sdcardDir.getName();
		Constants.filePath = path + java.io.File.separator + "VideoDownLoad";
		System.out.println("__________" + Constants.filePath);
		createFile();
	}

	public void createFile()
	{
		try
		{
			// 1.判断是否存在sdcard
			if (Environment.MEDIA_MOUNTED.equals(Environment
					.getExternalStorageState()))
			{
				// 目录
				System.out.println("_______create Directory________");
				File path = new File(Constants.filePath);
				if (!path.exists())
				{
					// 2.创建目录,可以在应用启动的时候创建
					path.mkdirs();
				}
				// 文件
				// File f = new File(fileDirectory + "/notes.txt");
				// if (!f.exists()) {
				// // 3.创建文件
				// f.createNewFile();
				// }

			}
		} catch (Exception e)
		{
			e.printStackTrace();
		}
	}
}


5.Constants.java这是个常量类:
package cn.com;

public class Constants {
       //这里的地址大家可以自己修改下
	public static String filePath = "";
	public final static String HOST = "********";
	public final static int PORT = **;
	public final static String HOST_IP = "http://" + HOST + ":" + PORT;
	public static String imageURL = HOST_IP + "****************";
	public final static String videoURL = HOST_IP
			+ "********";
}


6.MediaPlayerListener.java这个文件主要是在文件下载完成后的一些额外播放操作:
package cn.com;

import android.media.MediaPlayer;
import android.util.Log;

public class MediaPlayerListener {
	String TAG = "_____TAG_____";

	public MediaPlayerListener() {

	}

	public void setAllListener(MediaPlayer mMediaPlayer) {
		mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
			@Override
			public boolean onError(MediaPlayer mp, int what, int extra) {
				// TODO Auto-generated method stub
				Log.i(TAG, "Error on Listener, what: " + what + "extra: "
						+ extra);
				return false;
			}
		});

		mMediaPlayer
				.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() {
					@Override
					public void onBufferingUpdate(MediaPlayer mp, int percent) {
						// TODO Auto-generated method stub
						Log.i(TAG, "Update buffer: "
								+ Integer.toString(percent) + "%");
					}
				});

		mMediaPlayer
				.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
					@Override
					public void onCompletion(MediaPlayer mp) {
						// TODO Auto-generated method stub
						Log.i(TAG, "mMediaPlayer Listener Completed");
					}
				});

		mMediaPlayer
				.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
					@Override
					public void onPrepared(MediaPlayer mp) {
						// TODO Auto-generated method stub
						Log.i(TAG, "Prepared Listener");
					}
				});
	}
}


最后一个类我基本没有用上,也懒得删除掉了,因为后续完善代码的时候肯定也会用上;

7.main.xml文件很简单:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical" android:layout_width="fill_parent"
	android:layout_height="fill_parent">
	<ProgressBar android:layout_width="fill_parent"
		android:layout_height="18dip" style="?android:attr/progressBarStyleHorizontal"
		android:id="@+id/progressBar" />
	<TextView android:layout_width="fill_parent"
		android:layout_height="wrap_content" android:gravity="center"
		android:id="@+id/result" />
	<Button android:text="download" android:id="@+id/download"
		android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
</LinearLayout>



8.最后是配置文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
	package="cn.com" android:versionCode="1" android:versionName="1.0">
	<application android:icon="@drawable/icon" android:label="@string/app_name">
		<activity android:name=".DownLoadProgress" android:label="@string/app_name">
			<intent-filter>
				<action android:name="android.intent.action.MAIN" />
				<category android:name="android.intent.category.LAUNCHER" />
			</intent-filter>
		</activity>

	</application>
	<!-- 在SDCard中创建与删除文件权限 -->
	<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
	<!-- 往SDCard写入数据权限 -->
	<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
	<!-- 访问internet权限 -->
	<uses-permission android:name="android.permission.INTERNET" />
</manifest> 

以上就是全部代码,今天大部分时间都用来研究这个了,下班回家整理了,放上来给大家一起学习!!!
分享到:
评论
1 楼 ppfbsar 2015-08-05  
 

相关推荐

    rtthread + STM32F407VE + esp8266 +SD卡 从网络下载文件存到SD卡中

    在本文中,我们将深入探讨如何使用RTThread操作系统、STM32F407VE微控制器、ESP8226 Wi-Fi模块以及SD卡,实现从网络下载文件并将其存储到SD卡上的完整流程。这个项目涉及到嵌入式系统开发中的多个关键环节,包括网络...

    android 下载文件到SD卡

    本教程主要介绍如何在Android应用中实现网络文件的下载并保存到SD卡。 1. **Android权限设置** 在AndroidManifest.xml文件中,你需要添加写入外部存储的权限: ```xml ``` 如果你的应用目标API等级高于23,还...

    android中将下载的mp3文件存放到虚拟sd卡中

    本篇文章将详细介绍如何在Android中将下载的MP3文件存放到虚拟SD卡中。 首先,理解Android的存储权限至关重要。自Android 6.0(API级别23)开始,应用需要在运行时请求`WRITE_EXTERNAL_STORAGE`和`READ_EXTERNAL_...

    STM32实现SD卡的fatfs文件系统,写数据生成.csv文件

    TCP服务器可以监听特定端口,当收到客户端的数据请求时,接收到的数据可以被解析并写入SD卡上的.csv文件。TCP协议提供了可靠的数据传输,确保数据的完整性和顺序。 在TCP服务器编程中,我们需要处理连接建立、数据...

    从网络上下载安智apk到sd卡

    "从网络上下载安智apk到sd卡"这个主题涉及到的主要知识点包括网络请求、文件下载以及文件管理,尤其是针对Android平台的实践操作。下面我们将逐一展开这些知识点。 首先,**网络请求**是整个过程的起点。通常,我们...

    异步下载图片保存到sd卡

    在Android开发中,异步下载图片并保存到SD卡是一个常见的需求,特别是在构建涉及大量图像显示的应用时。这个过程涉及到网络请求、线程管理、内存和磁盘缓存策略等多个技术点。以下是对这个主题的详细阐述: 1. **...

    android SD卡文件浏览器

    同时,提供下载功能,将网络资源保存到SD卡,需要用到`java.net.URL`和`java.io.InputStream`等网络编程接口。 三、创建简单的SD卡文件浏览器 3.1 UI设计 使用Android Studio和XML布局文件,构建文件列表界面和...

    android之网络文件下载保存到SD_card上.pdf

    ### Android之网络文件下载保存到SD卡上的关键技术点 #### 一、概述 在Android开发过程中,有时我们需要从网络上下载文件并将其保存至SD卡上。本文将详细介绍这一过程中的关键技术点,包括如何获取SD卡状态、权限...

    Android播放SD卡视频文件

    遍历SD卡目录,获取到所有视频文件后,将文件路径和名称显示在列表中。用户选择文件后,传递选中的文件路径给视频播放器进行播放。 5. **错误处理和优化**:在实际开发中,需要考虑各种异常情况,如文件不存在、...

    zedboard的SD卡启动文件

    3. **写入SD卡**:使用特定的工具(如`dd`命令在Linux或Mac上,或者使用Win32DiskImager在Windows上)将"SD_IMAGE"文件写入SD卡。确保选择正确的设备,以免误操作导致数据丢失。 4. **插入SD卡**:将格式化并写入了...

    STM32F407+ESP8266图片传输并保存至SD卡

    在实际项目中,可能还需要考虑到**错误处理**和**异常情况**,例如网络中断、SD卡读写错误等。通过适当的错误检测机制和恢复策略,可以提高系统的稳定性和可靠性。 总的来说,STM32F407+ESP8266实现图片传输并保存...

    下载图片并保存到SD卡中

    标题中的“下载图片并保存到SD卡中”指的是在Android平台上,从网络上获取图片资源并将其存储到设备的外部存储(通常称为SD卡)的过程。这个过程涉及到网络请求、文件操作以及Android权限管理等技术。 首先,我们...

    Android手机SD卡文件浏览器

    "Android手机SD卡文件浏览器"就是这样一个工具,它允许用户方便地浏览、管理手机上的SD卡文件,为日常操作提供了极大的便利。本文将深入探讨这一应用的核心功能及其实现原理。 首先,Android系统的文件系统基于...

    从网络下载视频文件保存到本地

    在Android开发中,有时我们需要从网络下载视频文件并将其存储在用户的本地设备上,以便之后在VideoView组件中播放。这个过程涉及到多个关键步骤,包括网络请求、文件下载、存储管理和播放控制。以下是对这些知识点的...

    zynq修改uboot环境变量保存到sd卡.docx

    在Block Design中,确保网络接口的速率设置为100Mbps或1000Mbps,这主要影响网络连接的速度,但对保存环境变量到SD卡的过程没有直接影响。 接下来,通过Petalinux工具生成设备树源文件(Device Tree Source, DTS)...

    下载网络图片展示和保存到SD卡

    以上就是关于"下载网络图片展示和保存到SD卡"的主要技术点,这些知识点涵盖了网络请求、多线程、图片处理、文件操作以及权限管理等多个方面,是Android开发者必备的基础技能。在实际开发中,合理运用这些知识点可以...

    烧写ubuntu16根文件系统到SD卡.docx

    在本文中,我们将详细探讨如何将Ubuntu 16的根文件系统烧写到SD卡上,这个过程同样适用于其他Linux根文件系统的移植。这是一项在嵌入式开发中常见的任务,特别是对于使用NXP等处理器的开发板。下面是一步一步的详细...

    N72 原装内存卡文件和词典数据库安装包

    - 理解如何备份和恢复内存卡上的数据,以防意外丢失。 - 学习如何正确地移除和插入内存卡,避免损坏卡槽或数据丢失。 总的来说,这个“N72原装内存卡文件和词典数据库安装包”为用户提供了一个恢复手机功能和提升...

Global site tag (gtag.js) - Google Analytics