权限
访问网络权限+外部存储权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<Button
android:id="@+id/download"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="47dp"
android:text="download" />
导包
import java.io.BufferedInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.Toast;
onCreate方法
download=(Button)findViewById(R.id.download);
download.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Toast.makeText(MainActivity.this,"开始下载!",Toast.LENGTH_SHORT).show();
DownloadThread t = new DownloadThread(); // 调用自己写的下载类,执行下载任务
t.start();
}
});
下载方法实现
class DownloadThread extends Thread{  // 该线程类封装任务:实现下载和写入sd卡,自己写的
  @Override
  public void run() {
    
    String urlpath ="https://lgch.xyz"; // 自定义资源地址
    
    InputStream inputStream = null;
    BufferedInputStream bis = null;
    FileOutputStream fos = null;
    try{    
      URL url = new URL(urlpath);                 // 获取 URL对象
      URLConnection con = url.openConnection();   // 获取 URL链接
      
      inputStream = con.getInputStream();      // 获取输入流用于读取/下载数据
       bis = new BufferedInputStream(inputStream); // 缓冲流 提高效率
      
      String state = Environment.getExternalStorageState();  // 获取sd卡状态
      
      if(state.equals(Environment.MEDIA_MOUNTED)){ // 当sd卡可以存储时
                    // /storage/sdcard/mywebdata 获取外部存储路径
        String path=Environment.getExternalStorageDirectory()+"/mywebdata";
        Log.e("地址", path);
        fos = new FileOutputStream(path); // 输出流 写入
        
        int i;
        while((i=inputStream.read())!=-1){ // 读不到的时候,值是-1,能读到就写入
          fos.write(i);          // 写入文件
        }
        Log.e("读取结束", "==================================");
        
      }else{
        Toast.makeText(MainActivity.this, "CD 卡不存在",Toast.LENGTH_LONG);
      }
    }catch(Exception e){
      Log.e("MainActivity",e.getMessage()); 
    }finally{
      try {
        bis.close();
        fos.close();    //关流
      } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
  }
  }                










