Android作为一个手机操作系统,在Android中访问网络是许多应用程序都必需的功能。用户也经常需要在应用程序中下载所需要的文件比如电子书,MP3格式的音乐文件,电影等。
Android文件下载的一般步骤:
1、创建一个HttpURLConnection的对象
URL url=new URL(urlStr);
HtttpURLConnection urlConn=(HtttpURLConnection)url.OpenConnection();
2、获取一个InputStream输入流对象
urlConn.getInputStream();
3、在AndroidManifest.xml中添加网络访问权限
<uses-permission android:name="android.permission.INTERNET"/>
4、在AndroidManifest.xml中加入访问SDCard的权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
5、创建文件流FileOutputStream,将从InputStream读出的数据写入到FileOutputStream。
需要注意的是在Android3.0之前的Android平台上可以直接Activity所在的线程中访问网络,下载网络上的文件。但是这样的话,如果下载的文件较大,或者网速比较慢的情况下,Activity界面就会处于无法及时响应用户操作的状态。Android3.0中如果在Activity所在的线程访问网络,调试执行时会出现异常信息:“android.os.NetworkOnMainThreadException”,无法获取有效的HttpURLConnection对象。所以我们需要把访问网络,下载文件的操作放在另外的线程中。
示例:
新建一个Android应用程序项目。在main.xml总添加两个Button:buttontxt、buttonmp3。点击分别下载txt和mp3文件。下载的txt文件直接将txt文本文件的内容直接输出到控制台。mp3文件保存到虚拟结的SD卡目录下的Android文件夹中。为了下载方便,项目中下载的a.txt和music.mp3文件均放在本机安装的tomcat服务器上webapps目录下的Android文件夹中。
main.xml
[xhtml] view plain copy
1. <?xml version="1.0" encoding="utf-8"?>
2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3. android:orientation="vertical"
4. android:layout_width="fill_parent"
5. android:layout_height="fill_parent"
6. >
7. <TextView
8. android:layout_width="fill_parent"
9. android:layout_height="wrap_content"
10. android:text="@string/hello"
11. />
12. <Button
13. android:id="@+id/buttontxt"
14. android:layout_width="300dp"
15. android:layout_height="wrap_content"
16. android:text="单击下载txt文件"
17. />
18. <Button
19. android:id="@+id/buttonmp3"
20. android:layout_width="300dp"
21. android:layout_height="wrap_content"
22. android:text="单击下载mp3文件"
23. />
24. </LinearLayout>
Android_Download.java
[java] view plain copy
1. package idea.org;
2.
3. import android.app.Activity;
4. import android.os.Bundle;
5. import android.view.View;
6. import android.view.View.OnClickListener;
7. import android.widget.Button;
8.
9. public class Android_Download extends Activity {
10. private Button buttontxt;
11. private Button buttonmp3;
12. /** Called when the activity is first created. */
13. @Override
14. public void onCreate(Bundle savedInstanceState) {
15. super.onCreate(savedInstanceState);
16. setContentView(R.layout.main);
17. buttontxt=(Button)findViewById(R.id.buttontxt);
18. //为buttontxt添加单击事件监听器
19. new OnClickListener(){
20.
21. /* (non-Javadoc)
22. * @see android.view.View.OnClickListener#onClick(android.view.View)
23. */
24. @Override
25. public void onClick(View v) {
26. // TODO Auto-generated method stub
27. //创建一个匿名线程用于下载文件
28. new Thread()
29. {
30. public void run()
31. {
32. new HttpDownloader();
33. //调用httpDownloader对象的重载方法download下载txt文件
34. "http://172.24.24.20:8080/Android/a.txt");
35. System.out.println(txt);
36. }
37. }.start();
38. }
39.
40. });
41. buttonmp3=(Button)findViewById(R.id.buttonmp3);
42. //为buttonmp3添加单击事件监听器
43. new OnClickListener()
44. {
45.
46. /* (non-Javadoc)
47. * @see android.view.View.OnClickListener#onClick(android.view.View)
48. */
49. @Override
50. public void onClick(View v) {
51. // TODO Auto-generated method stub
52. new Thread()
53. {
54. public void run()
55. {
56. try
57. {
58. new HttpDownloader();
59. //调用httpDownloader对象的重载方法download下载mp3文件
60. int result=httpDownloader.download("http://172.24.24.20:8080/Android/music.mp3","Android/","music.mp3");
61. System.out.println(result);
62. }
63. catch(Exception e)
64. {
65. e.printStackTrace();
66. }
67. }
68. }.start();
69.
70. }
71. });
72. }
73. }
HttpDownloader.java
[java] view plain copy
1. package idea.org;
2. import java.io.BufferedReader;
3. import java.io.File;
4. import java.io.IOException;
5. import java.io.InputStream;
6. import java.io.InputStreamReader;
7. import java.net.HttpURLConnection;
8. import java.net.URL;
9. public class HttpDownloader {
10. private URL url=null;
11. public String download(String urlStr)
12. {
13. new StringBuffer();
14. String line;
15. null;
16. try
17. {
18. //创建一个URL对象
19. new URL(urlStr);
20. //得到一个HttpURLConnection对象
21. HttpURLConnection httpUrlConnection=(HttpURLConnection) url.openConnection();
22. // 得到IO流,使用IO流读取数据
23. new BufferedReader(new InputStreamReader(httpUrlConnection.getInputStream()));
24. while((line=bufferReader.readLine())!=null)
25. {
26. stringbuffer.append(line);
27. }
28. }
29. catch(Exception e)
30. {
31. e.printStackTrace();
32. }
33. return stringbuffer.toString();
34.
35. }
36. // 该函数返回整形 -1:代表下载文件出错 ;0:代表下载文件成功; 1:代表文件已经存在
37. public int download(String urlStr,String path,String fileName)
38. {
39. null;
40. new FileUtils();
41. if(fileUtils.isExist(path+fileName))
42. return 1;
43. else
44. {
45. try {
46. inputstream=getFromUrl(urlStr);
47. catch (IOException e) {
48. // TODO Auto-generated catch block
49. e.printStackTrace();
50. }
51. File file=fileUtils.writeToSDPATHFromInput(path, fileName, inputstream);
52. if(file!=null)
53. return 0;
54. else
55. return -1;
56. }
57. }
58. //根据url字符串得到输入流
59. public InputStream getFromUrl(String urlStr) throws IOException
60. {
61. new URL(urlStr);
62. HttpURLConnection httpUrlConnection=(HttpURLConnection) url.openConnection();
63. InputStream input=httpUrlConnection.getInputStream();
64. return input;
65. }
66. }
FileUtils.java
[java] view plain copy
1. package idea.org;
2. import java.io.File;
3. import java.io.FileOutputStream;
4. import java.io.IOException;
5. import java.io.InputStream;
6. import java.io.OutputStream;
7. import android.os.Environment;
8.
9.
10. public class FileUtils {
11. private String SDPATH=null;
12. public String getSDPATH()
13. {
14. return SDPATH;
15. }
16. public FileUtils()
17. {
18. //获得当前外部存储设备SD卡的目录
19. "/";
20. }
21. //创建文件
22. public File createFile(String fileName) throws IOException
23. {
24. new File(SDPATH+fileName);
25. file.createNewFile();
26. return file;
27. }
28. //创建目录
29. public File createDir(String fileName) throws IOException
30. {
31. new File(SDPATH+fileName);
32. dir.mkdir();
33. return dir;
34. }
35. //判断文件是否存在
36. public boolean isExist(String fileName)
37. {
38. new File(SDPATH+fileName);
39. return file.exists();
40. }
41. public File writeToSDPATHFromInput(String path,String fileName,InputStream inputstream)
42. {
43. null;
44. null;
45. try
46. {
47. createDir(path);
48. file=createFile(path+fileName);
49. new FileOutputStream(file);
50. byte buffer[]=new byte[1024];
51. //将输入流中的内容先输入到buffer中缓存,然后用输出流写到文件中
52. while((inputstream.read(buffer))!=-1)
53. {
54. outputstream.write(buffer);
55. }
56. }
57. catch(Exception e)
58. {
59. e.printStackTrace();
60. }
61. finally
62. {
63. try {
64. outputstream.close();
65. catch (IOException e) {
66. // TODO Auto-generated catch block
67. e.printStackTrace();
68. }
69. }
70. return file;
71. }
72. }
Android_Download Manifest.xml
[xhtml] view plain copy
1. <?xml version="1.0" encoding="utf-8"?>
2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
3. package="idea.org"
4. android:versionCode="1"
5. android:versionName="1.0">
6. <uses-sdk android:minSdkVersion="11" />
7.
8. <application android:icon="@drawable/icon" android:label="@string/app_name">
9. <activity android:name=".Android_Download"
10. android:label="@string/app_name">
11. <intent-filter>
12. <action android:name="android.intent.action.MAIN" />
13. <category android:name="android.intent.category.LAUNCHER" />
14. </intent-filter>
15. </activity>
16.
17. </application>
18. <uses-permission android:name="android.permission.INTERNET"/>
19. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
20. </manifest>
运行结果:
界面
依次点击两个Button按钮之后控制台输出的信息。
a.txt文件中有中文,由于log日志只能输出英文字符,所以会出现乱码。现在mp3时输出download()方法的返回值0,说明下载成功。
如果这个时候我们再点击点击一次buttonmp3按钮,会输出返回值1,说明文件已经存在。
我们可以通过DDMS视图中的工具File Explorer查看虚拟机中SD卡目录中我们下载的文件。
Android作为一个手机操作系统,在Android中访问网络是许多应用程序都必需的功能。用户也经常需要在应用程序中下载所需要的文件比如电子书,MP3格式的音乐文件,电影等。
Android文件下载的一般步骤:
1、创建一个HttpURLConnection的对象
URL url=new URL(urlStr);
HtttpURLConnection urlConn=(HtttpURLConnection)url.OpenConnection();
2、获取一个InputStream输入流对象
urlConn.getInputStream();
3、在AndroidManifest.xml中添加网络访问权限
<uses-permission android:name="android.permission.INTERNET"/>
4、在AndroidManifest.xml中加入访问SDCard的权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
5、创建文件流FileOutputStream,将从InputStream读出的数据写入到FileOutputStream。
需要注意的是在Android3.0之前的Android平台上可以直接Activity所在的线程中访问网络,下载网络上的文件。但是这样的话,如果下载的文件较大,或者网速比较慢的情况下,Activity界面就会处于无法及时响应用户操作的状态。Android3.0中如果在Activity所在的线程访问网络,调试执行时会出现异常信息:“android.os.NetworkOnMainThreadException”,无法获取有效的HttpURLConnection对象。所以我们需要把访问网络,下载文件的操作放在另外的线程中。
示例:
新建一个Android应用程序项目。在main.xml总添加两个Button:buttontxt、buttonmp3。点击分别下载txt和mp3文件。下载的txt文件直接将txt文本文件的内容直接输出到控制台。mp3文件保存到虚拟结的SD卡目录下的Android文件夹中。为了下载方便,项目中下载的a.txt和music.mp3文件均放在本机安装的tomcat服务器上webapps目录下的Android文件夹中。
main.xml
[xhtml] view plain copy
1. <?xml version="1.0" encoding="utf-8"?>
2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3. android:orientation="vertical"
4. android:layout_width="fill_parent"
5. android:layout_height="fill_parent"
6. >
7. <TextView
8. android:layout_width="fill_parent"
9. android:layout_height="wrap_content"
10. android:text="@string/hello"
11. />
12. <Button
13. android:id="@+id/buttontxt"
14. android:layout_width="300dp"
15. android:layout_height="wrap_content"
16. android:text="单击下载txt文件"
17. />
18. <Button
19. android:id="@+id/buttonmp3"
20. android:layout_width="300dp"
21. android:layout_height="wrap_content"
22. android:text="单击下载mp3文件"
23. />
24. </LinearLayout>
Android_Download.java
[java] view plain copy
1. package idea.org;
2.
3. import android.app.Activity;
4. import android.os.Bundle;
5. import android.view.View;
6. import android.view.View.OnClickListener;
7. import android.widget.Button;
8.
9. public class Android_Download extends Activity {
10. private Button buttontxt;
11. private Button buttonmp3;
12. /** Called when the activity is first created. */
13. @Override
14. public void onCreate(Bundle savedInstanceState) {
15. super.onCreate(savedInstanceState);
16. setContentView(R.layout.main);
17. buttontxt=(Button)findViewById(R.id.buttontxt);
18. //为buttontxt添加单击事件监听器
19. new OnClickListener(){
20.
21. /* (non-Javadoc)
22. * @see android.view.View.OnClickListener#onClick(android.view.View)
23. */
24. @Override
25. public void onClick(View v) {
26. // TODO Auto-generated method stub
27. //创建一个匿名线程用于下载文件
28. new Thread()
29. {
30. public void run()
31. {
32. new HttpDownloader();
33. //调用httpDownloader对象的重载方法download下载txt文件
34. "http://172.24.24.20:8080/Android/a.txt");
35. System.out.println(txt);
36. }
37. }.start();
38. }
39.
40. });
41. buttonmp3=(Button)findViewById(R.id.buttonmp3);
42. //为buttonmp3添加单击事件监听器
43. new OnClickListener()
44. {
45.
46. /* (non-Javadoc)
47. * @see android.view.View.OnClickListener#onClick(android.view.View)
48. */
49. @Override
50. public void onClick(View v) {
51. // TODO Auto-generated method stub
52. new Thread()
53. {
54. public void run()
55. {
56. try
57. {
58. new HttpDownloader();
59. //调用httpDownloader对象的重载方法download下载mp3文件
60. int result=httpDownloader.download("http://172.24.24.20:8080/Android/music.mp3","Android/","music.mp3");
61. System.out.println(result);
62. }
63. catch(Exception e)
64. {
65. e.printStackTrace();
66. }
67. }
68. }.start();
69.
70. }
71. });
72. }
73. }
HttpDownloader.java
[java] view plain copy
1. package idea.org;
2. import java.io.BufferedReader;
3. import java.io.File;
4. import java.io.IOException;
5. import java.io.InputStream;
6. import java.io.InputStreamReader;
7. import java.net.HttpURLConnection;
8. import java.net.URL;
9. public class HttpDownloader {
10. private URL url=null;
11. public String download(String urlStr)
12. {
13. new StringBuffer();
14. String line;
15. null;
16. try
17. {
18. //创建一个URL对象
19. new URL(urlStr);
20. //得到一个HttpURLConnection对象
21. HttpURLConnection httpUrlConnection=(HttpURLConnection) url.openConnection();
22. // 得到IO流,使用IO流读取数据
23. new BufferedReader(new InputStreamReader(httpUrlConnection.getInputStream()));
24. while((line=bufferReader.readLine())!=null)
25. {
26. stringbuffer.append(line);
27. }
28. }
29. catch(Exception e)
30. {
31. e.printStackTrace();
32. }
33. return stringbuffer.toString();
34.
35. }
36. // 该函数返回整形 -1:代表下载文件出错 ;0:代表下载文件成功; 1:代表文件已经存在
37. public int download(String urlStr,String path,String fileName)
38. {
39. null;
40. new FileUtils();
41. if(fileUtils.isExist(path+fileName))
42. return 1;
43. else
44. {
45. try {
46. inputstream=getFromUrl(urlStr);
47. catch (IOException e) {
48. // TODO Auto-generated catch block
49. e.printStackTrace();
50. }
51. File file=fileUtils.writeToSDPATHFromInput(path, fileName, inputstream);
52. if(file!=null)
53. return 0;
54. else
55. return -1;
56. }
57. }
58. //根据url字符串得到输入流
59. public InputStream getFromUrl(String urlStr) throws IOException
60. {
61. new URL(urlStr);
62. HttpURLConnection httpUrlConnection=(HttpURLConnection) url.openConnection();
63. InputStream input=httpUrlConnection.getInputStream();
64. return input;
65. }
66. }
FileUtils.java
[java] view plain copy
1. package idea.org;
2. import java.io.File;
3. import java.io.FileOutputStream;
4. import java.io.IOException;
5. import java.io.InputStream;
6. import java.io.OutputStream;
7. import android.os.Environment;
8.
9.
10. public class FileUtils {
11. private String SDPATH=null;
12. public String getSDPATH()
13. {
14. return SDPATH;
15. }
16. public FileUtils()
17. {
18. //获得当前外部存储设备SD卡的目录
19. "/";
20. }
21. //创建文件
22. public File createFile(String fileName) throws IOException
23. {
24. new File(SDPATH+fileName);
25. file.createNewFile();
26. return file;
27. }
28. //创建目录
29. public File createDir(String fileName) throws IOException
30. {
31. new File(SDPATH+fileName);
32. dir.mkdir();
33. return dir;
34. }
35. //判断文件是否存在
36. public boolean isExist(String fileName)
37. {
38. new File(SDPATH+fileName);
39. return file.exists();
40. }
41. public File writeToSDPATHFromInput(String path,String fileName,InputStream inputstream)
42. {
43. null;
44. null;
45. try
46. {
47. createDir(path);
48. file=createFile(path+fileName);
49. new FileOutputStream(file);
50. byte buffer[]=new byte[1024];
51. //将输入流中的内容先输入到buffer中缓存,然后用输出流写到文件中
52. while((inputstream.read(buffer))!=-1)
53. {
54. outputstream.write(buffer);
55. }
56. }
57. catch(Exception e)
58. {
59. e.printStackTrace();
60. }
61. finally
62. {
63. try {
64. outputstream.close();
65. catch (IOException e) {
66. // TODO Auto-generated catch block
67. e.printStackTrace();
68. }
69. }
70. return file;
71. }
72. }
Android_Download Manifest.xml
[xhtml] view plain copy
1. <?xml version="1.0" encoding="utf-8"?>
2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
3. package="idea.org"
4. android:versionCode="1"
5. android:versionName="1.0">
6. <uses-sdk android:minSdkVersion="11" />
7.
8. <application android:icon="@drawable/icon" android:label="@string/app_name">
9. <activity android:name=".Android_Download"
10. android:label="@string/app_name">
11. <intent-filter>
12. <action android:name="android.intent.action.MAIN" />
13. <category android:name="android.intent.category.LAUNCHER" />
14. </intent-filter>
15. </activity>
16.
17. </application>
18. <uses-permission android:name="android.permission.INTERNET"/>
19. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
20. </manifest>
运行结果:
界面
依次点击两个Button按钮之后控制台输出的信息。
a.txt文件中有中文,由于log日志只能输出英文字符,所以会出现乱码。现在mp3时输出download()方法的返回值0,说明下载成功。
如果这个时候我们再点击点击一次buttonmp3按钮,会输出返回值1,说明文件已经存在。
我们可以通过DDMS视图中的工具File Explorer查看虚拟机中SD卡目录中我们下载的文件。