android实现文件下载功能

android 在网络上下载文件,供大家参考,具体内容如下

步骤 :

1.使用HTTP协议下载文件

- 创建一个HttpURLConnection对象 : HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
- 获取一个InputStream对象 : urlConn.getInputStream()
- 访问网络的权限 : android.permission.INTERNET

2.将下载的文件写入SDCARD
- 得到当前设备SD卡的目录 : Environment.getExternalStrageDirectory()
- 访问SD卡的权限 : android.permission.WRITE_EXTERNAL_STORAGE

代码 : 

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:paddingBottom="@dimen/activity_vertical_margin"
  android:paddingLeft="@dimen/activity_horizontal_margin"
  android:paddingRight="@dimen/activity_horizontal_margin"
  android:paddingTop="@dimen/activity_vertical_margin"
  tools:context=".MainActivity" > 

  <Button
    android:id="@+id/btn_txt"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="download lrc" /> 

  <Button
    android:id="@+id/btn_mp3"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@id/btn_txt"
    android:text="download mp3" /> 

</RelativeLayout>

MainActivity.java

package com.chay.download; 

import com.chay.utils.HttpDownloader; 

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button; 

public class MainActivity extends Activity { 

  String urlStr_txt = "http://192.168.56.1:8080/mp3/wan.lrc";
  String urlStr_mp3 = "http://192.168.56.1:8080/mp3/wan.mp3";
  String path = "mp3/";
  String fileName = "wan.mp3";
  private Button downloadTxtButton;
  private Button downloadMp3Button; 

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    downloadTxtButton = (Button) findViewById(R.id.btn_txt);
    downloadTxtButton.setOnClickListener(new DownloadTxtListener());
    downloadMp3Button = (Button) findViewById(R.id.btn_mp3);
    downloadMp3Button.setOnClickListener(new DownloadMp3Listener());
  } 

  //下载歌词文件按钮监听器
  class DownloadTxtListener implements OnClickListener {
    @Override
    public void onClick(View v) {
      Thread t = new DownloadTxtThread();
      t.start();
      System.out.println("txt--->");
    }
  }
  //下载歌词文件线程
  class DownloadTxtThread extends Thread{
    @Override
    public void run() {
      HttpDownloader httpDownloader = new HttpDownloader();
      String lrc = httpDownloader.download(urlStr_txt);
      System.out.println(lrc);
    }
  }
  //下载MP3文件按钮监听器
  class DownloadMp3Listener implements OnClickListener {
    @Override
    public void onClick(View v) {
      Thread h = new DownMp3Thread();
      h.start();
      System.out.println("mp3--->");
    }
  }
  //下载MP3文件线程
  class DownMp3Thread extends Thread{
    @Override
    public void run() {
      HttpDownloader httpDownloader = new HttpDownloader();
      int result = httpDownloader.downFile(urlStr_mp3, path, fileName);
      System.out.println(result);
    }
  }
}

工具类:

HttpDownloader.java

package com.chay.utils; 

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL; 

public class HttpDownloader {
  private URL url = null; 

  /**
   * 根据URL下载文件,前提是这个文件当中的内容是文本,函数的返回值就是文件当中的内容
   * 1.创建一个URL对象
   * 2.通过URL对象,创建一个HttpURLConnection对象
   * 3.得到InputStram
   * 4.从InputStream当中读取数据
   * @param urlStr
   * @return
   */
  public String download(String urlStr) {
    StringBuffer sb = new StringBuffer();
    String line = null;
    BufferedReader buffer = null;
    try {
      // 创建一个URL对象
      url = new URL(urlStr);
      // 创建一个Http连接
      HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
      // 使用IO流读取数据
      buffer = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));
      while ((line = buffer.readLine()) != null) {
        sb.append(line);
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      try {
        buffer.close();
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
    return sb.toString();
  } 

  /**
   * 该函数返回整形 -1:代表下载文件出错   0:代表下载文件成功   1:代表文件已经存在
   */
  public int downFile(String urlStr, String path, String fileName) {
    InputStream inputStream = null;
    try {
      FileUtils fileUtils = new FileUtils(); 

      if (fileUtils.isFileExist(path + fileName)) {
        return 1;
      } else {
        inputStream = getInputStreamFromUrl(urlStr);
        File resultFile = fileUtils.write2SDFromInput(path,fileName, inputStream);
        if (resultFile == null) {
          return -1;
        }
      }
    } catch (Exception e) {
      e.printStackTrace();
      return -1;
    } finally {
      try {
        inputStream.close();
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
    return 0;
  } 

  /**
   * 根据URL得到输入流
   *
   * @param urlStr
   * @return
   * @throws MalformedURLException
   * @throws IOException
   */
  public InputStream getInputStreamFromUrl(String urlStr)
      throws MalformedURLException, IOException {
    url = new URL(urlStr);
    HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
    InputStream inputStream = urlConn.getInputStream();
    return inputStream;
  }
}

FileUtils.java

package com.chay.utils; 

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream; 

import android.os.Environment; 

public class FileUtils {
  private String SDPATH; 

  public String getSDPATH() {
    return SDPATH;
  }
  public FileUtils() {
    //得到当前外部存储设备的目录
    // /SDCARD
    SDPATH = Environment.getExternalStorageDirectory() + "/";
  }
  /**
   * 在SD卡上创建文件
   *
   * @throws IOException
   */
  public File creatSDFile(String fileName) throws IOException {
    File file = new File(SDPATH + fileName);
    file.createNewFile();
    return file;
  } 

  /**
   * 在SD卡上创建目录
   *
   * @param dirName
   */
  public File creatSDDir(String dirName) {
    File dir = new File(SDPATH + dirName);
    dir.mkdirs();
    return dir;
  } 

  /**
   * 判断SD卡上的文件夹是否存在
   */
  public boolean isFileExist(String fileName){
    File file = new File(SDPATH + fileName);
    return file.exists();
  } 

  /**
   * 将一个InputStream里面的数据写入到SD卡中
   */
  public File write2SDFromInput(String path,String fileName,InputStream input){
    File file = null;
    OutputStream output = null;
    try{
      creatSDDir(path);
      file = creatSDFile(path + fileName);
      output = new FileOutputStream(file);
      byte buffer [] = new byte[4 * 1024];
      while((input.read(buffer)) != -1){
        output.write(buffer);
      }
      output.flush();
    }
    catch(Exception e){
      e.printStackTrace();
    }
    finally{
      try{
        output.close();
      }
      catch(Exception e){
        e.printStackTrace();
      }
    }
    return file;
  }
}

如果不能下载,请先将windows防火墙关闭。

您可能感兴趣的文章:

  • android中webview控件和javascript交互实例
  • Android WebView使用方法详解 附js交互调用方法
  • Android开发之WebView组件的使用解析
  • Android使用WebView播放flash的方法
  • Android实现WebView删除缓存的方法
  • Android中WebView图片实现自适应的方法
  • Android zip文件下载和解压实例
  • Android实现文件下载进度显示功能
  • Android 文件下载三种基本方式
  • Android 将文件下载到指定目录的实现代码
  • Android实现网络多线程文件下载
  • Android编程使用WebView实现文件下载功能的两种方法
(0)

相关推荐

  • Android 将文件下载到指定目录的实现代码

    废话不多说了额,直接给大家贴代码了,具体代码如下所示: /** * 下载指定路径的文件,并写入到指定的位置 * * @param dirName * @param fileName * @param urlStr * @return 返回0表示下载成功,返回1表示下载出错 */ public int downloadFile(String dirName, String fileName, String urlStr) { OutputStream output = null; try { //

  • Android编程使用WebView实现文件下载功能的两种方法

    本文实例讲述了Android编程使用WebView实现文件下载功能的两种方法.分享给大家供大家参考,具体如下: 在应用中,通常会使用到文件下载功能,一般我们都是写一个下载操作工具类,在异步任务中执行下载功能. 今天我们来看下如何使用WebView的文件下载功能! 方法1,自定义下载操作 1. 先来布局 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools=&qu

  • Android zip文件下载和解压实例

    下载:DownLoaderTask.java 复制代码 代码如下: package com.johnny.testzipanddownload; import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IO

  • Android实现WebView删除缓存的方法

    本文实例讲述了Android实现WebView删除缓存的方法.分享给大家供大家参考.具体如下: 删除保存于手机上的缓存: // clear the cache before time numDays private int clearCacheFolder(File dir, long numDays) { int deletedFiles = 0; if (dir!= null && dir.isDirectory()) { try { for (File child:dir.listF

  • Android中WebView图片实现自适应的方法

    本文实例讲述了Android中WebView图片实现自适应的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: WebSettings ws = tv.getSettings(); 加上这个属性后,html的图片就会以单列显示就不会变形占了别的位置 ws.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN); //让缩放显示的最小值为起始 webView.setInitialScale(5); // 设置支持缩放 webSettin

  • android中webview控件和javascript交互实例

    当我们要实现丰富的图文混排效果的时候,我们一般会使用webview,这是一个功能十分强大的的控件,来看看官方的解释: 复制代码 代码如下: A View that displays web pages. This class is the basis upon which you can roll your own web browser or simply display some online content within your Activity. It uses the WebKit

  • Android开发之WebView组件的使用解析

    在 Android 手机中内置了一款高性能 webkit 内核浏览器, SDK 中封装为一个叫做 WebView 组件. WebView 类是 WebKit 模块 Java 层的视图类,( 所有需要使用 Web 浏览功能的Android应用程序都要创建该视图对象显示和处理请求的网络资源.目前,WebKit 模块支持 HTTP.HTTPS.FTP 以及 javascript 请求. WebView 作为应用程序的 UI 接口,为用户提供了一系 列的网页浏览.用户交互接口,客户程序通过这些接口访问

  • Android WebView使用方法详解 附js交互调用方法

    目前很多Android app都内置了可以显示web页面的界面,会发现这个界面一般都是由一个叫做WebView的组件渲染出来的,学习该组件可以为你的app开发提升扩展性. 先说下WebView的一些优点: --可以直接显示和渲染web页面,直接显示网页 --webview可以直接用html文件(网络上或本地assets中)作布局 --和JavaScript交互调用 一.基本使用 首先layout中即为一个基本的简单控件: <WebView android:id="@+id/webView1

  • Android 文件下载三种基本方式

    一.自己封装URLConnection 连接请求类 public void downloadFile1() { try{ //下载路径,如果路径无效了,可换成你的下载路径 String url = "http://c.qijingonline.com/test.mkv"; String path = Environment.getExternalStorageDirectory().getAbsolutePath(); final long startTime = System.cur

  • Android实现网络多线程文件下载

    实现原理 (1)首先获得下载文件的长度,然后设置本地文件的长度. (2)根据文件长度和线程数计算每条线程下载的数据长度和下载位置. 如:文件的长度为6M,线程数为3,那么,每条线程下载的数据长度为2M,每条线程开始下载的位置如下图所示: (网上找的图) 例如10M大小,使用3个线程来下载, 线程下载的数据长度 (10%3 == 0 ? 10/3:10/3+1) ,第1,2个线程下载长度是4M,第三个线程下载长度为2M 下载开始位置:线程id*每条线程下载的数据长度 = ? 下载结束位置:(线程i

  • Android实现文件下载进度显示功能

    和大家一起分享一下学习经验,如何实现Android文件下载进度显示功能,希望对广大初学者有帮助. 先上效果图: 上方的蓝色进度条,会根据文件下载量的百分比进行加载,中部的文本控件用来现在文件下载的百分比,最下方的ImageView用来展示下载好的文件,项目的目的就是动态向用户展示文件的下载量. 下面看代码实现:首先是布局文件: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xm

  • Android使用WebView播放flash的方法

    本文实例讲述了Android使用WebView播放flash及判断是否安装flash插件的方法.分享给大家供大家参考.具体实现方法如下: 一.问题: 最近帮一个同学做一个项目,断断续续的一些知识点记录一下.一个页面中有一个WebView,用来播放swf,如果系统中未安装flash插件,必须提示用户到market中安装. 二.解决方法: 下面做一个demo,效果图如下: 图1: 图2: 图3: 首先布局文件,很简单: 复制代码 代码如下: <RelativeLayout xmlns:android

随机推荐