android 开发之文件下载

转载地址:http://blog.csdn.net/ITCEOjingying/article/details/6373016

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

  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

  1. package idea.org;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.view.View;
  5. import android.view.View.OnClickListener;
  6. import android.widget.Button;
  7. public class Android_Download extends Activity {
  8. private Button buttontxt;
  9. private Button buttonmp3;
  10. /** Called when the activity is first created. */
  11. @Override
  12. public void onCreate(Bundle savedInstanceState) {
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.main);
  15. buttontxt=(Button)findViewById(R.id.buttontxt);
  16. //为buttontxt添加单击事件监听器
  17. buttontxt.setOnClickListener(new OnClickListener(){
  18. /* (non-Javadoc)
  19. * @see android.view.View.OnClickListener#onClick(android.view.View)
  20. */
  21. @Override
  22. public void onClick(View v) {
  23. // TODO Auto-generated method stub
  24. //创建一个匿名线程用于下载文件
  25. new Thread()
  26. {
  27. public void run()
  28. {
  29. HttpDownloader httpDownloader=new HttpDownloader();
  30. //调用httpDownloader对象的重载方法download下载txt文件
  31. String txt=httpDownloader.download("http://172.24.24.20:8080/Android/a.txt");
  32. System.out.println(txt);
  33. }
  34. }.start();
  35. }
  36. });
  37. buttonmp3=(Button)findViewById(R.id.buttonmp3);
  38. //为buttonmp3添加单击事件监听器
  39. buttonmp3.setOnClickListener(new OnClickListener()
  40. {
  41. /* (non-Javadoc)
  42. * @see android.view.View.OnClickListener#onClick(android.view.View)
  43. */
  44. @Override
  45. public void onClick(View v) {
  46. // TODO Auto-generated method stub
  47. new Thread()
  48. {
  49. public void run()
  50. {
  51. try
  52. {
  53. HttpDownloader httpDownloader=new HttpDownloader();
  54. //调用httpDownloader对象的重载方法download下载mp3文件
  55. int result=httpDownloader.download("http://172.24.24.20:8080/Android/music.mp3","Android/","music.mp3");
  56. System.out.println(result);
  57. }
  58. catch(Exception e)
  59. {
  60. e.printStackTrace();
  61. }
  62. }
  63. }.start();
  64. }
  65. });
  66. }
  67. }

HttpDownloader.java

  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. StringBuffer stringbuffer=new StringBuffer();
  14. String line;
  15. BufferedReader bufferReader=null;
  16. try
  17. {
  18. //创建一个URL对象
  19. url=new URL(urlStr);
  20. //得到一个HttpURLConnection对象
  21. HttpURLConnection httpUrlConnection=(HttpURLConnection) url.openConnection();
  22. // 得到IO流,使用IO流读取数据
  23. bufferReader=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. // 该函数返回整形 -1:代表下载文件出错 ;0:代表下载文件成功; 1:代表文件已经存在
  36. public int download(String urlStr,String path,String fileName)
  37. {
  38. InputStream inputstream=null;
  39. FileUtils fileUtils=new FileUtils();
  40. if(fileUtils.isExist(path+fileName))
  41. return 1;
  42. else
  43. {
  44. try {
  45. inputstream=getFromUrl(urlStr);
  46. } catch (IOException e) {
  47. // TODO Auto-generated catch block
  48. e.printStackTrace();
  49. }
  50. File file=fileUtils.writeToSDPATHFromInput(path, fileName, inputstream);
  51. if(file!=null)
  52. return 0;
  53. else
  54. return -1;
  55. }
  56. }
  57. //根据url字符串得到输入流
  58. public InputStream getFromUrl(String urlStr) throws IOException
  59. {
  60. url=new URL(urlStr);
  61. HttpURLConnection httpUrlConnection=(HttpURLConnection) url.openConnection();
  62. InputStream input=httpUrlConnection.getInputStream();
  63. return input;
  64. }
  65. }

FileUtils.java

  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. public class FileUtils {
  9. private String SDPATH=null;
  10. public String getSDPATH()
  11. {
  12. return SDPATH;
  13. }
  14. public FileUtils()
  15. {
  16. //获得当前外部存储设备SD卡的目录
  17. SDPATH=Environment.getExternalStorageDirectory()+"/";
  18. }
  19. //创建文件
  20. public File createFile(String fileName) throws IOException
  21. {
  22. File file=new File(SDPATH+fileName);
  23. file.createNewFile();
  24. return file;
  25. }
  26. //创建目录
  27. public File createDir(String fileName) throws IOException
  28. {
  29. File dir=new File(SDPATH+fileName);
  30. dir.mkdir();
  31. return dir;
  32. }
  33. //判断文件是否存在
  34. public boolean isExist(String fileName)
  35. {
  36. File file=new File(SDPATH+fileName);
  37. return file.exists();
  38. }
  39. public File writeToSDPATHFromInput(String path,String fileName,InputStream inputstream)
  40. {
  41. File file=null;
  42. OutputStream outputstream=null;
  43. try
  44. {
  45. createDir(path);
  46. file=createFile(path+fileName);
  47. outputstream=new FileOutputStream(file);
  48. byte buffer[]=new byte[1024];
  49. //将输入流中的内容先输入到buffer中缓存,然后用输出流写到文件中
  50. while((inputstream.read(buffer))!=-1)
  51. {
  52. outputstream.write(buffer);
  53. }
  54. }
  55. catch(Exception e)
  56. {
  57. e.printStackTrace();
  58. }
  59. finally
  60. {
  61. try {
  62. outputstream.close();
  63. } catch (IOException e) {
  64. // TODO Auto-generated catch block
  65. e.printStackTrace();
  66. }
  67. }
  68. return file;
  69. }
  70. }

Android_Download Manifest.xml

  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. <application android:icon="@drawable/icon" android:label="@string/app_name">
  8. <activity android:name=".Android_Download"
  9. android:label="@string/app_name">
  10. <intent-filter>
  11. <action android:name="android.intent.action.MAIN" />
  12. <category android:name="android.intent.category.LAUNCHER" />
  13. </intent-filter>
  14. </activity>
  15. </application>
  16. <uses-permission android:name="android.permission.INTERNET"/>
  17. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  18. </manifest>

运行结果:

界面

依次点击两个Button按钮之后控制台输出的信息。

a.txt文件中有中文,由于log日志只能输出英文字符,所以会出现乱码。现在mp3时输出download()方法的返回值0,说明下载成功。

如果这个时候我们再点击点击一次buttonmp3按钮,会输出返回值1,说明文件已经存在。

我们可以通过DDMS视图中的工具File Explorer查看虚拟机中SD卡目录中我们下载的文件。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
回答: 在Android开发中,下载文件通常需要注意一些问题。首先,在Android 3.0之前的平台上,可以直接在Activity所在的线程中访问网络和下载文件。但是这样做可能会导致Activity界面无法及时响应用户操作,特别是在下载大文件或者网速较慢的情况下。因此,为了避免这个问题,我们需要将访问网络和下载文件的操作放在另外的线程中。\[2\] 其次,在下载过程中,我们可以使用Handler来更新UI界面。可以定义一个继承自Handler的DownloadHandler类,在其中处理下载过程中的消息。这个类可以使用弱引用来持有DownloadActivity的实例,以避免内存泄漏。在handleMessage方法中,可以根据消息的what字段来更新UI界面,比如显示下载进度。\[3\] 最后,在Android应用的清单文件中,需要添加一些权限声明,以便应用能够访问网络和写入外部存储。例如,可以使用<uses-permission>标签声明android.permission.INTERNET和android.permission.WRITE_EXTERNAL_STORAGE权限。这样,应用就可以在运行时进行网络下载操作了。\[1\] #### 引用[.reference_title] - *1* [Android开发之下载文件](https://blog.csdn.net/zhu530548851/article/details/38270735)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [android 开发文件下载](https://blog.csdn.net/shaojie0726/article/details/6849500)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Android开发文件下载流程](https://blog.csdn.net/weixin_42051691/article/details/105225301)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值